Memo

メモ > 技術 > プログラミング言語: Python > TensorFlow+Keras(ディープラーニング)で手書き数字の判定

■TensorFlow+Keras(ディープラーニング)で手書き数字の判定
■MNISTデータの利用 MNISTのデータは、白黒画像の手書き数字のデータセット 学習用の画像に6万枚、テスト用の画像に1万枚もの画像が用意されている sklearnのデータセットに比べると、質も量も大きなデータセット 以下のようにしてインストールする
$ sudo pip3 install keras
以下のようにして使用する
#import keras #from keras.datasets import mnist from tensorflow.keras.datasets import mnist from matplotlib import pyplot # MNISTのデータを読み込む (x_train, y_train), (x_test, y_test) = mnist.load_data() # データを 4x8 に出力 for i in range(0, 32): pyplot.subplot(4, 8, i + 1) pyplot.imshow(x_train[i], cmap='gray') # 画像に保存する pyplot.savefig("output.png")
初回実行時は、以下からMNISTデータのダウンロードが行われる メモリ不足になるとダウンロードに失敗することがあるらしいので注意する https://s3.amazonaws.com/img-datasets/mnist.npz ■多層パーセプトロン(Multilayer perceptron)で画像認識
# MLPでMNISTの分類問題に挑戦 #import keras #from keras.models import Sequential #from keras.layers import Dense, Dropout #from keras.optimizers import RMSprop #from keras.datasets import mnist import tensorflow.keras as keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras.optimizers import RMSprop from tensorflow.keras.datasets import mnist import matplotlib.pyplot as plt # 入力と出力を指定 in_size = 28 * 28 out_size = 10 # MNISTのデータを読み込み (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train[0:in_size * 20] y_train = y_train[0:in_size * 20] X_test = X_test[0:in_size * 20] y_test = y_test[0:in_size * 20] # データを28*28=784の一次元配列に変換 X_train = X_train.reshape(-1, 784).astype('float32') / 255 X_test = X_test.reshape(-1, 784).astype('float32') / 255 # ラベルデータをone-hotベクトルに直す #y_train = keras.utils.np_utils.to_categorical(y_train.astype('int32'),10) #y_test = keras.utils.np_utils.to_categorical(y_test.astype('int32'),10) y_train = keras.utils.to_categorical(y_train.astype('int32'),10) y_test = keras.utils.to_categorical(y_test.astype('int32'),10) # MLPモデル構造を定義 model = Sequential() model.add(Dense(512, activation='relu', input_shape=(in_size,))) model.add(Dropout(0.2)) model.add(Dense(512, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(out_size, activation='softmax')) # モデルをコンパイル model.compile( loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy']) # 学習を実行 hist = model.fit(X_train, y_train, batch_size=64, epochs=30, verbose=1, validation_data=(X_test, y_test)) # モデルを評価 score = model.evaluate(X_test, y_test, verbose=1) print('正解率=', score[1], 'loss=', score[0]) # # 学習の様子をグラフへ描画 # # 正解率の推移をプロット # plt.plot(hist.history['acc']) # plt.plot(hist.history['val_acc']) # plt.title('Accuracy') # plt.legend(['train', 'test'], loc='upper left') # plt.show() # # # ロスの推移をプロット # plt.plot(hist.history['loss']) # plt.plot(hist.history['val_loss']) # plt.title('Loss') # plt.legend(['train', 'test'], loc='upper left') # plt.show()
Raspberry Pi 3 Model b+ 環境では15分以上かかった Raspberry Pi 4 4B-32GB 環境では10分程度かかった また
X_train = X_train[0:in_size * 20] y_train = y_train[0:in_size * 20] X_test = X_test[0:in_size * 20] y_test = y_test[0:in_size * 20]
の処理を入れないと
X_train = X_train.reshape(-1, 784).astype('float32') / 255
部分で MemoryError のエラーになって処理が止まった ■学習結果の保存と読み込み 「学習を実行」の直後に以下の処理を記述すると、学習結果をファイルに保存できる
# 学習結果を保存 model.save_weights('mnist-mlp.h5')
またその後、「学習を実行」の処理の代わりに以下を記述すると、学習結果を読み込んで使用できる 学習には非常に時間がかかることがあるので、これにより処理時間を大幅に短縮できる
# 学習結果を読み込み model.load_weights('mnist-mlp.h5')
ただし、Raspberry Pi 4 4B-32GB 環境では以下のエラーになった
AttributeError: 'str' object has no attribute 'decode'
【Keras】エラー 'str' object has no attribute 'decode'について - Qiita https://qiita.com/Hiroki-Fujimoto/items/b078bfb680fb710c38c1 Python 3.x - 【機械学習】学習済みkerasモデルのロードが出来ない|teratail https://teratail.com/questions/306240 以下でh5pyをバージョン指定でインストールしてみる なお sudo でroot権限で実行しようとすると、「sudo: pip3.7: コマンドが見つかりません」のエラーになった
$ pip3.7 install h5py==2.10.0 $ pip3.7 show h5py Name: h5py Version: 2.10.0 Summary: Read and write HDF5 files from Python Home-page: http://www.h5py.org Author: Andrew Collette Author-email: andrew.collette@gmail.com License: BSD Location: /home/pi/.local/lib/python3.7/site-packages Requires: six, numpy Required-by: Keras, Keras-Applications
これで、以下で実行できるようになった
$ python3.7 keras-perceptron.py 2021-02-20 13:07:23.519644: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory Unable to init server: Could not connect: Connection refused Unable to init server: Could not connect: Connection refused (keras-perceptron.py:17547): Gdk-CRITICAL **: 13:07:28.524: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed (keras-perceptron.py:17547): Gdk-CRITICAL **: 13:07:28.527: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. Instructions for updating: If using Keras pass *_constraint arguments to layers. 10000/10000 [==============================] - 4s 438us/sample - loss: 0.4175 - acc: 0.9662 正解率= 0.9662 loss= 0.4175194102861721
最初以下でインストールしようとしたが、pip3.7 には影響しなかった(pip3 にのみ影響した) 一つの環境に複数のPythonのバージョンを同居させているための問題だと思われる
$ sudo pip3 install h5py==2.10.0 $ pip3 show h5py
■畳み込みニューラルネットワーク(Convolutional Neural Network)で画像認識 深層学習(ディープラーニング)の原理、CNN、RNN、LSTM,GANを図解で解説 | TickTack World http://gagbot.net/machine-learning/ml4 Convolutional Neural Network(CNN)は画像認識で実績のあるニューラルネットワーク
# CNNでMNISTの分類問題に挑戦 #import keras #from keras.models import Sequential #from keras.layers import Dense, Dropout, Flatten #from keras.layers import Conv2D, MaxPooling2D #from keras.optimizers import RMSprop #from keras.datasets import mnist import tensorflow.keras as keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout, Flatten from tensorflow.keras.layers import Conv2D, MaxPooling2D from tensorflow.keras.optimizers import RMSprop from tensorflow.keras.datasets import mnist import matplotlib.pyplot as plt # 入力と出力を指定 im_rows = 28 # 画像の縦ピクセルサイズ im_cols = 28 # 画像の横ピクセルサイズ im_color = 1 # 画像の色空間/グレイスケール in_shape = (im_rows, im_cols, im_color) in_size = 28 * 28 out_size = 10 # MNISTのデータを読み込み (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train = X_train[0:in_size * 2] y_train = y_train[0:in_size * 2] X_test = X_test[0:in_size * 2] y_test = y_test[0:in_size * 2] # 読み込んだデータをの三次元配列に変換 X_train = X_train.reshape(-1, im_rows, im_cols, im_color) X_train = X_train.astype('float32') / 255 X_test = X_test.reshape(-1, im_rows, im_cols, im_color) X_test = X_test.astype('float32') / 255 # ラベルデータをone-hotベクトルに直す #y_train = keras.utils.np_utils.to_categorical(y_train.astype('int32'),10) #y_test = keras.utils.np_utils.to_categorical(y_test.astype('int32'),10) y_train = keras.utils.to_categorical(y_train.astype('int32'),10) y_test = keras.utils.to_categorical(y_test.astype('int32'),10) # CNNモデル構造を定義 model = Sequential() model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=in_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(out_size, activation='softmax')) # モデルをコンパイル model.compile( loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy']) # 学習を実行 hist = model.fit(X_train, y_train, batch_size=128, epochs=12, verbose=1, validation_data=(X_test, y_test)) # 学習結果を保存 #model.save_weights('mnist-cnn.h5') # 学習結果を読み込み #model.load_weights('mnist-cnn.h5') # モデルを評価 score = model.evaluate(X_test, y_test, verbose=1) print('正解率=', score[1], 'loss=', score[0])
以下のとおり実行
$ python3.7 keras-cnn.py 2021-02-20 13:17:35.353177: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory Unable to init server: Could not connect: Connection refused Unable to init server: Could not connect: Connection refused (keras-cnn.py:17621): Gdk-CRITICAL **: 13:17:40.334: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed (keras-cnn.py:17621): Gdk-CRITICAL **: 13:17:40.337: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. Instructions for updating: If using Keras pass *_constraint arguments to layers. Train on 1568 samples, validate on 1568 samples Epoch 1/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 1.5820 - acc: 0.4847 - val_loss: 1.0910 - val_acc: 0.6429 Epoch 2/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.6963 - acc: 0.7953 - val_loss: 0.5761 - val_acc: 0.8240 Epoch 3/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.4347 - acc: 0.8731 - val_loss: 0.4242 - val_acc: 0.8788 Epoch 4/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.3382 - acc: 0.9062 - val_loss: 0.3544 - val_acc: 0.8992 Epoch 5/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.2708 - acc: 0.9311 - val_loss: 0.3081 - val_acc: 0.9062 Epoch 6/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.2152 - acc: 0.9362 - val_loss: 0.2688 - val_acc: 0.9216 Epoch 7/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.1852 - acc: 0.9420 - val_loss: 0.2591 - val_acc: 0.9196 Epoch 8/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.1411 - acc: 0.9547 - val_loss: 0.2451 - val_acc: 0.9203 Epoch 9/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.1150 - acc: 0.9656 - val_loss: 0.2703 - val_acc: 0.9235 Epoch 10/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.0993 - acc: 0.9739 - val_loss: 0.2994 - val_acc: 0.9082 Epoch 11/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.0870 - acc: 0.9732 - val_loss: 0.2334 - val_acc: 0.9369 Epoch 12/12 1568/1568 [==============================] - 17s 11ms/sample - loss: 0.0682 - acc: 0.9777 - val_loss: 0.2361 - val_acc: 0.9324 1568/1568 [==============================] - 3s 2ms/sample - loss: 0.2361 - acc: 0.9324 正解率= 0.93239796 loss= 0.23608304721740436
Python - Kerasのto_categoricalを使おうとすると、no attributeのエラーが出てしまう。|teratail https://teratail.com/questions/277434 「学習結果を保存」の処理を有効にして学習結果を保存したあと、 「学習を実行」を「学習を実行」に変更すると、以下のように学習結果から処理を実行できる
$ python3.7 keras-cnn.py 2021-02-20 13:38:18.336257: E tensorflow/core/platform/hadoop/hadoop_file_system.cc:132] HadoopFileSystem load error: libhdfs.so: cannot open shared object file: No such file or directory Unable to init server: Could not connect: Connection refused Unable to init server: Could not connect: Connection refused (keras-cnn.py:17756): Gdk-CRITICAL **: 13:38:23.309: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed (keras-cnn.py:17756): Gdk-CRITICAL **: 13:38:23.312: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow_core/python/ops/resource_variable_ops.py:1630: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. Instructions for updating: If using Keras pass *_constraint arguments to layers. 1568/1568 [==============================] - 4s 2ms/sample - loss: 0.2332 - acc: 0.9381 正解率= 0.93813777 loss= 0.23319860234172368
★2021年2月にここまで再検証した

Advertisement