برآوردگرهای از پیش ساخته شده

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

این آموزش به شما نشان می دهد که چگونه مشکل طبقه بندی Iris را در TensorFlow با استفاده از برآوردگرها حل کنید. برآوردگر یک نمایشگر سطح بالای TensorFlow از یک مدل کامل است. برای جزئیات بیشتر به برآوردگرها مراجعه کنید.

اول کار های مهم

برای شروع، ابتدا TensorFlow و تعدادی از کتابخانه های مورد نیاز خود را وارد خواهید کرد.

import tensorflow as tf

import pandas as pd

مجموعه داده ها

برنامه نمونه در این سند مدلی را می سازد و آزمایش می کند که گل زنبق را بر اساس اندازه کاسبرگ و گلبرگ آنها به سه گونه مختلف طبقه بندی می کند.

شما یک مدل را با استفاده از مجموعه داده Iris آموزش خواهید داد. مجموعه داده Iris شامل چهار ویژگی و یک برچسب است. این چهار ویژگی ویژگی های گیاهی زیر را برای گل های زنبق مشخص می کند:

  • طول کاسبرگ
  • عرض کاسبرگ
  • طول گلبرگ
  • عرض گلبرگ

بر اساس این اطلاعات، می توانید چند ثابت مفید برای تجزیه داده ها تعریف کنید:

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

سپس مجموعه داده های Iris را با استفاده از Keras و Pandas دانلود و تجزیه کنید. توجه داشته باشید که مجموعه داده های مجزایی را برای آموزش و آزمایش نگه دارید.

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

می توانید داده های خود را بررسی کنید تا ببینید که چهار ستون ویژگی شناور و یک برچسب int32 دارید.

train.head()

برای هر یک از مجموعه‌های داده، برچسب‌ها را تقسیم کنید، که مدل برای پیش‌بینی آنها آموزش داده می‌شود.

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

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

مروری بر برنامه نویسی با برآوردگرها

اکنون که داده ها را تنظیم کرده اید، می توانید یک مدل را با استفاده از تخمینگر TensorFlow تعریف کنید. برآوردگر هر کلاسی است که از tf.estimator.Estimator مشتق شده باشد. TensorFlow مجموعه ای از tf.estimator (به عنوان مثال، LinearRegressor ) را برای پیاده سازی الگوریتم های رایج ML ارائه می دهد. فراتر از آن ها، می توانید برآوردگرهای سفارشی خود را بنویسید. توصیه می شود هنگام شروع کار از برآوردگرهای از پیش ساخته شده استفاده کنید.

برای نوشتن یک برنامه TensorFlow بر اساس برآوردگرهای از پیش ساخته شده، باید وظایف زیر را انجام دهید:

  • یک یا چند تابع ورودی ایجاد کنید.
  • ستون های ویژگی مدل را تعریف کنید.
  • یک برآوردگر را با مشخص کردن ستون‌های ویژگی و فراپارامترهای مختلف نمونه‌سازی کنید.
  • با ارسال تابع ورودی مناسب به عنوان منبع داده، یک یا چند متد را روی شی Estimator فراخوانی کنید.

بیایید ببینیم که چگونه آن وظایف برای طبقه بندی Iris اجرا می شوند.

ایجاد توابع ورودی

شما باید توابع ورودی را برای ارائه داده ها برای آموزش، ارزیابی و پیش بینی ایجاد کنید.

تابع ورودی تابعی است که یک شی tf.data.Dataset را برمی گرداند که تاپل دو عنصری زیر را خروجی می دهد:

  • features ها - فرهنگ لغت پایتون که در آن:
    • هر کلید نام یک ویژگی است.
    • هر مقدار آرایه ای است که تمام مقادیر آن ویژگی را در خود دارد.
  • label - آرایه ای حاوی مقادیر برچسب برای هر مثال.

فقط برای نشان دادن فرمت تابع ورودی، در اینجا یک پیاده سازی ساده وجود دارد:

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

تابع ورودی شما ممکن است فرهنگ لغت و لیست label features ها را هر طور که دوست دارید ایجاد کند. با این حال، استفاده از TensorFlow's Dataset API توصیه می شود که می تواند انواع داده ها را تجزیه کند.

Dataset API می تواند بسیاری از موارد رایج را برای شما مدیریت کند. به عنوان مثال، با استفاده از Dataset API، می توانید به راحتی رکوردهای مجموعه بزرگی از فایل ها را به صورت موازی بخوانید و آنها را به یک جریان واحد بپیوندید.

برای ساده نگه داشتن چیزها در این مثال، می‌خواهید داده‌ها را با پانداها بارگیری کنید، و یک خط لوله ورودی از این داده‌های درون حافظه بسازید:

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)

ستون های ویژگی را تعریف کنید

ستون ویژگی شیئی است که توضیح می دهد که چگونه مدل باید از داده های ورودی خام از فرهنگ لغت ویژگی ها استفاده کند. هنگامی که یک مدل برآوردگر می‌سازید، فهرستی از ستون‌های ویژگی را به آن ارسال می‌کنید که هر یک از ویژگی‌هایی را که می‌خواهید مدل استفاده کند، توصیف می‌کند. ماژول tf.feature_column گزینه های زیادی برای نمایش داده ها به مدل ارائه می دهد.

برای Iris، 4 ویژگی خام مقادیر عددی هستند، بنابراین شما فهرستی از ستون‌های ویژگی ایجاد می‌کنید تا به مدل برآوردگر بگویید هر یک از چهار ویژگی را به‌عنوان مقادیر ممیز شناور 32 بیتی نشان دهد. بنابراین، کد ایجاد ستون ویژگی:

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

ستون های ویژگی می توانند بسیار پیچیده تر از ستون های نشان داده شده در اینجا باشند. در این راهنما می‌توانید درباره ستون‌های ویژگی بیشتر بخوانید.

اکنون که توضیحی در مورد اینکه چگونه می خواهید مدل ویژگی های خام را نشان دهد، دارید، می توانید برآوردگر را بسازید.

یک برآوردگر را نمونه کنید

مشکل عنبیه یک مشکل طبقه بندی کلاسیک است. خوشبختانه، TensorFlow چندین تخمین‌گر طبقه‌بندی‌کننده از پیش ساخته ارائه می‌کند، از جمله:

برای مشکل Iris، tf.estimator.DNNClassifier بهترین انتخاب به نظر می رسد. در اینجا نحوه نمونه سازی این برآوردگر آمده است:

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

آموزش دهید، ارزیابی کنید و پیش بینی کنید

اکنون که یک شی Estimator دارید، می توانید متدها را برای انجام کارهای زیر فراخوانی کنید:

  • مدل را آموزش دهید.
  • مدل آموزش دیده را ارزیابی کنید.
  • از مدل آموزش دیده برای پیش بینی استفاده کنید.

مدل را آموزش دهید

مدل را با فراخوانی روش train برآوردگر به صورت زیر آموزش دهید:

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

توجه داشته باشید که input_fn خود را در یک lambda تکمیل می‌کنید تا آرگومان‌ها را ضبط کنید، در حالی که تابع ورودی ارائه می‌دهید که هیچ آرگومان نمی‌گیرد، همانطور که توسط برآوردگر انتظار می‌رود. آرگومان steps به روش می گوید که پس از چند مرحله آموزشی، تمرین را متوقف کند.

مدل آموزش دیده را ارزیابی کنید

اکنون که این مدل آموزش دیده است، می توانید آماری از عملکرد آن به دست آورید. بلوک کد زیر دقت مدل آموزش دیده را روی داده های تست ارزیابی می کند:

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

برخلاف روش فراخوانی train ، شما از آرگومان steps برای ارزیابی عبور نکردید. input_fn برای eval فقط یک دوره واحد از داده ها را به دست می دهد.

فرهنگ لغت eval_result همچنین شامل average_loss (میانگین ضرر در هر نمونه)، loss (میانگین تلفات در هر دسته کوچک) و مقدار global_step برآوردگر (تعداد تکرارهای آموزشی که انجام داده است) است.

انجام پیش بینی (استنباط) از مدل آموزش دیده

شما اکنون یک مدل آموزش دیده دارید که نتایج ارزیابی خوبی ایجاد می کند. اکنون می توانید از مدل آموزش دیده برای پیش بینی گونه گل زنبق بر اساس برخی اندازه گیری های بدون برچسب استفاده کنید. همانند آموزش و ارزیابی، شما با استفاده از یک فراخوانی تابع پیش بینی می کنید:

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

متد predict ، یک تکرارپذیر پایتون را برمی‌گرداند، و یک فرهنگ لغت از نتایج پیش‌بینی را برای هر مثال به دست می‌دهد. کد زیر چند پیش بینی و احتمالات آنها را چاپ می کند:

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"