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

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

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

קודם כל

על מנת להתחיל, תחילה תייבא את TensorFlow ומספר ספריות שתצטרך.

import tensorflow as tf

import pandas as pd

מערך הנתונים

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

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

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

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

בוא נראה איך משימות אלו מיושמות עבור סיווג איריס.

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

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

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

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

הגדר את עמודות התכונה

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

לבעיית האיריס, 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"