質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

2374閲覧

データ拡張した場合、自作画像の予測正解率を上げるには?

51sep

総合スコア22

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2021/01/24 03:05

編集2021/02/21 18:49

初学者です。
MNISTデータを学習させた畳込みニューラルネットワークモデルを用いて、自作画像を予測してみました。
回答者様のご助言のもと、こちらのサイトを参考にさせていただき、データ拡張を試しました。結果、予測の正解率は上がりましたが、まだ不安定です。
現状、減数させたMNISTデータを拡張して、自作画像の予測正解率を安定して上げたいと考えていますが、以下3点の疑問点があります。どなたかアドバイスをお願いしてもよろしいでしょうか。

■疑問点
・適切なepochsの設定方法
・モデル保存の必要性(CallBack設定?)※参照サイトでは保存していました。
・以下プログラムの「model.fit_generator」以降を複数回実行した場合、正解率が(大きく)異なる理由
※特に、減数させたMNISTを拡張した場合
※実行状況:Jupyter notebookで、以下プログラムのmodel.fit_generatorから複数回実行した場合、accuracyが1回前の実行の状態を引き続いて実行される?ことはあるのでしょうか。model.fit_generatorから2回目実行した時、既にaccuracyが高い気がします(以下参照)

実行1回目と2回目


本稿の詳細を示します。

以下の質問の続きです。
画像認識の正解率が低い原因が分からない

MNISTデータ数を増やしながら「データ拡張なし・あり」を試しました。
予測に使った自作画像は、0-9の10ファイル(10クラス分類)です。
結果は、testデータの損失・正確度と、自作画像を予測させた時の正解率です。
正解率=(正解数/10ファイル)×100(%)。
恥ずかしながら、プログラムは適切かどうか分かりません。間違いがあれば、ご指摘頂けると幸いです。

■予測させる自作画像
0,1,2,3,4,5,6,7,8,9の自作画像 (28ピクセル×28ピクセルで手書きしたpngファイル)10files
自作画像10枚

■結果
データ数↑=損失↓正確度↑=正解率↑となりました。
MNISTデータが少ない場合でも、データを拡張して8~9割の正解率が得られるようになりました。

各MNISTデータ数に対し、データを拡張して実行した結果
実行結果

# 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() 

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2021/01/30 02:20

テストデータのloss/accと比較して、質問者様の手書きデータの分類正解率が低いようです。手書きデータに特性差があるのか、分類正解率の計算の方法が間違っているか、どちらかに思います。 現状提示されたコードでは、MNISTのテストデータでのloss/accまでしか無いようですので、上記の判断ができません。 ・テストデータでの分類正解率は出していますか?結果を教えて下さい。 ・質問者様の手書きデータでのloss/accは出していますか?結果を教えて下さい。 ・上記のコードを提示してください。
51sep

2021/02/01 07:48

toast-uzさん、コメントをどうもありがとうございました。 質問内容を更新しました。手持ちのプログラムと知識ではこのぐらいです。。 データ拡張すれば、MNISTのデータ数が少なくても、 全部正解するぐらいの効果があるのかと思いましたが、そうではない?のでしょうか。 データ拡張の条件が適切でないのでしょうか。。 これなら、データ拡張せずに、ただデータ数を増やせばいいのでは?、、 というのが今の「素人感覚」です。
toast-uz

2021/02/01 09:01

コード提示ありがとうございます。テストデータに対する正解率は出せますでしょうか?
guest

回答1

0

ベストアンサー

実施されようとしていることは、こちらの記事にあることと同様です。該当の記事にポイントが詳しく書かれており、ソースコードもリンクされていますので、よく比較してみてください。

以下が、質問者様のコードと比較して、気になる差異だと思います。

  • モデル階層が浅い。データ拡張に対応してモデル側も少し複雑な表現力をつける必要があるようで、記事のモデルの方が階層が深いです。
  • steps_per_epochの設定がおかしい。steps_per_epoch × batch_size = 3840固定となっています。この値はx_trainの長さとあわせるべきです。すなわち、データ拡張時の学習量が足りていません。
  • 不要なrescale=1/255が入っている。すでにデータは255で割って正規化していますので、さらに1/255で割る必要はありません。
  • データ拡張の係数が穏やかすぎる。記事のコードと見比べていただきたいですが、パラメータ(データ拡張の度合い)が10倍レベルで違います。質問者様width_shift_range=0.01 vs 記事width_shift_range=0.3など。
  • データ拡張のフィルタ種別が少なすぎる。質問者様もいくつか試してみたと言及されていますが、例示されているコード(不要なresize除きフィルタ3種)は、記事(フィルタ11種)と比較して、フィルタ種別が少なすぎます。

投稿2021/02/01 14:09

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

51sep

2021/02/02 07:02

ご回答をありがとうございます! リンクしていただいた方のサイト(もっと早く出会いたかった)で、もう少し学びたいと思います。 挙げて頂いた問題事項も、どうもありがとうございます。 勉強不足の私には、うまいこと対応できるかわかりませんが、、一つ一つ見ていきたいと思います。 この低レベルにたどり着くことすら相当時間がかかっていますし、色々とコピペで作り上げた脆弱プログラムです。本当の意味も分かっていない箇所もあります。恥ずかしながら、今はまだ人のマネしかできませんが、少しずつ問題をつぶしていければ…いいなぁと、、厳しいかな。。
51sep

2021/02/21 19:01

進捗報告です。 ご回答者様のリンク先のサイトを参照し、自分なりにデータ拡張について確認してみました。 結果、予測正解率は上がりました。 もともとMNISTデータが多い時は正解率↑でしたが、減数MNISTデータでも正解率↑となったのは、少しだけ新しい発見でした。 しかしながら、減数MNISTデータでは非常に不安定でした。条件を変えたり、複数回実行を重ねても毎回安定しませんでした。元のデータ数が少ないので拡張しても…という理由は考えられますので、この辺で一旦解決としたかったのですが、実際に画像認識させる際は、データ拡張をせざるを得ないと思いますので、減数MNISTデータでもう少し調べてみたいと思いました。ということで、引き続き確認中です。 どなたかアドバイス・突っ込み・ダメ出しをどうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問