Xem trên TensorFlow.org | Chạy trong Google Colab | Xem nguồn trên GitHub | Tải xuống sổ ghi chép |
Hướng dẫn này chỉ cho bạn cách giải quyết vấn đề phân loại Iris trong TensorFlow bằng cách sử dụng Công cụ ước tính. Công cụ ước tính là một đại diện cấp cao của TensorFlow kế thừa của một mô hình hoàn chỉnh. Để biết thêm chi tiết, hãy xem Công cụ ước tính .
Điều đầu tiên trước tiên
Để bắt đầu, trước tiên bạn sẽ nhập TensorFlow và một số thư viện bạn sẽ cần.
import tensorflow as tf
import pandas as pd
Bộ dữ liệu
Chương trình mẫu trong tài liệu này xây dựng và thử nghiệm một mô hình phân loại hoa Iris thành ba loài khác nhau dựa trên kích thước của các lá đài và cánh hoa của chúng.
Bạn sẽ đào tạo một mô hình bằng cách sử dụng tập dữ liệu Iris. Tập dữ liệu Iris chứa bốn đặc điểm và một nhãn . Bốn đặc điểm xác định các đặc điểm thực vật sau đây của từng hoa Iris:
- chiều dài đài hoa
- chiều rộng đài hoa
- chiều dài cánh hoa
- chiều rộng cánh hoa
Dựa trên thông tin này, bạn có thể xác định một vài hằng số hữu ích để phân tích cú pháp dữ liệu:
CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']
SPECIES = ['Setosa', 'Versicolor', 'Virginica']
Tiếp theo, tải xuống và phân tích cú pháp tập dữ liệu Iris bằng Keras và Pandas. Lưu ý rằng bạn giữ các bộ dữ liệu riêng biệt để đào tạo và thử nghiệm.
train_path = tf.keras.utils.get_file(
"iris_training.csv", "https://storage.googleapis.com/download.tensorflow.org/data/iris_training.csv")
test_path = tf.keras.utils.get_file(
"iris_test.csv", "https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv")
train = pd.read_csv(train_path, names=CSV_COLUMN_NAMES, header=0)
test = pd.read_csv(test_path, names=CSV_COLUMN_NAMES, header=0)
Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/iris_training.csv 16384/2194 [================================================================================================================================================================================================================================] - 0s 0us/step Downloading data from https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv 16384/573 [=========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================] - 0s 0us/step
Bạn có thể kiểm tra dữ liệu của mình để thấy rằng bạn có bốn cột tính năng float và một nhãn int32.
train.head()
Đối với mỗi bộ dữ liệu, hãy tách các nhãn ra, mà mô hình sẽ được đào tạo để dự đoán.
train_y = train.pop('Species')
test_y = test.pop('Species')
# The label column has now been removed from the features.
train.head()
Tổng quan về lập trình với Công cụ ước tính
Bây giờ bạn đã thiết lập dữ liệu, bạn có thể xác định mô hình bằng Công cụ ước tính TensorFlow. Công cụ ước tính là bất kỳ lớp nào bắt nguồn từ tf.estimator.Estimator
. TensorFlow cung cấp một tập hợp tf.estimator
(ví dụ: LinearRegressor
) để triển khai các thuật toán ML phổ biến. Ngoài những điều đó, bạn có thể viết Công cụ ước tính tùy chỉnh của riêng mình. Bạn nên sử dụng Công cụ ước tính được tạo sẵn khi mới bắt đầu.
Để viết một chương trình TensorFlow dựa trên các Công cụ ước tính được tạo sẵn, bạn phải thực hiện các tác vụ sau:
- Tạo một hoặc nhiều hàm đầu vào.
- Xác định các cột tính năng của mô hình.
- Khởi tạo Công cụ ước tính, chỉ định các cột tính năng và các siêu tham số khác nhau.
- Gọi một hoặc nhiều phương thức trên đối tượng Công cụ ước tính, chuyển hàm đầu vào thích hợp làm nguồn dữ liệu.
Hãy xem những nhiệm vụ đó được thực hiện như thế nào để phân loại Iris.
Tạo các chức năng đầu vào
Bạn phải tạo các hàm đầu vào để cung cấp dữ liệu cho đào tạo, đánh giá và dự đoán.
Hàm đầu vào là một hàm trả về đối tượng tf.data.Dataset
, đối tượng này xuất ra bộ hai phần tử sau:
-
features
- Một từ điển Python trong đó:- Mỗi khóa là tên của một đối tượng địa lý.
- Mỗi giá trị là một mảng chứa tất cả các giá trị của đối tượng địa lý đó.
-
label
- Một mảng chứa các giá trị của nhãn cho mọi ví dụ.
Chỉ để chứng minh định dạng của hàm đầu vào, đây là một cách triển khai đơn giản:
def input_evaluation_set():
features = {'SepalLength': np.array([6.4, 5.0]),
'SepalWidth': np.array([2.8, 2.3]),
'PetalLength': np.array([5.6, 3.3]),
'PetalWidth': np.array([2.2, 1.0])}
labels = np.array([2, 1])
return features, labels
Hàm nhập của bạn có thể tạo từ điển features
và danh sách label
theo bất kỳ cách nào bạn muốn. Tuy nhiên, bạn nên sử dụng API tập dữ liệu của TensorFlow, API này có thể phân tích cú pháp tất cả các loại dữ liệu.
Dataset API có thể xử lý rất nhiều trường hợp phổ biến cho bạn. Ví dụ: sử dụng Dataset API, bạn có thể dễ dàng đọc song song các bản ghi từ một bộ sưu tập lớn các tệp và nối chúng thành một luồng duy nhất.
Để giữ cho mọi thứ đơn giản trong ví dụ này, bạn sẽ tải dữ liệu bằng gấu trúc và xây dựng một đường dẫn đầu vào từ dữ liệu trong bộ nhớ này:
def input_fn(features, labels, training=True, batch_size=256):
"""An input function for training or evaluating"""
# Convert the inputs to a Dataset.
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
# Shuffle and repeat if you are in training mode.
if training:
dataset = dataset.shuffle(1000).repeat()
return dataset.batch(batch_size)
Xác định các cột tính năng
Cột tính năng là một đối tượng mô tả cách mô hình sử dụng dữ liệu đầu vào thô từ từ điển tính năng. Khi bạn xây dựng mô hình Công cụ ước tính, bạn chuyển cho nó một danh sách các cột tính năng mô tả từng tính năng bạn muốn mô hình sử dụng. Mô-đun tf.feature_column
cung cấp nhiều tùy chọn để biểu diễn dữ liệu vào mô hình.
Đối với Iris, 4 đối tượng địa lý thô là các giá trị số, vì vậy bạn sẽ xây dựng danh sách các cột đối tượng địa lý để yêu cầu mô hình Công cụ ước tính đại diện cho từng đối tượng trong số bốn đối tượng địa lý dưới dạng giá trị dấu phẩy động 32-bit. Do đó, mã để tạo cột tính năng là:
# Feature columns describe how to use the input.
my_feature_columns = []
for key in train.keys():
my_feature_columns.append(tf.feature_column.numeric_column(key=key))
Các cột tính năng có thể phức tạp hơn nhiều so với các cột được hiển thị ở đây. Bạn có thể đọc thêm về Cột tính năng trong hướng dẫn này .
Bây giờ bạn đã có mô tả về cách bạn muốn mô hình đại diện cho các tính năng thô, bạn có thể xây dựng công cụ ước tính.
Khởi tạo một công cụ ước tính
Bài toán Iris là một bài toán phân loại cổ điển. May mắn thay, TensorFlow cung cấp một số Công cụ ước tính trình phân loại được tạo sẵn, bao gồm:
-
tf.estimator.DNNClassifier
cho các mô hình sâu thực hiện phân loại nhiều lớp. -
tf.estimator.DNNLinearCombinedClassifier
cho các mô hình rộng và sâu. -
tf.estimator.LinearClassifier
cho bộ phân loại dựa trên mô hình tuyến tính.
Đối với vấn đề Iris, tf.estimator.DNNClassifier
có vẻ là lựa chọn tốt nhất. Đây là cách bạn khởi tạo Công cụ ước tính này:
# Build a DNN with 2 hidden layers with 30 and 10 hidden nodes each.
classifier = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
# Two hidden layers of 30 and 10 nodes respectively.
hidden_units=[30, 10],
# The model must choose between 3 classes.
n_classes=3)
INFO:tensorflow:Using default config. WARNING:tensorflow:Using temporary folder as model directory: /tmp/tmpxdgumb2t INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpxdgumb2t', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}
Đào tạo, Đánh giá và Dự đoán
Bây giờ bạn đã có đối tượng Công cụ ước tính, bạn có thể gọi các phương thức để thực hiện những việc sau:
- Huấn luyện mô hình.
- Đánh giá mô hình được đào tạo.
- Sử dụng mô hình được đào tạo để đưa ra dự đoán.
Đào tạo mô hình
Huấn luyện mô hình bằng cách gọi phương thức train
của Công cụ ước tính như sau:
# Train the Model.
classifier.train(
input_fn=lambda: input_fn(train, train_y, training=True),
steps=5000)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:397: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version. Instructions for updating: Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts. INFO:tensorflow:Calling model_fn. WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/keras/optimizer_v2/adagrad.py:84: calling Constant.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version. Instructions for updating: Call initializer instance with the dtype argument instead of passing it to the constructor INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into /tmp/tmpxdgumb2t/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 1.6787335, step = 0 INFO:tensorflow:global_step/sec: 305.625 INFO:tensorflow:loss = 1.1945828, step = 100 (0.328 sec) INFO:tensorflow:global_step/sec: 375.48 INFO:tensorflow:loss = 1.0221117, step = 200 (0.266 sec) INFO:tensorflow:global_step/sec: 376.21 INFO:tensorflow:loss = 0.9240805, step = 300 (0.266 sec) INFO:tensorflow:global_step/sec: 377.968 INFO:tensorflow:loss = 0.85917354, step = 400 (0.265 sec) INFO:tensorflow:global_step/sec: 376.297 INFO:tensorflow:loss = 0.81545967, step = 500 (0.265 sec) INFO:tensorflow:global_step/sec: 367.549 INFO:tensorflow:loss = 0.7771524, step = 600 (0.272 sec) INFO:tensorflow:global_step/sec: 378.887 INFO:tensorflow:loss = 0.74371505, step = 700 (0.264 sec) INFO:tensorflow:global_step/sec: 379.26 INFO:tensorflow:loss = 0.717993, step = 800 (0.264 sec) INFO:tensorflow:global_step/sec: 370.102 INFO:tensorflow:loss = 0.6952705, step = 900 (0.270 sec) INFO:tensorflow:global_step/sec: 373.034 INFO:tensorflow:loss = 0.68044865, step = 1000 (0.268 sec) INFO:tensorflow:global_step/sec: 372.193 INFO:tensorflow:loss = 0.65181077, step = 1100 (0.269 sec) INFO:tensorflow:global_step/sec: 339.238 INFO:tensorflow:loss = 0.6319051, step = 1200 (0.295 sec) INFO:tensorflow:global_step/sec: 334.252 INFO:tensorflow:loss = 0.63433766, step = 1300 (0.299 sec) INFO:tensorflow:global_step/sec: 343.436 INFO:tensorflow:loss = 0.61748827, step = 1400 (0.291 sec) INFO:tensorflow:global_step/sec: 346.575 INFO:tensorflow:loss = 0.606356, step = 1500 (0.288 sec) INFO:tensorflow:global_step/sec: 351.362 INFO:tensorflow:loss = 0.59807724, step = 1600 (0.285 sec) INFO:tensorflow:global_step/sec: 366.628 INFO:tensorflow:loss = 0.5832784, step = 1700 (0.273 sec) INFO:tensorflow:global_step/sec: 367.034 INFO:tensorflow:loss = 0.5664347, step = 1800 (0.273 sec) INFO:tensorflow:global_step/sec: 372.339 INFO:tensorflow:loss = 0.5684726, step = 1900 (0.268 sec) INFO:tensorflow:global_step/sec: 368.957 INFO:tensorflow:loss = 0.56011164, step = 2000 (0.271 sec) INFO:tensorflow:global_step/sec: 373.128 INFO:tensorflow:loss = 0.5483226, step = 2100 (0.268 sec) INFO:tensorflow:global_step/sec: 377.334 INFO:tensorflow:loss = 0.5447233, step = 2200 (0.265 sec) INFO:tensorflow:global_step/sec: 370.421 INFO:tensorflow:loss = 0.5358016, step = 2300 (0.270 sec) INFO:tensorflow:global_step/sec: 367.076 INFO:tensorflow:loss = 0.53145075, step = 2400 (0.273 sec) INFO:tensorflow:global_step/sec: 373.596 INFO:tensorflow:loss = 0.50931674, step = 2500 (0.268 sec) INFO:tensorflow:global_step/sec: 368.939 INFO:tensorflow:loss = 0.5253717, step = 2600 (0.271 sec) INFO:tensorflow:global_step/sec: 354.814 INFO:tensorflow:loss = 0.52558273, step = 2700 (0.282 sec) INFO:tensorflow:global_step/sec: 372.243 INFO:tensorflow:loss = 0.51422054, step = 2800 (0.269 sec) INFO:tensorflow:global_step/sec: 366.891 INFO:tensorflow:loss = 0.49747026, step = 2900 (0.272 sec) INFO:tensorflow:global_step/sec: 370.952 INFO:tensorflow:loss = 0.49974674, step = 3000 (0.270 sec) INFO:tensorflow:global_step/sec: 364.158 INFO:tensorflow:loss = 0.4978399, step = 3100 (0.275 sec) INFO:tensorflow:global_step/sec: 365.383 INFO:tensorflow:loss = 0.5030147, step = 3200 (0.273 sec) INFO:tensorflow:global_step/sec: 366.791 INFO:tensorflow:loss = 0.4772169, step = 3300 (0.273 sec) INFO:tensorflow:global_step/sec: 372.438 INFO:tensorflow:loss = 0.46993533, step = 3400 (0.269 sec) INFO:tensorflow:global_step/sec: 371.25 INFO:tensorflow:loss = 0.47242266, step = 3500 (0.269 sec) INFO:tensorflow:global_step/sec: 369.725 INFO:tensorflow:loss = 0.46513358, step = 3600 (0.271 sec) INFO:tensorflow:global_step/sec: 371.002 INFO:tensorflow:loss = 0.4762191, step = 3700 (0.270 sec) INFO:tensorflow:global_step/sec: 369.304 INFO:tensorflow:loss = 0.44923267, step = 3800 (0.271 sec) INFO:tensorflow:global_step/sec: 369.344 INFO:tensorflow:loss = 0.45467538, step = 3900 (0.271 sec) INFO:tensorflow:global_step/sec: 375.58 INFO:tensorflow:loss = 0.46056622, step = 4000 (0.266 sec) INFO:tensorflow:global_step/sec: 347.461 INFO:tensorflow:loss = 0.4489282, step = 4100 (0.288 sec) INFO:tensorflow:global_step/sec: 368.435 INFO:tensorflow:loss = 0.45647347, step = 4200 (0.272 sec) INFO:tensorflow:global_step/sec: 369.159 INFO:tensorflow:loss = 0.4444633, step = 4300 (0.271 sec) INFO:tensorflow:global_step/sec: 371.995 INFO:tensorflow:loss = 0.44425523, step = 4400 (0.269 sec) INFO:tensorflow:global_step/sec: 373.586 INFO:tensorflow:loss = 0.44025964, step = 4500 (0.268 sec) INFO:tensorflow:global_step/sec: 373.136 INFO:tensorflow:loss = 0.44341013, step = 4600 (0.269 sec) INFO:tensorflow:global_step/sec: 369.751 INFO:tensorflow:loss = 0.42856425, step = 4700 (0.269 sec) INFO:tensorflow:global_step/sec: 364.219 INFO:tensorflow:loss = 0.44144967, step = 4800 (0.275 sec) INFO:tensorflow:global_step/sec: 372.675 INFO:tensorflow:loss = 0.42951846, step = 4900 (0.268 sec) INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 5000... INFO:tensorflow:Saving checkpoints for 5000 into /tmp/tmpxdgumb2t/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 5000... INFO:tensorflow:Loss for final step: 0.42713496. <tensorflow_estimator.python.estimator.canned.dnn.DNNClassifierV2 at 0x7fad05e33910>
Lưu ý rằng bạn kết thúc cuộc gọi input_fn
của mình trong lambda
để nắm bắt các đối số trong khi cung cấp một hàm đầu vào không nhận đối số, như Công cụ ước tính mong đợi. Đối số steps
cho biết phương pháp ngừng huấn luyện sau một số bước huấn luyện.
Đánh giá mô hình được đào tạo
Bây giờ mô hình đã được đào tạo, bạn có thể nhận được một số thống kê về hiệu suất của nó. Khối mã sau đây đánh giá độ chính xác của mô hình được đào tạo trên dữ liệu thử nghiệm:
eval_result = classifier.evaluate(
input_fn=lambda: input_fn(test, test_y, training=False))
print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Starting evaluation at 2022-01-26T06:41:28 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpxdgumb2t/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Inference Time : 0.40087s INFO:tensorflow:Finished evaluation at 2022-01-26-06:41:28 INFO:tensorflow:Saving dict for global step 5000: accuracy = 0.8666667, average_loss = 0.49953422, global_step = 5000, loss = 0.49953422 INFO:tensorflow:Saving 'checkpoint_path' summary for global step 5000: /tmp/tmpxdgumb2t/model.ckpt-5000 Test set accuracy: 0.867
Không giống như phương thức gọi tới phương thức train
, bạn đã không vượt qua đối số steps
để đánh giá. input_fn
cho eval chỉ mang lại một kỷ nguyên dữ liệu duy nhất.
Từ điển eval_result
cũng chứa average_loss
(tổn thất trung bình trên mỗi mẫu), loss
(tổn thất trung bình trên mỗi lô nhỏ) và giá trị của global_step
của công cụ ước tính (số lần lặp lại đào tạo mà nó đã trải qua).
Đưa ra dự đoán (suy luận) từ mô hình được đào tạo
Bây giờ bạn có một mô hình được đào tạo tạo ra kết quả đánh giá tốt. Giờ đây, bạn có thể sử dụng mô hình đã đào tạo để dự đoán loài hoa Iris dựa trên một số phép đo không gắn nhãn. Giống như đào tạo và đánh giá, bạn đưa ra dự đoán bằng cách sử dụng một lệnh gọi hàm duy nhất:
# Generate predictions from the model
expected = ['Setosa', 'Versicolor', 'Virginica']
predict_x = {
'SepalLength': [5.1, 5.9, 6.9],
'SepalWidth': [3.3, 3.0, 3.1],
'PetalLength': [1.7, 4.2, 5.4],
'PetalWidth': [0.5, 1.5, 2.1],
}
def input_fn(features, batch_size=256):
"""An input function for prediction."""
# Convert the inputs to a Dataset without labels.
return tf.data.Dataset.from_tensor_slices(dict(features)).batch(batch_size)
predictions = classifier.predict(
input_fn=lambda: input_fn(predict_x))
Phương thức predict
trả về một Python có thể lặp lại, mang lại một từ điển kết quả dự đoán cho mỗi ví dụ. Đoạn mã sau in ra một vài dự đoán và xác suất của chúng:
for pred_dict, expec in zip(predictions, expected):
class_id = pred_dict['class_ids'][0]
probability = pred_dict['probabilities'][class_id]
print('Prediction is "{}" ({:.1f}%), expected "{}"'.format(
SPECIES[class_id], 100 * probability, expec))
INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from /tmp/tmpxdgumb2t/model.ckpt-5000 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. Prediction is "Setosa" (84.4%), expected "Setosa" Prediction is "Versicolor" (49.3%), expected "Versicolor" Prediction is "Virginica" (57.7%), expected "Virginica"