Penaksir Premade

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Tutorial ini menunjukkan cara memecahkan masalah klasifikasi Iris di TensorFlow menggunakan Estimator. Estimator adalah representasi tingkat tinggi TensorFlow lama dari model lengkap. Untuk lebih jelasnya lihat Pengukur .

Hal pertama yang pertama

Untuk memulai, pertama-tama Anda akan mengimpor TensorFlow dan sejumlah pustaka yang Anda perlukan.

import tensorflow as tf

import pandas as pd

kumpulan data

Program sampel dalam dokumen ini membangun dan menguji model yang mengklasifikasikan bunga Iris menjadi tiga spesies berbeda berdasarkan ukuran sepal dan petalnya .

Anda akan melatih model menggunakan kumpulan data Iris. Kumpulan data Iris berisi empat fitur dan satu label . Empat fitur mengidentifikasi karakteristik botani berikut dari masing-masing bunga Iris:

  • panjang sepal
  • lebar sepal
  • panjang kelopak
  • lebar kelopak

Berdasarkan informasi ini, Anda dapat menentukan beberapa konstanta yang berguna untuk menguraikan data:

CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']
SPECIES = ['Setosa', 'Versicolor', 'Virginica']

Selanjutnya, unduh dan parsing kumpulan data Iris menggunakan Keras dan Pandas. Perhatikan bahwa Anda menyimpan kumpulan data yang berbeda untuk pelatihan dan pengujian.

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

Anda dapat memeriksa data Anda untuk melihat bahwa Anda memiliki empat kolom fitur float dan satu label int32.

train.head()

Untuk setiap set data, pisahkan labelnya, yang akan diprediksi oleh model yang akan dilatih.

train_y = train.pop('Species')
test_y = test.pop('Species')

# The label column has now been removed from the features.
train.head()

Ikhtisar pemrograman dengan Estimator

Setelah menyiapkan data, Anda dapat menentukan model menggunakan Penaksir TensorFlow. Sebuah Estimator adalah setiap kelas yang diturunkan dari tf.estimator.Estimator . TensorFlow menyediakan kumpulan tf.estimator (misalnya, LinearRegressor ) untuk mengimplementasikan algoritme ML umum. Di luar itu, Anda dapat menulis Penaksir khusus Anda sendiri. Disarankan untuk menggunakan Estimator yang sudah jadi saat baru memulai.

Untuk menulis program TensorFlow berdasarkan Estimator yang dibuat sebelumnya, Anda harus melakukan tugas berikut:

  • Buat satu atau lebih fungsi input.
  • Tentukan kolom fitur model.
  • Instansiasi sebuah Estimator, yang menentukan kolom fitur dan berbagai hyperparameter.
  • Panggil satu atau lebih metode pada objek Estimator, dengan meneruskan fungsi input yang sesuai sebagai sumber data.

Mari kita lihat bagaimana tugas-tugas tersebut diimplementasikan untuk klasifikasi Iris.

Buat fungsi masukan

Anda harus membuat fungsi input untuk menyediakan data untuk pelatihan, evaluasi, dan prediksi.

Fungsi input adalah fungsi yang mengembalikan objek tf.data.Dataset yang mengeluarkan tupel dua elemen berikut:

  • features - Kamus Python di mana:
    • Setiap kunci adalah nama fitur.
    • Setiap nilai adalah larik yang berisi semua nilai fitur itu.
  • label - Sebuah array yang berisi nilai-nilai label untuk setiap contoh.

Hanya untuk mendemonstrasikan format fungsi input, berikut adalah implementasi sederhananya:

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

Fungsi input Anda dapat menghasilkan kamus features dan daftar label sesuka Anda. Namun, Sebaiknya gunakan Dataset API TensorFlow , yang dapat mengurai semua jenis data.

Dataset API dapat menangani banyak kasus umum untuk Anda. Misalnya, dengan menggunakan Dataset API, Anda dapat dengan mudah membaca catatan dari kumpulan besar file secara paralel dan menggabungkannya ke dalam satu aliran.

Untuk mempermudah dalam contoh ini, Anda akan memuat data dengan pandas , dan membangun saluran input dari data dalam memori ini:

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)

Tentukan kolom fitur

Kolom fitur adalah objek yang menjelaskan bagaimana model harus menggunakan data input mentah dari kamus fitur. Saat Anda membuat model Estimator, Anda memberikan daftar kolom fitur yang menjelaskan setiap fitur yang Anda inginkan untuk digunakan model tersebut. Modul tf.feature_column menyediakan banyak opsi untuk merepresentasikan data ke model.

Untuk Iris, 4 fitur mentah adalah nilai numerik, jadi Anda akan membuat daftar kolom fitur untuk memberi tahu model Estimator untuk mewakili masing-masing dari empat fitur sebagai nilai titik-mengambang 32-bit. Oleh karena itu, kode untuk membuat kolom fitur adalah:

# 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))

Kolom fitur bisa jauh lebih canggih daripada yang ditampilkan di sini. Anda dapat membaca lebih lanjut tentang Kolom Fitur dalam panduan ini .

Sekarang setelah Anda memiliki deskripsi tentang bagaimana model merepresentasikan fitur mentah, Anda dapat membuat estimator.

Buat estimator

Masalah Iris adalah masalah klasifikasi klasik. Untungnya, TensorFlow menyediakan beberapa Estimator pengklasifikasi yang dibuat sebelumnya, termasuk:

Untuk masalah Iris, tf.estimator.DNNClassifier sepertinya merupakan pilihan terbaik. Inilah cara Anda membuat Instansiasi Penaksir ini:

# 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}

Latih, Evaluasi, dan Prediksi

Sekarang setelah Anda memiliki objek Estimator, Anda dapat memanggil metode untuk melakukan hal berikut:

  • Latih modelnya.
  • Evaluasi model yang dilatih.
  • Gunakan model terlatih untuk membuat prediksi.

Latih modelnya

Latih model dengan memanggil metode train Estimator sebagai berikut:

# 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>

Perhatikan bahwa Anda menyelesaikan panggilan input_fn Anda dalam lambda untuk menangkap argumen sambil memberikan fungsi input yang tidak membutuhkan argumen, seperti yang diharapkan oleh Estimator. Argumen steps memberi tahu metode untuk menghentikan pelatihan setelah sejumlah langkah pelatihan.

Evaluasi model yang dilatih

Sekarang model telah dilatih, Anda bisa mendapatkan beberapa statistik tentang kinerjanya. Blok kode berikut mengevaluasi keakuratan model terlatih pada data uji:

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

Berbeda dengan panggilan ke metode train , Anda tidak meneruskan argumen steps untuk dievaluasi. input_fn untuk eval hanya menghasilkan satu epoch data.

Kamus eval_result juga berisi average_loss (kerugian rata-rata per sampel), loss (kerugian rata-rata per mini-batch) dan nilai global_step estimator (jumlah iterasi pelatihan yang dilakukan).

Membuat prediksi (menyimpulkan) dari model yang dilatih

Anda sekarang memiliki model terlatih yang menghasilkan hasil evaluasi yang baik. Anda sekarang dapat menggunakan model terlatih untuk memprediksi spesies bunga Iris berdasarkan beberapa pengukuran yang tidak berlabel. Seperti halnya pelatihan dan evaluasi, Anda membuat prediksi menggunakan satu panggilan fungsi:

# 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))

Metode predict mengembalikan iterable Python, menghasilkan kamus hasil prediksi untuk setiap contoh. Kode berikut mencetak beberapa prediksi dan probabilitasnya:

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"