Tensflow:虹彩を例に取ったtf.contrib.learn.DNNClassifier()モデルの保存と再利用



Tensflow Storage Reuse Tf



Pythonバージョン:3.5
tensorflowバージョン:1.4.0
TensorFlowディープラーニングアプリケーションを学習する場合、多くの資料でアイリスを例として取り上げ、この記事の次のコードなど、非常に単純な例をリストしています。しかし、トレーニング済みのディープニューラルネットワークを保存した後、それをテストに再利用する方法を収集すると、セッション関連のコンテンツがたくさん見つかりますが、これは私たちがほとんど学んでいないこの単純な例とは一致しません。私も同じ問題に遭遇しました。私はたくさんのブログをチェックしました、そしてそれらは私が必要としたものではなく、すべて同じでした。次に、tf.contrib.learn.DNNClassifier()トレーニングを使用してモデルを保存して再利用する方法を紹介します。 方法は本当にとてもとても簡単です

最初の一歩: ディープニューラルネットワークをトレーニングし、モデルを保存します。



import os import urllib import numpy as np import tensorflow as tf import time # Data sets IRIS_TRAINING = 'iris_training.csv' IRIS_TRAINING_URL = 'http://download.tensorflow.org/data/iris_training.csv' IRIS_TEST = 'iris_test.csv' IRIS_TEST_URL = 'http://download.tensorflow.org/data/iris_test.csv' def main(): # If the training and test sets aren't stored locally, download them. if not os.path.exists(IRIS_TRAINING): raw = urllib.urlopen(IRIS_TRAINING_URL).read() with open(IRIS_TRAINING, 'w') as f: f.write(raw) if not os.path.exists(IRIS_TEST): raw = urllib.urlopen(IRIS_TEST_URL).read() with open(IRIS_TEST, 'w') as f: f.write(raw) # Load datasets. training_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32) test_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TEST, target_dtype=np.int, features_dtype=np.float32) print(training_set) # print(test_set) # Specify that all features have real-value data feature_columns = [tf.contrib.layers.real_valued_column('', dimension=4)] print(feature_columns) # Build 3 layer DNN with 10, 20, 10 units respectively. classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,hidden_units=[10, 20, 20, 10],n_classes=3,model_dir='D:PycharmProjectDeep_LearningTensorflow_learningmodel_iris') # Define the training inputs def get_train_inputs(): x = tf.constant(training_set.data) y = tf.constant(training_set.target) return x, y # Fit model. classifier.fit(input_fn=get_train_inputs, steps=2000) # Define the test inputs def get_test_inputs(): x = tf.constant(test_set.data) y = tf.constant(test_set.target) return x, y # Evaluate accuracy. accuracy_score = classifier.evaluate(input_fn=get_test_inputs,steps=1)['accuracy'] print(' Test Accuracy: {0:f} '.format(accuracy_score)) print(classifier.evaluate(input_fn=get_test_inputs,steps=1)) print(list(classifier.predict(input_fn=get_test_inputs))) # Classify two new flower samples. def new_samples(): return np.array( [[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=np.float32) predictions = list(classifier.predict(input_fn=new_samples)) print( 'New Samples, Class Predictions: {} ' .format(predictions)) if __name__ == '__main__': start = time.time() main() end = time.time() print('operation hours:',end-start)

実行中の部分の結果は次のとおりです。

Test Accuracy: 0.966667 operation hours: 5.970066785812378

生成されたファイルの内容は次のとおりです。
画像
ステップ2:モデルの使用率を復元し、テスト結果を取得します。



import os import urllib import numpy as np import tensorflow as tf from sklearn.metrics import confusion_matrix from sklearn.metrics import classification_report import time IRIS_TEST = 'D:PycharmProjectDeep_LearningTensorflow_learningiris_test.csv' IRIS_TEST_URL = 'http://download.tensorflow.org/data/iris_test.csv' def main(): test_set = tf.contrib.learn.datasets.base.load_csv_with_header( filename=IRIS_TEST, target_dtype=np.int, features_dtype=np.float32) # Specify that all features have real-value data feature_columns = [tf.contrib.layers.real_valued_column('', dimension=4)] print(feature_columns) # Build 3 layer DNN with 10, 20, 10 units respectively. classifier = tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,hidden_units=[10, 20, 20, 10],n_classes=3,model_dir='D:PycharmProjectDeep_LearningTensorflow_learningmodel_iris') # Define the test inputs def get_test_inputs(): x = tf.constant(test_set.data) y = tf.constant(test_set.target) return x, y # Evaluate accuracy. accuracy_score = classifier.evaluate(input_fn=get_test_inputs,steps=1)['accuracy'] print(' Test Accuracy: {0:f} '.format(accuracy_score)) print(classifier.evaluate(input_fn=get_test_inputs,steps=1)) print(list(classifier.predict(input_fn=get_test_inputs))) # Classify two new flower samples. def new_samples(): return np.array( [[6.4, 3.2, 4.5, 1.5], [5.8, 3.1, 5.0, 1.7]], dtype=np.float32) predictions = list(classifier.predict(input_fn=new_samples)) print( 'New Samples, Class Predictions: {} ' .format(predictions)) # conf_mat = confusion_matrix(testlabel,predictions) # report = classification_report(testlabel,predictions) if __name__ == '__main__': start = time.time() main() end = time.time() print('operation hours:',end-start)

実行中の部分の結果は次のとおりです。

Test Accuracy: 0.966667 operation hours: 2.1934993267059326

完了するのは簡単ですか?テストセットの精度と実行時間から、2番目のステップはモデルを再トレーニングせず、トレーニングされたディープニューラルネットワークを直接使用することがわかります。 しかし、注意が必要な問題は、モデルの構造を統一する必要があるということです 、次のコードに示すように:

tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,hidden_units=[10, 20, 20,10],n_classes=3,model_dir='D:PycharmProjectDeep_LearningTensorflow_learningmodel_iris')