این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

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

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

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

توجه داشته باشید که در TensorFlow 2.0 ، Keras API می تواند بسیاری از همین کارها را انجام دهد و اعتقاد بر این است که یک API آسان تر برای یادگیری است. اگر تازه کار را شروع می کنید ، توصیه می کنیم با Keras شروع کنید. برای کسب اطلاعات بیشتر در مورد API های سطح بالا موجود در TensorFlow 2.0 ، به استانداردسازی در Keras مراجعه کنید .

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

برای شروع ، ابتدا 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)

می توانید داده های خود را بررسی کنید تا ببینید چهار ستون ویژگی شناور و یک برچسب 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 Estimator مدلی تعریف کنید. Estimator هر کلاس مشتق شده از tf.estimator.Estimator . tf.estimator مجموعه ای از tf.estimator (به عنوان مثال LinearRegressor ) را برای پیاده سازی الگوریتم های رایج ML فراهم می کند. فراتر از این موارد ، ممکن است برآوردگرهای سفارشی خود را بنویسید. توصیه می کنیم هنگام شروع به کار از برآوردگرهای از پیش ساخته شده استفاده کنید.

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

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

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

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

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

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

  • 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

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

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 ویژگی خام مقادیر عددی هستند ، بنابراین ما لیستی از ستون های ویژگی ایجاد خواهیم کرد تا به مدل Estimator بگوییم که هر یک از چهار ویژگی را به عنوان مقادیر 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))

ستون های ویژگی بسیار پیچیده تر از ستون هایی هستند که در اینجا نشان می دهیم. می توانید اطلاعات بیشتر در مورد ستونهای ویژگی را در این راهنما مطالعه کنید .

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

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

مسئله Iris یک مشکل طبقه بندی کلاسیک است. خوشبختانه ، 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/tmpbhg2uvbr
INFO:tensorflow:Using config: {'_model_dir': '/tmp/tmpbhg2uvbr', '_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, '_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}

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

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

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

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

با فراخوانی روش train 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.6/site-packages/tensorflow/python/training/training_util.py:236: 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:Layer dnn is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2.  The layer has dtype float32 because its dtype defaults to floatx.

If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.

To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.

Warning:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/keras/optimizer_v2/adagrad.py:83: 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/tmpbhg2uvbr/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...
INFO:tensorflow:loss = 1.1140382, step = 0
INFO:tensorflow:global_step/sec: 312.415
INFO:tensorflow:loss = 0.8781501, step = 100 (0.321 sec)
INFO:tensorflow:global_step/sec: 375.535
INFO:tensorflow:loss = 0.80712265, step = 200 (0.266 sec)
INFO:tensorflow:global_step/sec: 372.712
INFO:tensorflow:loss = 0.7615077, step = 300 (0.268 sec)
INFO:tensorflow:global_step/sec: 368.782
INFO:tensorflow:loss = 0.733555, step = 400 (0.271 sec)
INFO:tensorflow:global_step/sec: 372.689
INFO:tensorflow:loss = 0.6983943, step = 500 (0.268 sec)
INFO:tensorflow:global_step/sec: 370.308
INFO:tensorflow:loss = 0.67940104, step = 600 (0.270 sec)
INFO:tensorflow:global_step/sec: 373.374
INFO:tensorflow:loss = 0.65386146, step = 700 (0.268 sec)
INFO:tensorflow:global_step/sec: 368.335
INFO:tensorflow:loss = 0.63730353, step = 800 (0.272 sec)
INFO:tensorflow:global_step/sec: 371.575
INFO:tensorflow:loss = 0.61313766, step = 900 (0.269 sec)
INFO:tensorflow:global_step/sec: 371.975
INFO:tensorflow:loss = 0.6123625, step = 1000 (0.269 sec)
INFO:tensorflow:global_step/sec: 369.615
INFO:tensorflow:loss = 0.5957534, step = 1100 (0.270 sec)
INFO:tensorflow:global_step/sec: 374.054
INFO:tensorflow:loss = 0.57203, step = 1200 (0.267 sec)
INFO:tensorflow:global_step/sec: 369.713
INFO:tensorflow:loss = 0.56556034, step = 1300 (0.270 sec)
INFO:tensorflow:global_step/sec: 366.202
INFO:tensorflow:loss = 0.547443, step = 1400 (0.273 sec)
INFO:tensorflow:global_step/sec: 361.407
INFO:tensorflow:loss = 0.53326523, step = 1500 (0.277 sec)
INFO:tensorflow:global_step/sec: 367.461
INFO:tensorflow:loss = 0.51837724, step = 1600 (0.272 sec)
INFO:tensorflow:global_step/sec: 364.181
INFO:tensorflow:loss = 0.5281174, step = 1700 (0.275 sec)
INFO:tensorflow:global_step/sec: 368.139
INFO:tensorflow:loss = 0.5139683, step = 1800 (0.271 sec)
INFO:tensorflow:global_step/sec: 366.277
INFO:tensorflow:loss = 0.51073176, step = 1900 (0.273 sec)
INFO:tensorflow:global_step/sec: 366.634
INFO:tensorflow:loss = 0.4949246, step = 2000 (0.273 sec)
INFO:tensorflow:global_step/sec: 364.732
INFO:tensorflow:loss = 0.49381495, step = 2100 (0.274 sec)
INFO:tensorflow:global_step/sec: 365.006
INFO:tensorflow:loss = 0.48916715, step = 2200 (0.274 sec)
INFO:tensorflow:global_step/sec: 366.902
INFO:tensorflow:loss = 0.48790723, step = 2300 (0.273 sec)
INFO:tensorflow:global_step/sec: 362.232
INFO:tensorflow:loss = 0.47671652, step = 2400 (0.276 sec)
INFO:tensorflow:global_step/sec: 368.592
INFO:tensorflow:loss = 0.47324088, step = 2500 (0.271 sec)
INFO:tensorflow:global_step/sec: 371.611
INFO:tensorflow:loss = 0.46822113, step = 2600 (0.269 sec)
INFO:tensorflow:global_step/sec: 362.345
INFO:tensorflow:loss = 0.4621966, step = 2700 (0.276 sec)
INFO:tensorflow:global_step/sec: 362.788
INFO:tensorflow:loss = 0.47817266, step = 2800 (0.275 sec)
INFO:tensorflow:global_step/sec: 368.473
INFO:tensorflow:loss = 0.45853442, step = 2900 (0.271 sec)
INFO:tensorflow:global_step/sec: 360.944
INFO:tensorflow:loss = 0.44062576, step = 3000 (0.277 sec)
INFO:tensorflow:global_step/sec: 370.982
INFO:tensorflow:loss = 0.4331399, step = 3100 (0.269 sec)
INFO:tensorflow:global_step/sec: 366.248
INFO:tensorflow:loss = 0.45120597, step = 3200 (0.273 sec)
INFO:tensorflow:global_step/sec: 371.703
INFO:tensorflow:loss = 0.4403404, step = 3300 (0.269 sec)
INFO:tensorflow:global_step/sec: 362.176
INFO:tensorflow:loss = 0.42405623, step = 3400 (0.276 sec)
INFO:tensorflow:global_step/sec: 363.283
INFO:tensorflow:loss = 0.41672814, step = 3500 (0.275 sec)
INFO:tensorflow:global_step/sec: 363.529
INFO:tensorflow:loss = 0.42626005, step = 3600 (0.275 sec)
INFO:tensorflow:global_step/sec: 367.348
INFO:tensorflow:loss = 0.4089098, step = 3700 (0.272 sec)
INFO:tensorflow:global_step/sec: 363.067
INFO:tensorflow:loss = 0.41276374, step = 3800 (0.275 sec)
INFO:tensorflow:global_step/sec: 364.771
INFO:tensorflow:loss = 0.4112524, step = 3900 (0.274 sec)
INFO:tensorflow:global_step/sec: 363.167
INFO:tensorflow:loss = 0.39261794, step = 4000 (0.275 sec)
INFO:tensorflow:global_step/sec: 362.082
INFO:tensorflow:loss = 0.41160905, step = 4100 (0.276 sec)
INFO:tensorflow:global_step/sec: 364.979
INFO:tensorflow:loss = 0.39620766, step = 4200 (0.274 sec)
INFO:tensorflow:global_step/sec: 363.323
INFO:tensorflow:loss = 0.39696264, step = 4300 (0.275 sec)
INFO:tensorflow:global_step/sec: 361.25
INFO:tensorflow:loss = 0.38196522, step = 4400 (0.277 sec)
INFO:tensorflow:global_step/sec: 365.666
INFO:tensorflow:loss = 0.38667366, step = 4500 (0.274 sec)
INFO:tensorflow:global_step/sec: 361.202
INFO:tensorflow:loss = 0.38149032, step = 4600 (0.277 sec)
INFO:tensorflow:global_step/sec: 365.038
INFO:tensorflow:loss = 0.37832782, step = 4700 (0.274 sec)
INFO:tensorflow:global_step/sec: 366.375
INFO:tensorflow:loss = 0.3726803, step = 4800 (0.273 sec)
INFO:tensorflow:global_step/sec: 366.474
INFO:tensorflow:loss = 0.37167495, step = 4900 (0.273 sec)
INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 5000...
INFO:tensorflow:Saving checkpoints for 5000 into /tmp/tmpbhg2uvbr/model.ckpt.
INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 5000...
INFO:tensorflow:Loss for final step: 0.36297452.

<tensorflow_estimator.python.estimator.canned.dnn.DNNClassifierV2 at 0x7fc9983ed470>

توجه داشته باشید که شما input_fn خود را در یک lambda قرار می دهید تا input_fn را input_fn در حالی که یک عملکرد ورودی ارائه می کنید که هیچ آرگومان نخواهد داشت ، همانطور که ارزیابی کننده انتظار دارد. استدلال 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.
WARNING:tensorflow:Layer dnn is casting an input tensor from dtype float64 to the layer's dtype of float32, which is new behavior in TensorFlow 2.  The layer has dtype float32 because its dtype defaults to floatx.

If you intended to run this layer in float32, you can safely ignore this warning. If in doubt, this warning is likely only an issue if you are porting a TensorFlow 1.X model to TensorFlow 2.

To change all layers to have dtype float64 by default, call `tf.keras.backend.set_floatx('float64')`. To change just this layer, pass dtype='float64' to the layer constructor. If you are the author of this layer, you can disable autocasting by passing autocast=False to the base Layer constructor.

INFO:tensorflow:Done calling model_fn.
INFO:tensorflow:Starting evaluation at 2020-09-10T01:40:47Z
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from /tmp/tmpbhg2uvbr/model.ckpt-5000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Inference Time : 0.21153s
INFO:tensorflow:Finished evaluation at 2020-09-10-01:40:47
INFO:tensorflow:Saving dict for global step 5000: accuracy = 0.96666664, average_loss = 0.42594802, global_step = 5000, loss = 0.42594802
INFO:tensorflow:Saving 'checkpoint_path' summary for global step 5000: /tmp/tmpbhg2uvbr/model.ckpt-5000

Test set accuracy: 0.967


برخلاف فراخوان به روش 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 یک Python قابل تکرار را برمی گرداند ، و برای هر مثال فرهنگ لغت نتایج پیش بینی را ارائه می دهد. کد زیر چند پیش بینی و احتمالات آنها را چاپ می کند:

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/tmpbhg2uvbr/model.ckpt-5000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
Prediction is "Setosa" (91.3%), expected "Setosa"
Prediction is "Versicolor" (52.0%), expected "Versicolor"
Prediction is "Virginica" (63.5%), expected "Virginica"