質問編集履歴
2
実行結果と疑問点を更新しました。
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
|
-
|
67
|
+
|
44
|
-
|
45
|
-
|
46
|
-
|
68
|
+
|
47
|
-
各MNISTデータ数に対し、データ拡張
|
69
|
+
各MNISTデータ数に対し、データを拡張して実行した結果
|
48
|
-
|
70
|
+
|
49
|
-
![結果
|
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
|
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 n
|
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
|
95
|
+
from datetime import datetime, timedelta, timezone
|
84
|
-
|
96
|
+
|
85
|
-
from
|
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
|
-
|
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
|
-
#
|
149
|
+
# model
|
118
150
|
|
119
151
|
model = Sequential()
|
120
152
|
|
121
|
-
model.add(Conv2D(
|
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(
|
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(
|
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.
|
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(
|
193
|
+
model.add(Dense(64, activation='relu'))
|
136
|
-
|
137
|
-
|
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
|
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=
|
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
|
-
#
|
166
|
-
|
167
|
-
datagen=ImageDataGenerator(
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
d
|
182
|
-
|
183
|
-
st
|
184
|
-
|
185
|
-
e
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
vali
|
190
|
-
|
191
|
-
|
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
|
-
|
357
|
+
acc=history.history['accuracy']#acc
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
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
|
-
|
359
|
+
val_acc=history.history['val_accuracy']#val_acc
|
240
|
-
|
241
|
-
|
360
|
+
|
242
|
-
|
243
|
-
images.append(x2)
|
244
|
-
|
245
|
-
x2 = x2.reshape(-1,28,28,1)
|
246
|
-
|
247
|
-
|
361
|
+
epochs=range(1,len(acc)+1)
|
248
|
-
|
249
|
-
|
362
|
+
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
# for print
|
254
|
-
|
255
|
-
label = int(file[0])
|
256
|
-
|
257
|
-
pred = int(np.argmax(predict))
|
258
|
-
|
259
|
-
|
363
|
+
plt.plot(epochs,acc,'b',label='Training accuracy')
|
260
|
-
|
364
|
+
|
261
|
-
|
365
|
+
plt.plot(epochs,val_acc,'r',label='Val accuracy')
|
262
|
-
|
366
|
+
|
263
|
-
|
367
|
+
plt.legend()
|
264
|
-
|
368
|
+
|
265
|
-
|
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
結果とプログラムを更新しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
データ拡張で正解率が上がらない
|
1
|
+
データ拡張で予測正解率が上がらない原因が分からない
|
test
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
初学者です。
|
2
2
|
|
3
|
-
MNISTデータを学習させた畳込みニューラルネットワークモデルを用いて、自作画像
|
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データの損失・正確度
|
19
|
+
結果は、testデータの損失・正確度と、自作画像を予測させた時の正解率です。
|
18
|
-
|
20
|
+
|
19
|
-
|
21
|
+
正解率=(正解数/10ファイル)×100(%)。
|
20
22
|
|
21
23
|
恥ずかしながら、プログラムは適切かどうか分かりません。間違いがあれば、ご指摘頂けると幸いです。
|
22
24
|
|
23
25
|
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
```
|