TensorFlow.org पर देखें | Google Colab में चलाएं | GitHub पर स्रोत देखें | नोटबुक डाउनलोड करें |
यह ट्यूटोरियल आपको दिखाता है कि एस्टिमेटर्स का उपयोग करके TensorFlow में आइरिस वर्गीकरण समस्या को कैसे हल किया जाए। एक अनुमानक एक संपूर्ण मॉडल का एक विरासत TensorFlow उच्च-स्तरीय प्रतिनिधित्व है। अधिक जानकारी के लिए अनुमानक देखें।
सबसे पहली बात
आरंभ करने के लिए, आप पहले TensorFlow और कई पुस्तकालयों को आयात करेंगे जिनकी आपको आवश्यकता होगी।
import tensorflow as tf
import pandas as pd
डेटा सेट
इस दस्तावेज़ में नमूना कार्यक्रम एक मॉडल बनाता है और परीक्षण करता है जो आईरिस फूलों को उनके बाह्यदल और पंखुड़ियों के आकार के आधार पर तीन अलग-अलग प्रजातियों में वर्गीकृत करता है।
आप आइरिस डेटा सेट का उपयोग करके एक मॉडल को प्रशिक्षित करेंगे। आइरिस डेटा सेट में चार विशेषताएं और एक लेबल होता है। चार विशेषताएं व्यक्तिगत आईरिस फूलों की निम्नलिखित वानस्पतिक विशेषताओं की पहचान करती हैं:
- बाहरी लंबाई
- बाहरी चौड़ाई
- पंखुड़ी की लंबाई
- पंखुड़ी की चौड़ाई
इस जानकारी के आधार पर, आप डेटा को पार्स करने के लिए कुछ सहायक स्थिरांक परिभाषित कर सकते हैं:
CSV_COLUMN_NAMES = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']
SPECIES = ['Setosa', 'Versicolor', 'Virginica']
इसके बाद, केरस और पंडों का उपयोग करके आइरिस डेटा सेट को डाउनलोड और पार्स करें। ध्यान दें कि आप प्रशिक्षण और परीक्षण के लिए अलग-अलग डेटासेट रखते हैं।
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 सामान्य ML एल्गोरिदम को लागू करने के लिए tf.estimator
(उदाहरण के लिए, LinearRegressor
) का एक संग्रह प्रदान करता है। इनके अलावा, आप अपने स्वयं के कस्टम अनुमानक लिख सकते हैं। पूर्व-निर्मित अनुमानकों का उपयोग करते समय यह अनुशंसा की जाती है कि वे अभी शुरू करें।
पूर्व-निर्मित अनुमानकों के आधार पर एक TensorFlow प्रोग्राम लिखने के लिए, आपको निम्नलिखित कार्य करने होंगे:
- एक या अधिक इनपुट फ़ंक्शन बनाएं।
- मॉडल के फीचर कॉलम को परिभाषित करें।
- फीचर कॉलम और विभिन्न हाइपरपैरामीटर निर्दिष्ट करते हुए एक एस्टिमेटर को इंस्टेंट करें।
- डेटा के स्रोत के रूप में उपयुक्त इनपुट फ़ंक्शन को पास करते हुए, एस्टिमेटर ऑब्जेक्ट पर एक या अधिक विधियों को कॉल करें।
आइए देखें कि आइरिस वर्गीकरण के लिए उन कार्यों को कैसे लागू किया जाता है।
इनपुट फ़ंक्शन बनाएं
आपको प्रशिक्षण, मूल्यांकन और भविष्यवाणी के लिए डेटा की आपूर्ति करने के लिए इनपुट फ़ंक्शन बनाना होगा।
एक इनपुट फ़ंक्शन एक फ़ंक्शन है जो एक 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
सूची उत्पन्न कर सकता है। हालाँकि, TensorFlow के 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
मॉड्यूल मॉडल को डेटा का प्रतिनिधित्व करने के लिए कई विकल्प प्रदान करता है।
आइरिस के लिए, 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
गहरे मॉडल के लिए जो बहु-श्रेणी वर्गीकरण करते हैं। -
tf.estimator.DNNLinearCombinedClassifier
विस्तृत और गहरे मॉडल के लिए। - रैखिक मॉडल पर आधारित क्लासिफायर के लिए
tf.estimator.LinearClassifier
।
आईरिस समस्या के लिए, 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}
ट्रेन, मूल्यांकन, और भविष्यवाणी
अब जब आपके पास एस्टिमेटर ऑब्जेक्ट है, तो आप निम्न कार्य करने के लिए विधियों को कॉल कर सकते हैं:
- मॉडल को प्रशिक्षित करें।
- प्रशिक्षित मॉडल का मूल्यांकन करें।
- भविष्यवाणी करने के लिए प्रशिक्षित मॉडल का उपयोग करें।
मॉडल को प्रशिक्षित करें
एस्टीमेटर की 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>
ध्यान दें कि आप एक इनपुट फ़ंक्शन प्रदान करते हुए तर्कों को पकड़ने के लिए lambda
में अपने 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. 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
तर्क पारित नहीं किया। eval के लिए 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/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"