TensorfFlowの’Hello World’
2020/03/09
TensorfFlow.orgに’Hello World’として紹介されている「MNISTの手書き数字の分類」をやってみる。 備忘録的に注釈をつけ、同じく初心者向けチュートリアルのfashion_mnist分類にあった、「中身のデータのちょっとした確認」を付け加えたもの。
import tensorflow as tf import matplotlib.pyplot as plt import numpy as np #from tensorflow import keras #訓練データと試験データをダウンロード mnist = tf.keras.datasets.mnist (x_train, y_train),(x_test, y_test) = mnist.load_data() #各データの各ピクセル0~255を、0~1に x_train, x_test = x_train / 255.0, x_test / 255.0 #データの確認1 plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(x_train[i], cmap=plt.cm.binary) plt.xlabel(y_train[i]) plt.show() #データの確認2(省略) """ for i in range(2): plt.figure() plt.imshow(x_train[i]) plt.colorbar() plt.grid(False) plt.show() print('ans: ', y_train[i]) """ model = tf.keras.models.Sequential([ #Flattenは一列にならべること:28*28を784に tf.keras.layers.Flatten(input_shape=(28, 28)), #Denseで中間層のノード256個 活性化関数reluを指定 tf.keras.layers.Dense(256, activation='relu'), #2割のデータを捨て、特定のデータに引きずられないようにする tf.keras.layers.Dropout(0.2), #全結合層10個(0~9の分類なので)のノードに 活性化関数softmax tf.keras.layers.Dense(10, activation='softmax') ]) #adam optimizerを使う、などなど metricsは評価方法 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) #.fitで、10回トレーニング model.fit(x_train, y_train, epochs=10) #テスト #model.evaluate(x_test, y_test) #予測のテストのチェック plt.figure() plt.imshow(x_test[0]) plt.colorbar() plt.grid(False) plt.show() predictions = model.predict(x_test) print(predictions[0]) print(np.argmax(predictions[0])) plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(x_test[i], cmap=plt.cm.binary) plt.xlabel("{} ({:2.0f}%) ans:{}".format(np.argmax(predictions[i]),100*np.max(predictions[i]),y_test[i])) plt.show()
実行してみますと。
ちょっと学習が十分すぎる?128ノード、5回くらいで充分かも。ノードや学習回数を減らすと、2行4列目の5を6と区別したり、4行4列目の3を8と区別するあたりに支障をきたす様子でした。
ちなみに、「中間層64ノード、学習1回」での実行結果は…
こんな感じでした。やはり、字はきれいに書くべきですね。