初学者です。
MNISTデータを学習させた畳込みニューラルネットワークモデルを用いて、自作画像を予測してみました。
回答者様のご助言のもと、こちらのサイトを参考にさせていただき、データ拡張を試しました。結果、予測の正解率は上がりましたが、まだ不安定です。
現状、減数させたMNISTデータを拡張して、自作画像の予測正解率を安定して上げたいと考えていますが、以下3点の疑問点があります。どなたかアドバイスをお願いしてもよろしいでしょうか。
■疑問点
・適切なepochsの設定方法
・モデル保存の必要性(CallBack設定?)※参照サイトでは保存していました。
・以下プログラムの「model.fit_generator」以降を複数回実行した場合、正解率が(大きく)異なる理由
※特に、減数させたMNISTを拡張した場合
※実行状況:Jupyter notebookで、以下プログラムのmodel.fit_generatorから複数回実行した場合、accuracyが1回前の実行の状態を引き続いて実行される?ことはあるのでしょうか。model.fit_generatorから2回目実行した時、既にaccuracyが高い気がします(以下参照)
本稿の詳細を示します。
以下の質問の続きです。
画像認識の正解率が低い原因が分からない
MNISTデータ数を増やしながら「データ拡張なし・あり」を試しました。
予測に使った自作画像は、0-9の10ファイル(10クラス分類)です。
結果は、testデータの損失・正確度と、自作画像を予測させた時の正解率です。
正解率=(正解数/10ファイル)×100(%)。
恥ずかしながら、プログラムは適切かどうか分かりません。間違いがあれば、ご指摘頂けると幸いです。
■予測させる自作画像
0,1,2,3,4,5,6,7,8,9の自作画像 (28ピクセル×28ピクセルで手書きしたpngファイル)10files
■結果
データ数↑=損失↓正確度↑=正解率↑となりました。
MNISTデータが少ない場合でも、データを拡張して8~9割の正解率が得られるようになりました。
# import library import keras import matplotlib.pyplot as plt import numpy as np import os import pandas as pd import seaborn as sn import shutil import tensorflow as tf from datetime import datetime, timedelta, timezone from keras import backend as ke from keras.callbacks import Callback, ModelCheckpoint, EarlyStopping from keras.datasets import mnist from keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D, BatchNormalization from keras.models import Sequential from keras.optimizers import RMSprop from keras.preprocessing.image import ImageDataGenerator from keras.utils import np_utils from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split from tqdm import tqdm # MNIST 読込み mnist=keras.datasets.mnist (x_train,y_train),(x_test,y_test)=mnist.load_data() (x_train,y_train),(x_test,y_test)=(x_train[:80],y_train[:80]),(x_test[:20], y_test[:20]) #(x_train,y_train),(x_test,y_test)=(x_train[:160],y_train[:160]),(x_test[:40], y_test[:40]) #(x_train,y_train),(x_test,y_test)=(x_train[:800],y_train[:800]),(x_test[:200], y_test[:200]) #(x_train,y_train),(x_test,y_test)=(x_train[:8000],y_train[:8000]),(x_test[:2000], y_test[:2000]) x_train=x_train.reshape(x_train.shape[0],28,28,1) x_test=x_test.reshape(x_test.shape[0],28,28,1) x_train=x_train/255 x_test=x_test/255 print("x_train",x_train.shape) print("x_test",x_test.shape) # model model = Sequential() model.add(Conv2D(64, (3, 3), input_shape=(28,28,1), padding='same')) BatchNormalization(axis=-1) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3), padding='same')) BatchNormalization(axis=-1) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.20)) model.add(Conv2D(64, (3, 3), padding='same')) BatchNormalization(axis=-1) model.add(Activation('relu')) model.add(Conv2D(64, (3, 3), padding='same')) BatchNormalization(axis=-1) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Dropout(0.20)) model.add(Conv2D(128, (3, 3), padding='same')) BatchNormalization(axis=-1) model.add(Activation('relu')) model.add(Flatten()) model.add(Dense(64, activation='relu')) model.add(Dense(10, activation='softmax')) model.summary() # model compile model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # model fit model.fit(x_train,y_train,epochs=40) # evoluate for test data loss,acc=model.evaluate(x_test,y_test,verbose=2) print('loss:','{:.3f}'.format(loss),'accuracy:','{:.3f}'.format(acc)) # ImageDataGenerator datagen = ImageDataGenerator( featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, zoom_range=[2.0,0.1], horizontal_flip=False, vertical_flip=False) datagen.fit(x_train) datagent = ImageDataGenerator( featurewise_center=False, samplewise_center=False, featurewise_std_normalization=False, samplewise_std_normalization=False, zca_whitening=False, rotation_range=10, width_shift_range=0.1, height_shift_range=0.1, zoom_range=[2.0,0.1], horizontal_flip=False, vertical_flip=False) datagent.fit(x_test) # parameter # [sample] / [iteration] = [batch size] # train : 80 / 5 = 16 # test : 20 / 2 = 10 # train : 160 / 10 = 16 # test : 40 / 5 = 8 # train : 800 / 50 = 16 # test : 200 / 10 = 20 # train : 8000 / 250 = 32 # test : 2000 / 125 = 16 # train : 60,000 / 500 = 120 # test : 10,000 / 200 = 50 epochs = 1000 iteration_train = 5 iteration_test = 2 batch_size_train = int(x_train.shape[0] / iteration_train) batch_size_test = int(x_test.shape[0] / iteration_test) gen_train_flow = datagen.flow(x_train, y_train, batch_size=batch_size_train) gen_test_flow = datagent.flow(x_test, y_test, batch_size=batch_size_test) history = model.fit(gen_train_flow, steps_per_epoch=iteration_train, epochs=epochs, validation_data=gen_test_flow, validation_steps=iteration_test)#, #callbacks=callbacks) # evoluate for test data loss,acc=model.evaluate(x_test,y_test,verbose=2) print('loss:','{:.3f}'.format(loss),'accuracy:','{:.3f}'.format(acc)) # graph for training acc=history.history['accuracy']#acc val_acc=history.history['val_accuracy']#val_acc epochs=range(1,len(acc)+1) plt.plot(epochs,acc,'b',label='Training accuracy') plt.plot(epochs,val_acc,'r',label='Val accuracy') plt.legend() plt.show()
回答1件
あなたの回答
tips
プレビュー