質問編集履歴
3
正しく動作するモデルについて追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -42,11 +42,11 @@
|
|
42
42
|
|
43
43
|
④別の重みをダウンロードして実行 ⇒ 最新版でないとのメッセージがでたため、元の重みに戻した
|
44
44
|
|
45
|
-
|
45
|
+
⑤転移学習を行わない場合の結果を追記いたしました(画像数とepoch数は異なる)。
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
-
# スクリプト
|
49
|
+
# 問題のスクリプト
|
50
50
|
|
51
51
|
|
52
52
|
|
@@ -196,7 +196,7 @@
|
|
196
196
|
|
197
197
|
|
198
198
|
|
199
|
-
# 結果
|
199
|
+
# 問題のスクリプトの結果
|
200
200
|
|
201
201
|
|
202
202
|
|
@@ -275,3 +275,195 @@
|
|
275
275
|
|
276
276
|
|
277
277
|
```
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
# 成功するスクリプト
|
282
|
+
|
283
|
+
```python
|
284
|
+
|
285
|
+
# 画像とラベルをtrain, validation, testで分割
|
286
|
+
|
287
|
+
X_train, X_test, y_train, y_test = train_test_split(x_all_data, y_GroundTruth, test_size=0.2, random_state=1)
|
288
|
+
|
289
|
+
X_train, X_val , y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=1)
|
290
|
+
|
291
|
+
|
292
|
+
|
293
|
+
y_train = to_categorical(y_train)
|
294
|
+
|
295
|
+
y_val = to_categorical(y_val)
|
296
|
+
|
297
|
+
y_test = to_categorical(y_test)
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
model = Sequential()
|
302
|
+
|
303
|
+
|
304
|
+
|
305
|
+
# 入力画像は224 X 224 X 3
|
306
|
+
|
307
|
+
model.add(Conv2D(16, kernel_size=(5, 5),padding='same', activation='relu',
|
308
|
+
|
309
|
+
kernel_initializer='he_normal', input_shape=(224, 224, 3)))
|
310
|
+
|
311
|
+
model.add(MaxPooling2D(pool_size=(2, 2)))
|
312
|
+
|
313
|
+
model.add(Conv2D(64, kernel_size=(5, 5),padding='same', activation='relu',
|
314
|
+
|
315
|
+
kernel_initializer='he_normal'))
|
316
|
+
|
317
|
+
model.add(MaxPooling2D(pool_size=(2, 2)))
|
318
|
+
|
319
|
+
model.add(Conv2D(128, kernel_size=(5, 5),padding='same', activation='relu',
|
320
|
+
|
321
|
+
kernel_initializer='he_normal'))
|
322
|
+
|
323
|
+
model.add(MaxPooling2D(pool_size=(2, 2)))
|
324
|
+
|
325
|
+
|
326
|
+
|
327
|
+
model.add(Flatten())
|
328
|
+
|
329
|
+
model.add(Dense(units=512))
|
330
|
+
|
331
|
+
model.add(Activation('relu'))
|
332
|
+
|
333
|
+
model.add(Dense(units=256))
|
334
|
+
|
335
|
+
model.add(Activation('relu'))
|
336
|
+
|
337
|
+
model.add(Dense(units=256))
|
338
|
+
|
339
|
+
model.add(Activation('relu'))
|
340
|
+
|
341
|
+
model.add(Dense(8, activation='softmax'))
|
342
|
+
|
343
|
+
|
344
|
+
|
345
|
+
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
|
346
|
+
|
347
|
+
|
348
|
+
|
349
|
+
history = model.fit(X_train, y_train, batch_size=8, verbose=1, epochs=15, validation_data=(X_val, y_val))
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
y_pred = model.predict(X_test, batch_size=8, verbose=0)
|
356
|
+
|
357
|
+
|
358
|
+
|
359
|
+
y_test_arg = np.argmax(y_test, axis=1)
|
360
|
+
|
361
|
+
y_pred_arg = np.argmax(y_pred, axis=1)
|
362
|
+
|
363
|
+
|
364
|
+
|
365
|
+
print("Confusion Matrix")
|
366
|
+
|
367
|
+
print(confusion_matrix(y_test_arg, y_pred_arg))
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
print('Accuracy: ', accuracy_score(y_test_arg, y_pred_arg))
|
372
|
+
|
373
|
+
print('F1 Score: ', f1_score(y_test_arg, y_pred_arg,average="macro"))
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
```
|
378
|
+
|
379
|
+
|
380
|
+
|
381
|
+
# 成功するスクリプトの結果
|
382
|
+
|
383
|
+
```python
|
384
|
+
|
385
|
+
Train on 670 samples, validate on 168 samples
|
386
|
+
|
387
|
+
Epoch 1/15
|
388
|
+
|
389
|
+
670/670 [==============================] - 22s 33ms/step - loss: 11.9808 - accuracy: 0.3149 - val_loss: 1.4312 - val_accuracy: 0.3810
|
390
|
+
|
391
|
+
Epoch 2/15
|
392
|
+
|
393
|
+
670/670 [==============================] - 6s 9ms/step - loss: 1.2536 - accuracy: 0.5746 - val_loss: 1.0848 - val_accuracy: 0.6726
|
394
|
+
|
395
|
+
Epoch 3/15
|
396
|
+
|
397
|
+
670/670 [==============================] - 6s 9ms/step - loss: 1.1292 - accuracy: 0.6149 - val_loss: 1.1626 - val_accuracy: 0.6369
|
398
|
+
|
399
|
+
Epoch 4/15
|
400
|
+
|
401
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.9577 - accuracy: 0.6343 - val_loss: 0.9260 - val_accuracy: 0.6786
|
402
|
+
|
403
|
+
Epoch 5/15
|
404
|
+
|
405
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.7463 - accuracy: 0.7313 - val_loss: 0.8360 - val_accuracy: 0.6845
|
406
|
+
|
407
|
+
Epoch 6/15
|
408
|
+
|
409
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.6855 - accuracy: 0.7507 - val_loss: 0.9705 - val_accuracy: 0.7262
|
410
|
+
|
411
|
+
Epoch 7/15
|
412
|
+
|
413
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.6168 - accuracy: 0.7731 - val_loss: 1.0714 - val_accuracy: 0.7619
|
414
|
+
|
415
|
+
Epoch 8/15
|
416
|
+
|
417
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.4977 - accuracy: 0.8164 - val_loss: 0.9056 - val_accuracy: 0.6964
|
418
|
+
|
419
|
+
Epoch 9/15
|
420
|
+
|
421
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.3705 - accuracy: 0.8716 - val_loss: 0.7673 - val_accuracy: 0.7321
|
422
|
+
|
423
|
+
Epoch 10/15
|
424
|
+
|
425
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.2310 - accuracy: 0.9075 - val_loss: 0.7087 - val_accuracy: 0.7798
|
426
|
+
|
427
|
+
Epoch 11/15
|
428
|
+
|
429
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.1560 - accuracy: 0.9418 - val_loss: 1.0097 - val_accuracy: 0.7262
|
430
|
+
|
431
|
+
Epoch 12/15
|
432
|
+
|
433
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.1333 - accuracy: 0.9507 - val_loss: 0.8617 - val_accuracy: 0.8452
|
434
|
+
|
435
|
+
Epoch 13/15
|
436
|
+
|
437
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.1456 - accuracy: 0.9478 - val_loss: 0.8585 - val_accuracy: 0.7440
|
438
|
+
|
439
|
+
Epoch 14/15
|
440
|
+
|
441
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.0938 - accuracy: 0.9716 - val_loss: 0.7732 - val_accuracy: 0.7857
|
442
|
+
|
443
|
+
Epoch 15/15
|
444
|
+
|
445
|
+
670/670 [==============================] - 6s 9ms/step - loss: 0.0609 - accuracy: 0.9836 - val_loss: 0.7505 - val_accuracy: 0.8214
|
446
|
+
|
447
|
+
|
448
|
+
|
449
|
+
Confusion Matrix
|
450
|
+
|
451
|
+
[[ 3 0 0 0 0 0 0]
|
452
|
+
|
453
|
+
[ 0 1 1 2 0 0 3]
|
454
|
+
|
455
|
+
[ 0 1 21 7 3 0 1]
|
456
|
+
|
457
|
+
[ 0 1 11 38 1 8 1]
|
458
|
+
|
459
|
+
[ 0 0 0 0 83 0 0]
|
460
|
+
|
461
|
+
[ 0 0 0 1 0 14 0]
|
462
|
+
|
463
|
+
[ 0 0 3 0 0 0 6]]
|
464
|
+
|
465
|
+
Accuracy: 0.7904761904761904
|
466
|
+
|
467
|
+
F1 Score: 0.6922323858385239
|
468
|
+
|
469
|
+
```
|
2
さらに追記しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
③input_shape = (image_size, image_size, 3)として、input_tensorでなくinput_shapeで指定 ⇒ 変化なし
|
42
42
|
|
43
|
-
|
43
|
+
④別の重みをダウンロードして実行 ⇒ 最新版でないとのメッセージがでたため、元の重みに戻した
|
44
44
|
|
45
45
|
|
46
46
|
|
1
修正点と結果を追記しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -26,6 +26,26 @@
|
|
26
26
|
|
27
27
|
|
28
28
|
|
29
|
+
# 追記(修正点と結果)
|
30
|
+
|
31
|
+
下記の点、修正いたしました。
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
①resnet50とfc_modelを削除しない(回答参考) ⇒ 変化なし
|
36
|
+
|
37
|
+
②手動でダウンロードしていた重みを自分で作成したフォルダに保存して読み込んでいたが、
|
38
|
+
|
39
|
+
"~/.keras/models/"に移動して、'imagenet'で読み込み ⇒ 変化なし
|
40
|
+
|
41
|
+
③input_shape = (image_size, image_size, 3)として、input_tensorでなくinput_shapeで指定 ⇒ 変化なし
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
|
29
49
|
# スクリプト
|
30
50
|
|
31
51
|
|
@@ -94,7 +114,7 @@
|
|
94
114
|
|
95
115
|
|
96
116
|
|
97
|
-
gc.collect()
|
117
|
+
gc.collect()
|
98
118
|
|
99
119
|
|
100
120
|
|