【发布时间】:2021-05-25 07:41:31
【问题描述】:
我正在尝试实现一个稍微小一点的 VGG16 版本,并在大约 6000 张图像的数据集上从头开始训练它(5400 张用于训练,600 张用于验证)。我选择了 30 的批量大小,以便它可以整齐地放入数据集中,否则我会在训练期间得到他的 IncompatibleShape 错误。
经过 15-20 个 epoch 后,EarlyStopping 回调启动并停止训练。
这个模型我面临两个问题
- 之后,当我将测试图像传入模型时,输出 似乎保持不变。我最不希望的是对于imageA, 预测输出应该与 imageB 不同。我无法弄清楚为什么会这样
- 损失和准确性似乎没有太大变化。我预计对于 epoch 的数量,准确率至少会提高到 50% 左右,但不会超过 23%。我尝试包含 steps_per_epoch、ReduceLROnPlateau,但它们似乎没有任何影响。
训练输出:
Epoch 1/50
180/180 [==============================] - 50s 278ms/step - loss: 1.6095 - categorical_accuracy: 0.1987 - val_loss: 1.6109 - val_categorical_accuracy: 0.1267
Epoch 00001: val_loss improved from inf to 1.61094, saving model to vgg16.h5
Epoch 2/50
180/180 [==============================] - 51s 285ms/step - loss: 1.6095 - categorical_accuracy: 0.2044 - val_loss: 1.6107 - val_categorical_accuracy: 0.2133
Epoch 00002: val_loss improved from 1.61094 to 1.61067, saving model to vgg16.h5
Epoch 3/50
180/180 [==============================] - 51s 285ms/step - loss: 1.6098 - categorical_accuracy: 0.1946 - val_loss: 1.6106 - val_categorical_accuracy: 0.1400
Epoch 00003: val_loss improved from 1.61067 to 1.61059, saving model to vgg16.h5
Epoch 4/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6095 - categorical_accuracy: 0.1928 - val_loss: 1.6098 - val_categorical_accuracy: 0.2000
Epoch 00004: val_loss improved from 1.61059 to 1.60983, saving model to vgg16.h5
Epoch 00004: ReduceLROnPlateau reducing learning rate to 2.5000001187436283e-05.
Epoch 5/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6093 - categorical_accuracy: 0.2033 - val_loss: 1.6103 - val_categorical_accuracy: 0.1467
Epoch 00005: val_loss did not improve from 1.60983
Epoch 6/50
180/180 [==============================] - 51s 286ms/step - loss: 1.6094 - categorical_accuracy: 0.1989 - val_loss: 1.6106 - val_categorical_accuracy: 0.1400
Epoch 00006: val_loss did not improve from 1.60983
Epoch 7/50
180/180 [==============================] - 51s 286ms/step - loss: 1.6094 - categorical_accuracy: 0.2069 - val_loss: 1.6098 - val_categorical_accuracy: 0.1733
Epoch 00007: val_loss improved from 1.60983 to 1.60978, saving model to vgg16.h5
Epoch 00007: ReduceLROnPlateau reducing learning rate to 1e-05.
Epoch 8/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6093 - categorical_accuracy: 0.2076 - val_loss: 1.6103 - val_categorical_accuracy: 0.1600
Epoch 00008: val_loss did not improve from 1.60978
Epoch 9/50
180/180 [==============================] - 51s 286ms/step - loss: 1.6095 - categorical_accuracy: 0.2006 - val_loss: 1.6097 - val_categorical_accuracy: 0.2200
Epoch 00009: val_loss improved from 1.60978 to 1.60975, saving model to vgg16.h5
Epoch 10/50
180/180 [==============================] - 52s 287ms/step - loss: 1.6095 - categorical_accuracy: 0.2043 - val_loss: 1.6101 - val_categorical_accuracy: 0.1667
Epoch 00010: val_loss did not improve from 1.60975
Epoch 11/50
180/180 [==============================] - 51s 286ms/step - loss: 1.6094 - categorical_accuracy: 0.2009 - val_loss: 1.6102 - val_categorical_accuracy: 0.1800
Epoch 00011: val_loss did not improve from 1.60975
Epoch 12/50
180/180 [==============================] - 51s 286ms/step - loss: 1.6095 - categorical_accuracy: 0.2041 - val_loss: 1.6115 - val_categorical_accuracy: 0.1600
Epoch 00012: val_loss did not improve from 1.60975
Epoch 13/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6095 - categorical_accuracy: 0.1989 - val_loss: 1.6108 - val_categorical_accuracy: 0.1867
Epoch 00013: val_loss did not improve from 1.60975
Epoch 14/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6094 - categorical_accuracy: 0.2009 - val_loss: 1.6102 - val_categorical_accuracy: 0.1733
Epoch 00014: val_loss did not improve from 1.60975
Epoch 15/50
180/180 [==============================] - 51s 286ms/step - loss: 1.6093 - categorical_accuracy: 0.2074 - val_loss: 1.6113 - val_categorical_accuracy: 0.1467
Epoch 00015: val_loss did not improve from 1.60975
Epoch 16/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6098 - categorical_accuracy: 0.1983 - val_loss: 1.6105 - val_categorical_accuracy: 0.1867
Epoch 00016: val_loss did not improve from 1.60975
Epoch 17/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6095 - categorical_accuracy: 0.2056 - val_loss: 1.6119 - val_categorical_accuracy: 0.1667
Epoch 00017: val_loss did not improve from 1.60975
Epoch 18/50
180/180 [==============================] - 52s 286ms/step - loss: 1.6093 - categorical_accuracy: 0.1994 - val_loss: 1.6110 - val_categorical_accuracy: 0.1800
Epoch 00018: val_loss did not improve from 1.60975
Epoch 19/50
180/180 [==============================] - 51s 286ms/step - loss: 1.6095 - categorical_accuracy: 0.2026 - val_loss: 1.6103 - val_categorical_accuracy: 0.1667
Epoch 00019: val_loss did not improve from 1.60975
Restoring model weights from the end of the best epoch.
Epoch 00019: early stopping
用于获取预测的代码:
predictions = []
actuals=[]
for i, (images, labels) in enumerate( test_datasource):
if i > 2:
break
pred = model_2(images)
print(labels.shape, pred.shape)
for j in range(len(labels)):
actuals.append( labels[j])
predictions.append(pred[j])
print(labels[j].numpy(), "\t", pred[j].numpy())
以上代码的输出:
(30, 5) (30, 5)
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
(30, 5) (30, 5)
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
(30, 5) (30, 5)
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 0. 1.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[1. 0. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 1. 0. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 0. 1. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
[0. 0. 1. 0. 0.] [0.19907779 0.20320047 0.1968051 0.20173152 0.19918515]
这是模型摘要:
Model: "vgg16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_3 (InputLayer) [(30, 224, 224, 3)] 0
_________________________________________________________________
conv_1_1 (Conv2D) (30, 224, 224, 32) 896
_________________________________________________________________
conv_1_2 (Conv2D) (30, 224, 224, 32) 9248
_________________________________________________________________
maxpool_1 (MaxPooling2D) (30, 112, 112, 32) 0
_________________________________________________________________
conv_2_1 (Conv2D) (30, 112, 112, 64) 18496
_________________________________________________________________
conv_2_2 (Conv2D) (30, 112, 112, 64) 36928
_________________________________________________________________
maxpool_2 (MaxPooling2D) (30, 56, 56, 64) 0
_________________________________________________________________
conv_3_1 (Conv2D) (30, 56, 56, 128) 73856
_________________________________________________________________
conv_3_2 (Conv2D) (30, 56, 56, 128) 147584
_________________________________________________________________
conv_3_3 (Conv2D) (30, 56, 56, 128) 147584
_________________________________________________________________
maxpool_3 (MaxPooling2D) (30, 28, 28, 128) 0
_________________________________________________________________
conv_4_1 (Conv2D) (30, 28, 28, 256) 295168
_________________________________________________________________
conv_4_2 (Conv2D) (30, 28, 28, 256) 590080
_________________________________________________________________
conv_4_3 (Conv2D) (30, 28, 28, 256) 590080
_________________________________________________________________
maxpool_4 (MaxPooling2D) (30, 14, 14, 256) 0
_________________________________________________________________
conv_5_1 (Conv2D) (30, 14, 14, 256) 590080
_________________________________________________________________
conv_5_2 (Conv2D) (30, 14, 14, 256) 590080
_________________________________________________________________
conv_5_3 (Conv2D) (30, 14, 14, 256) 590080
_________________________________________________________________
maxpool_5 (MaxPooling2D) (30, 7, 7, 256) 0
_________________________________________________________________
flatten (Flatten) (30, 12544) 0
_________________________________________________________________
fc_1 (Dense) (30, 4096) 51384320
_________________________________________________________________
dropout_1 (Dropout) (30, 4096) 0
_________________________________________________________________
fc_2 (Dense) (30, 4096) 16781312
_________________________________________________________________
dropout_2 (Dropout) (30, 4096) 0
_________________________________________________________________
output (Dense) (30, 5) 20485
=================================================================
Total params: 71,866,277
Trainable params: 71,866,277
Non-trainable params: 0
代码在 Google Colab 中:https://colab.research.google.com/drive/1AWe87Zb3MvF90j3RS7sv3OiSgR86q4j_
我尝试了 VGG-16 的两个版本,一个是滤镜深度的一半,第二个是滤镜深度的四分之一。
【问题讨论】:
-
似乎即使您的训练损失在每个 epoch 之后都没有改善,而在每个 epoch 之后训练几乎相同,请再次检查训练管道,或者请在此处提及训练管道以供其他人查看
-
训练管道是指model.summary的输出吗?抱歉,我还在学习该领域的行话
-
抱歉没有注意到您已经提供了google colab链接
-
你能不能试着提高你的学习率,并检查你的损失函数是否得到了它所期望的正确输入,tensorflow.org/api_docs/python/tf/keras/losses/…
-
我在加载数据时使用 label_mode='categorical' 将标签转换为 one-hot 编码向量。标签确实是以这种方式生成的,如上所示,我将标签与预测输出进行比较。 CategoricalCrossEntropy 似乎是 one-hot 编码场景中通常使用的损失。您要求检查损失函数还有其他原因吗?我现在将尝试提高学习率。完成后会添加评论
标签: python tensorflow keras vgg-net image-classification