דף זה תורגם על ידי Cloud Translation API.
Switch to English

אומדנים מוכנים מראש

צפה ב- TensorFlow.org הפעל בגוגל קולאב צפה במקור ב- GitHub הורד מחברת

מדריך זה מראה כיצד לפתור את בעיית הסיווג של איריס ב- TensorFlow באמצעות Estimators. אומדן הוא ייצוג ברמה גבוהה של מודל שלם של TensorFlow, והוא תוכנן עבור קנה מידה קל ואימונים א-סינכרוניים. לפרטים נוספים ראה אומדנים .

שים לב שב- TensorFlow 2.0, ממשק ה- API של Keras יכול לבצע רבות מאותן משימות זהות, והוא האמין שהוא ממש קל יותר ללמוד. אם אתה מתחיל טרי, אנו ממליצים לך להתחיל עם Keras. לקבלת מידע נוסף אודות ממשקי ה- API הזמינים ברמה גבוהה ב- TensorFlow 2.0, ראה סטנדרטיזציה ב- Keras .

קודם כל

על מנת להתחיל, תחילה ייבא את TensorFlow ומספר ספריות שתזדקק להם.

import tensorflow as tf

import pandas as pd

מערך הנתונים

תוכנית המדגם במסמך זה בונה ובודקת מודל המסווג את פרחי הקשתית לשלושה מינים שונים בהתבסס על גודל הגביע והעלי כותרת שלהם.

תוכלו לאמן מודל באמצעות מערך הנתונים של איריס. מערכת הנתונים של איריס מכילה ארבע תכונות ותווית אחת. ארבע התכונות מזהות את המאפיינים הבוטניים הבאים של פרחי אירוס בודדים:

  • אורך ספאל
  • רוחב ספאל
  • אורך עלי כותרת
  • רוחב עלי כותרת

על סמך מידע זה, תוכלו להגדיר כמה קבועים מועילים לניתוח הנתונים:

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

לאחר מכן, הורד ונתח את מערך הנתונים של איריס באמצעות 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. אומדן הוא כל מחלקה שמקורה ב- tf.estimator.Estimator . TensorFlow מספק אוסף של tf.estimator (למשל, LinearRegressor ) ליישום אלגוריתמי ML נפוצים. מעבר לאלה, אתה יכול לכתוב אומדנים מותאמים אישית משלך. אנו ממליצים להשתמש באומדנים שהוכנו מראש כשרק התחלת העבודה.

כדי לכתוב תוכנית TensorFlow המבוססת על אומדנים שהוכנו מראש, עליך לבצע את המשימות הבאות:

  • צור פונקציית קלט אחת או יותר.
  • הגדר את עמודות התכונה של המודל.
  • מייצב אומדן, תוך ציון עמודות התכונה והיפרפרמטרים שונים.
  • התקשר לשיטה אחת או יותר באובייקט Estimator, והעביר את פונקציית הקלט המתאימה כמקור הנתונים.

בואו נראה כיצד משימות אלה מיושמות לסיווג איריס.

צור פונקציות קלט

עליך ליצור פונקציות קלט כדי לספק נתונים לאימון, הערכה וחיזוי.

פונקציית קלט היא פונקציה המחזירה אובייקטtf.data.Dataset המפיק את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

פונקציית הקלט עשויה ליצור את מילון features ורשימת label בכל דרך שתרצה. עם זאת, אנו ממליצים להשתמש ב- API של מערך הנתונים של TensorFlow, אשר יכול לנתח כל מיני נתונים.

ה- API של מערך הנתונים יכול לטפל בהרבה מקרים נפוצים עבורכם. לדוגמא, באמצעות ממשק ה- 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 מספק אפשרויות רבות לייצוג נתונים למודל.

עבור איריס, ארבע התכונות הגולמיות הן ערכים מספריים, לכן נבנה רשימה של עמודות תכונה שתאמר למודל האומדן לייצג כל אחת מארבע התכונות כערכים של 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 מספק מספר אומדני סיווג מוכנים מראש, כולל:

לבעיית tf.estimator.DNNClassifier , 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}

התאמן, הערך ונבא

עכשיו שיש לך אובייקט אומדן, אתה יכול להתקשר לשיטות לבצע את הפעולות הבאות:

  • תאמן את המודל.
  • הערך את המודל המאומן.
  • השתמש במודל המאומן כדי לחזות.

תאמן את המודל

train את המודל על ידי קריאת שיטת 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 כדי ללכוד את הטיעונים תוך מתן תפקיד קלט כי לא לוקח ארגומנטים, כצפוי שהמעריך. טיעון 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 עבור input_fn מניב רק תקופת נתונים אחת.

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/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"