質問編集履歴

2

実行結果と疑問点を更新しました。

2021/02/21 18:49

投稿

51sep
51sep

スコア22

test CHANGED
@@ -1 +1 @@
1
- データ拡張予測正解率がらない原因が分からない
1
+ データ拡張した場合、自作画像の予測正解率げるには?
test CHANGED
@@ -1,8 +1,34 @@
1
1
  初学者です。
2
2
 
3
- MNISTデータを学習させた畳込みニューラルネットワークモデルを用いて、自作画像を予測してみました。でも、データ拡張をしても、予測の正解率は変わりませんでした。
3
+ MNISTデータを学習させた畳込みニューラルネットワークモデルを用いて、自作画像を予測してみました。
4
+
4
-
5
+ 回答者様のご助言のもと、[こちらのサイト](https://qiita.com/PoodleMaster/items/54c184d9f2f70cc011d0)を参考にさせていただき、データ拡張を試しました。結果、予測の正解率は上がりましたが、まだ不安定です。
6
+
7
+ 現状、減数させたMNISTデータを拡張して、自作画像の予測正解率を安定して上げたいと考えていますが、以下3点の疑問点があります。どなたかアドバイスをお願いしてもよろしいでしょうか。
8
+
9
+
10
+
11
+ ■疑問点
12
+
13
+ ・適切なepochsの設定方法
14
+
15
+ ・モデル保存の必要性(CallBack設定?)※参照サイトでは保存していました。
16
+
17
+ ・以下プログラムの「model.fit_generator」以降を複数回実行した場合、正解率が(大きく)異なる理由
18
+
5
- どなかアドバイスお願いてもよろしいでしょうか。
19
+ ※特に、減数させMNIST拡張た場合
20
+
21
+ ※実行状況:Jupyter notebookで、以下プログラムのmodel.fit_generatorから複数回実行した場合、accuracyが1回前の実行の状態を引き続いて実行される?ことはあるのでしょうか。model.fit_generatorから2回目実行した時、既にaccuracyが高い気がします(以下参照)
22
+
23
+
24
+
25
+ ![実行1回目と2回目](c69f8ba474da0c205d36eeadfb7a44b7.png)
26
+
27
+
28
+
29
+ ----------------------------------------------------
30
+
31
+ 本稿の詳細を示します。
6
32
 
7
33
 
8
34
 
@@ -36,23 +62,13 @@
36
62
 
37
63
  データ数↑=損失↓正確度↑=正解率↑となりました。
38
64
 
39
- おおよそ予想される結果得られましたが、データを拡張しても、それほど正解率は上がりませんでした。
65
+ MNISTデータ少ない場合でも、データを拡張して8~9割の正解率が得られるようになりました。
40
-
41
- どのような理由が考えられるのでしょうか。
66
+
42
-
43
- なお、データ拡張の条件を変えてみましたが、正解率が1割ぐらい上下する程度の違いでした。
67
+
44
-
45
-
46
-
68
+
47
- 各MNISTデータ数に対し、データ拡張・ありで実行した結果
69
+ 各MNISTデータ数に対し、データ拡張し実行した結果
48
-
70
+
49
- ![結果1](5d8d58280dc959883b04c939cace6127.png)
71
+ ![実行結果](469a2a8908d4707e79c354ebec1ef6d7.png)
50
-
51
-
52
-
53
- 上記のloss, accuracy(for test data)の際の自作画像10ファイルの予測結果と予測確率
54
-
55
- ![結果2](307df80e590bf33ffda70191c2dd2340.png)
56
72
 
57
73
 
58
74
 
@@ -60,29 +76,45 @@
60
76
 
61
77
  # import library
62
78
 
63
- # for learning
64
-
65
- from tensorflow import keras
66
-
67
- from tensorflow.keras import datasets, layers, models
68
-
69
- from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
70
-
71
- from tensorflow.keras.models import Sequential
72
-
73
- from tensorflow.keras.preprocessing.image import ImageDataGenerator
74
-
75
- # for predict
76
-
77
- import glob
79
+ import keras
80
+
81
+ import matplotlib.pyplot as plt
82
+
83
+ import numpy as np
78
84
 
79
85
  import os
80
86
 
81
- import numpy as np
87
+ import pandas as pd
88
+
82
-
89
+ import seaborn as sn
90
+
91
+ import shutil
92
+
93
+ import tensorflow as tf
94
+
83
- from PIL import Image, ImageOps
95
+ from datetime import datetime, timedelta, timezone
84
-
96
+
85
- from numpy import as array
97
+ from keras import backend as ke
98
+
99
+ from keras.callbacks import Callback, ModelCheckpoint, EarlyStopping
100
+
101
+ from keras.datasets import mnist
102
+
103
+ from keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D, BatchNormalization
104
+
105
+ from keras.models import Sequential
106
+
107
+ from keras.optimizers import RMSprop
108
+
109
+ from keras.preprocessing.image import ImageDataGenerator
110
+
111
+ from keras.utils import np_utils
112
+
113
+ from sklearn.metrics import confusion_matrix
114
+
115
+ from sklearn.model_selection import train_test_split
116
+
117
+ from tqdm import tqdm
86
118
 
87
119
 
88
120
 
@@ -92,7 +124,7 @@
92
124
 
93
125
  (x_train,y_train),(x_test,y_test)=mnist.load_data()
94
126
 
95
- #(x_train,y_train),(x_test,y_test)=(x_train[:80],y_train[:80]),(x_test[:20], y_test[:20])
127
+ (x_train,y_train),(x_test,y_test)=(x_train[:80],y_train[:80]),(x_test[:20], y_test[:20])
96
128
 
97
129
  #(x_train,y_train),(x_test,y_test)=(x_train[:160],y_train[:160]),(x_test[:40], y_test[:40])
98
130
 
@@ -114,35 +146,59 @@
114
146
 
115
147
 
116
148
 
117
- # Convolutional Neural Networks
149
+ # model
118
150
 
119
151
  model = Sequential()
120
152
 
121
- model.add(Conv2D(16,(3,3),padding='same',input_shape=(28,28,1),activation='relu'))
153
+ model.add(Conv2D(64, (3, 3), input_shape=(28,28,1), padding='same'))
154
+
155
+ BatchNormalization(axis=-1)
156
+
157
+ model.add(Activation('relu'))
158
+
159
+ model.add(Conv2D(64, (3, 3), padding='same'))
160
+
161
+ BatchNormalization(axis=-1)
162
+
163
+ model.add(Activation('relu'))
122
164
 
123
165
  model.add(MaxPooling2D(pool_size=(2,2)))
124
166
 
167
+ model.add(Dropout(0.20))
168
+
125
- model.add(Conv2D(128,(3,3),activation='relu'))
169
+ model.add(Conv2D(64, (3, 3), padding='same'))
170
+
126
-
171
+ BatchNormalization(axis=-1)
172
+
173
+ model.add(Activation('relu'))
174
+
127
- model.add(Conv2D(256,(3,3),activation='relu'))
175
+ model.add(Conv2D(64, (3, 3), padding='same'))
176
+
177
+ BatchNormalization(axis=-1)
178
+
179
+ model.add(Activation('relu'))
128
180
 
129
181
  model.add(MaxPooling2D(pool_size=(2,2)))
130
182
 
131
- model.add(Dropout(0.5))
183
+ model.add(Dropout(0.20))
184
+
185
+ model.add(Conv2D(128, (3, 3), padding='same'))
186
+
187
+ BatchNormalization(axis=-1)
188
+
189
+ model.add(Activation('relu'))
132
190
 
133
191
  model.add(Flatten())
134
192
 
135
- model.add(Dense(128,activation='relu'))
193
+ model.add(Dense(64, activation='relu'))
136
-
137
- model.add(Dropout(0.25))
194
+
138
-
139
- model.add(Dense(10,activation='softmax'))
195
+ model.add(Dense(10, activation='softmax'))
140
196
 
141
197
  model.summary()
142
198
 
143
199
 
144
200
 
145
- # model compile and learn
201
+ # model compile
146
202
 
147
203
  model.compile(optimizer='adam',
148
204
 
@@ -150,7 +206,11 @@
150
206
 
151
207
  metrics=['accuracy'])
152
208
 
209
+
210
+
211
+ # model fit
212
+
153
- model.fit(x_train,y_train,epochs=5)
213
+ model.fit(x_train,y_train,epochs=40)
154
214
 
155
215
 
156
216
 
@@ -158,37 +218,129 @@
158
218
 
159
219
  loss,acc=model.evaluate(x_test,y_test,verbose=2)
160
220
 
161
- print('accuracy:',acc)
162
-
163
-
164
-
165
- # data augmentation
166
-
167
- datagen=ImageDataGenerator(rescale=1/255,
168
-
169
- width_shift_range=0.01,
170
-
171
- height_shift_range=0.025,
172
-
173
- zoom_range=0.05)
174
-
175
-
176
-
177
- # learn
178
-
179
- history=model.fit_generator(
180
-
181
- datagen.flow(x_train,y_train,batch_size=64),
182
-
183
- steps_per_epoch=60,
184
-
185
- epochs=40,
186
-
187
- validation_data=(x_test,y_test),
188
-
189
- validation_steps=5,
190
-
191
- verbose=1)
221
+ print('loss:','{:.3f}'.format(loss),'accuracy:','{:.3f}'.format(acc))
222
+
223
+
224
+
225
+ # ImageDataGenerator
226
+
227
+ datagen = ImageDataGenerator(
228
+
229
+ featurewise_center=False,
230
+
231
+ samplewise_center=False,
232
+
233
+ featurewise_std_normalization=False,
234
+
235
+ samplewise_std_normalization=False,
236
+
237
+ zca_whitening=False,
238
+
239
+ rotation_range=10,
240
+
241
+ width_shift_range=0.1,
242
+
243
+ height_shift_range=0.1,
244
+
245
+ zoom_range=[2.0,0.1],
246
+
247
+ horizontal_flip=False,
248
+
249
+ vertical_flip=False)
250
+
251
+ datagen.fit(x_train)
252
+
253
+
254
+
255
+ datagent = ImageDataGenerator(
256
+
257
+ featurewise_center=False,
258
+
259
+ samplewise_center=False,
260
+
261
+ featurewise_std_normalization=False,
262
+
263
+ samplewise_std_normalization=False,
264
+
265
+ zca_whitening=False,
266
+
267
+ rotation_range=10,
268
+
269
+ width_shift_range=0.1,
270
+
271
+ height_shift_range=0.1,
272
+
273
+ zoom_range=[2.0,0.1],
274
+
275
+ horizontal_flip=False,
276
+
277
+ vertical_flip=False)
278
+
279
+ datagent.fit(x_test)
280
+
281
+
282
+
283
+ # parameter
284
+
285
+ # [sample] / [iteration] = [batch size]
286
+
287
+ # train : 80 / 5 = 16
288
+
289
+ # test : 20 / 2 = 10
290
+
291
+
292
+
293
+ # train : 160 / 10 = 16
294
+
295
+ # test : 40 / 5 = 8
296
+
297
+
298
+
299
+ # train : 800 / 50 = 16
300
+
301
+ # test : 200 / 10 = 20
302
+
303
+
304
+
305
+ # train : 8000 / 250 = 32
306
+
307
+ # test : 2000 / 125 = 16
308
+
309
+
310
+
311
+ # train : 60,000 / 500 = 120
312
+
313
+ # test : 10,000 / 200 = 50
314
+
315
+
316
+
317
+ epochs = 1000
318
+
319
+ iteration_train = 5
320
+
321
+ iteration_test = 2
322
+
323
+ batch_size_train = int(x_train.shape[0] / iteration_train)
324
+
325
+ batch_size_test = int(x_test.shape[0] / iteration_test)
326
+
327
+
328
+
329
+ gen_train_flow = datagen.flow(x_train, y_train, batch_size=batch_size_train)
330
+
331
+ gen_test_flow = datagent.flow(x_test, y_test, batch_size=batch_size_test)
332
+
333
+ history = model.fit(gen_train_flow,
334
+
335
+ steps_per_epoch=iteration_train,
336
+
337
+ epochs=epochs,
338
+
339
+ validation_data=gen_test_flow,
340
+
341
+ validation_steps=iteration_test)#,
342
+
343
+ #callbacks=callbacks)
192
344
 
193
345
 
194
346
 
@@ -196,83 +348,25 @@
196
348
 
197
349
  loss,acc=model.evaluate(x_test,y_test,verbose=2)
198
350
 
351
+ print('loss:','{:.3f}'.format(loss),'accuracy:','{:.3f}'.format(acc))
352
+
353
+
354
+
355
+ # graph for training
356
+
199
- print('accuracy:',acc)
357
+ acc=history.history['accuracy']#acc
200
-
201
-
202
-
203
- # classname
358
+
204
-
205
- truename = ['true0','true1','true2','true3','true4','true5','true6','true7','true8','true9']
206
-
207
- predname = ['pred0','pred1','pred2','pred3','pred4','pred5','pred6','pred7','pred8','pred9']
208
-
209
-
210
-
211
- # predict
212
-
213
- DIR = "phototest1"
214
-
215
- files = os.listdir(DIR)
216
-
217
- images = [] # for list
218
-
219
- labels = []
220
-
221
- preds = []
222
-
223
- scores = []
224
-
225
- predicts = []
226
-
227
- for file in files:
228
-
229
- file_path = os.path.join(DIR, file)
230
-
231
- img = Image.open(file_path)
232
-
233
- img = img.convert('L')
234
-
235
- img = ImageOps.invert(img) # invertion
236
-
237
- img = img.resize((28,28))
238
-
239
- x = np.asarray(img, dtype='float32')
359
+ val_acc=history.history['val_accuracy']#val_acc
240
-
241
- x2 = x/255
360
+
242
-
243
- images.append(x2)
244
-
245
- x2 = x2.reshape(-1,28,28,1)
246
-
247
- predict = model.predict(x2)
361
+ epochs=range(1,len(acc)+1)
248
-
249
- predicts.append(predict)
362
+
250
-
251
-
252
-
253
- # for print
254
-
255
- label = int(file[0])
256
-
257
- pred = int(np.argmax(predict))
258
-
259
- score = round(np.max(predict) * 100,2)
363
+ plt.plot(epochs,acc,'b',label='Training accuracy')
260
-
364
+
261
- labels.append(label)
365
+ plt.plot(epochs,val_acc,'r',label='Val accuracy')
262
-
366
+
263
- preds.append(pred)
367
+ plt.legend()
264
-
368
+
265
- scores.append(score)
369
+ plt.show()
266
-
267
- if label == pred:
268
-
269
- answer = '〇'
270
-
271
- else:
272
-
273
- answer = '×'
274
-
275
- print("ans",answer,truename[label],predname[pred],"probability",'{:.1f}%'.format(score))
276
370
 
277
371
 
278
372
 

1

結果とプログラムを更新しました。

2021/02/21 18:49

投稿

51sep
51sep

スコア22

test CHANGED
@@ -1 +1 @@
1
- データ拡張で正解率が上がらない/同程度の正確度で正解する・しないの理由が分かりません。
1
+ データ拡張で予測正解率が上がらない原因が分からない
test CHANGED
@@ -1,6 +1,8 @@
1
1
  初学者です。
2
2
 
3
- MNISTデータを学習させた畳込みニューラルネットワークモデルを用いて、自作画像予測正解率を確認たいと思っ基本的なことお恥ずかしいですが分からないことが2点あります。どなたかアドバイスお願いしてもよろしいでしょうか
3
+ MNISTデータを学習させた畳込みニューラルネットワークモデルを用いて、自作画像予測してした。でデータ拡張をしても、予測の正解率は変わりませんでし
4
+
5
+ どなたかアドバイスをお願いしてもよろしいでしょうか。
4
6
 
5
7
 
6
8
 
@@ -10,31 +12,47 @@
10
12
 
11
13
 
12
14
 
13
- MNISTデータ数をしたうえで「データ拡張なし・あり」を、予測正解率の変化を確認してみました。
15
+ MNISTデータ数を増やしながら「データ拡張なし・あり」をしました。
14
-
16
+
15
- 自作画像は、0-9の10ファイル(10クラス分類)です。
17
+ 予測に使った自作画像は、0-9の10ファイル(10クラス分類)です。
16
-
18
+
17
- 結果は、testデータの損失・正確度の平均値(各5回実行)と、そのモデルにより自作画像を予測させた時の正解率です。正解率=(正解数/10ファイル)×100(%)です。
19
+ 結果は、testデータの損失・正確度と、自作画像を予測させた時の正解率です。
18
-
20
+
19
- 平均値は、傾向を確認するために算出しました本来は、実行ごとに考察すべきだと思います。
21
+ 正解率=(正解数/10ファイル)×100(%)
20
22
 
21
23
  恥ずかしながら、プログラムは適切かどうか分かりません。間違いがあれば、ご指摘頂けると幸いです。
22
24
 
23
25
 
24
26
 
25
- 1.データ拡張をしても、正解率が上がらない。
26
-
27
- データ数↑=損失↓正確度↑=正解率↑となりました。おおよそ予想される結果が得られましたが、データを拡張しても、それほど正解率は上がりませんでした。データ拡張の条件を変えてみましたが、正解率が1割ぐらい上下する程度違いでした。どのような理由が考えられるのでしょうか。
28
-
29
-
30
-
31
- 2.同程度の正確度なのに、正解した画像の枚数が異なる。
32
-
33
- 実行ごと、損失と正確度は異なるので、各画像(0-9)の予測確率が異なることは想像できます(例えば、正解した画像の予測確率が100%だったり98.8%になること)。でも、同程度の正確度なのに、なぜ正解率が異なるのか(正解した画像の枚数が異なるのか)分かりません。重みやバイアスが多少変わっただけで、特定画像の予測結果が正解・不正解のように「大きな違い」になるのでしょうか。正解することと、損失や正確度を改善することとは別問題ということでしょうか。
34
-
35
-
36
-
37
- ![結果](560d486f4dc3fe8fc1578eb5f00148e7.png)
27
+ ■予測させる自作画像
28
+
29
+ 0,1,2,3,4,5,6,7,8,9自作画像 (28ピクセル×28ピクセル手書きしたpngファイル)10files
30
+
31
+ ![自作画像10枚](20e7f35fed4afec785d84d9cde2739b6.png)
32
+
33
+
34
+
35
+ 結果
36
+
37
+ データ数↑=損失↓正確度↑=正解率↑となりました。
38
+
39
+ おおよそ予想される結果が得られましたが、データを拡張しても、それほど正解率は上がりませんでした。
40
+
41
+ どのような理由が考えられるのでしょうか。
42
+
43
+ なお、データ拡張の条件を変えてみましたが、正解率が1割ぐらい上下する程度の違いでした。
44
+
45
+
46
+
47
+ 各MNISTデータ数に対し、データ拡張なし・ありで実行した結果
48
+
49
+ ![結果1](5d8d58280dc959883b04c939cace6127.png)
50
+
51
+
52
+
53
+ 上記のloss, accuracy(for test data)の際の自作画像10ファイルの予測結果と予測確率
54
+
55
+ ![結果2](307df80e590bf33ffda70191c2dd2340.png)
38
56
 
39
57
 
40
58
 
@@ -42,6 +60,8 @@
42
60
 
43
61
  # import library
44
62
 
63
+ # for learning
64
+
45
65
  from tensorflow import keras
46
66
 
47
67
  from tensorflow.keras import datasets, layers, models
@@ -52,6 +72,18 @@
52
72
 
53
73
  from tensorflow.keras.preprocessing.image import ImageDataGenerator
54
74
 
75
+ # for predict
76
+
77
+ import glob
78
+
79
+ import os
80
+
81
+ import numpy as np
82
+
83
+ from PIL import Image, ImageOps
84
+
85
+ from numpy import as array
86
+
55
87
 
56
88
 
57
89
  # MNIST 読込み
@@ -168,4 +200,80 @@
168
200
 
169
201
 
170
202
 
203
+ # classname
204
+
205
+ truename = ['true0','true1','true2','true3','true4','true5','true6','true7','true8','true9']
206
+
207
+ predname = ['pred0','pred1','pred2','pred3','pred4','pred5','pred6','pred7','pred8','pred9']
208
+
209
+
210
+
211
+ # predict
212
+
213
+ DIR = "phototest1"
214
+
215
+ files = os.listdir(DIR)
216
+
217
+ images = [] # for list
218
+
219
+ labels = []
220
+
221
+ preds = []
222
+
223
+ scores = []
224
+
225
+ predicts = []
226
+
227
+ for file in files:
228
+
229
+ file_path = os.path.join(DIR, file)
230
+
231
+ img = Image.open(file_path)
232
+
233
+ img = img.convert('L')
234
+
235
+ img = ImageOps.invert(img) # invertion
236
+
237
+ img = img.resize((28,28))
238
+
239
+ x = np.asarray(img, dtype='float32')
240
+
241
+ x2 = x/255
242
+
243
+ images.append(x2)
244
+
245
+ x2 = x2.reshape(-1,28,28,1)
246
+
247
+ predict = model.predict(x2)
248
+
249
+ predicts.append(predict)
250
+
251
+
252
+
253
+ # for print
254
+
255
+ label = int(file[0])
256
+
257
+ pred = int(np.argmax(predict))
258
+
259
+ score = round(np.max(predict) * 100,2)
260
+
261
+ labels.append(label)
262
+
263
+ preds.append(pred)
264
+
265
+ scores.append(score)
266
+
267
+ if label == pred:
268
+
269
+ answer = '〇'
270
+
271
+ else:
272
+
273
+ answer = '×'
274
+
275
+ print("ans",answer,truename[label],predname[pred],"probability",'{:.1f}%'.format(score))
276
+
277
+
278
+
171
279
  ```