Công cụ ước tính được tạo sẵn

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 đà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:

Đố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"