我的模型训练中val_acc大幅减少,这是什么原因?

时间:2020-03-21 10:45:05

标签: tensorflow keras deep-learning neural-network artificial-intelligence

我正在训练CAT / DOG分类器。

我的模特是:

model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
            optimizer=optimizers.RMSprop(lr=1e-4),
            metrics=['acc'])
history = model.fit_generator(
                    train_generator,
                    steps_per_epoch = 100,
                    epochs=200,
                    validation_data=validation_generator,
                    validation_steps=50)

我的val_acc 〜83%,我的val_loss 〜0.36 第130-140个时代之间-不包括第136个时代 -。

Epoch 130/200
100/100 [==============================] - 69s - loss: 0.3297 - acc: 0.8574 - val_loss: 0.3595 - val_acc: 0.8331
Epoch 131/200
100/100 [==============================] - 68s - loss: 0.3243 - acc: 0.8548 - val_loss: 0.3561 - val_acc: 0.8242
Epoch 132/200
100/100 [==============================] - 71s - loss: 0.3200 - acc: 0.8557 - val_loss: 0.2725 - val_acc: 0.8157
Epoch 133/200
100/100 [==============================] - 71s - loss: 0.3236 - acc: 0.8615 - val_loss: 0.3411 - val_acc: 0.8388
Epoch 134/200
100/100 [==============================] - 70s - loss: 0.3115 - acc: 0.8681 - val_loss: 0.3800 - val_acc: 0.8073
Epoch 135/200
100/100 [==============================] - 70s - loss: 0.3210 - acc: 0.8536 - val_loss: 0.3247 - val_acc: 0.8357

Epoch 137/200
100/100 [==============================] - 66s - loss: 0.3117 - acc: 0.8602 - val_loss: 0.3396 - val_acc: 0.8351
Epoch 138/200
100/100 [==============================] - 70s - loss: 0.3211 - acc: 0.8624 - val_loss: 0.3284 - val_acc: 0.8185

我想知道为什么在第136个时代发生了什么,val_loss升至 0.84

Epoch 136/200
100/100 [==============================] - 67s - loss: 0.3061 - acc: 0.8712 - val_loss: 0.8448 - val_acc: 0.6881

这是一个非常不幸 辍学的地方,它删除了 激活矩阵 中的所有重要值,或者是什么?

这是我的最终结果:

i.stack.imgur.com/BScxe.png

模型如何解决这个问题?

谢谢:)

2 个答案:

答案 0 :(得分:1)

您使用的架构在某种程度上类似于VGG。

您正在尝试的突然下降是由于您的模型在那个时期之后就开始严重过度拟合。

根据个人经验,另一个观察结果是,在培训过程中的高级步骤中,培训和验证之间突然/如此巨大的差异发生在没有跳过连接的网络上。请注意,我指的是这种现象与“单纯的”过度拟合是不同的。

具有跳过连接的网络不会表现出这种突然的巨大掉落现象(尤其是在训练阶段的高级阶段)。主要的直觉是,借助那些跳过连接信息,梯度的信息流不会丢失。但是,在没有这种连接的非常深的卷积神经网络上,您可能会到达一个突然下降的点(由于梯度消失,即使在训练精度上也是如此)。

有关跳过/残留连接的更多信息,请在此处了解更多信息:https://www.quora.com/How-do-skip-connections-work-in-a-fully-convolutional-neural-network

更新(根据上传的照片):

突然下降仅是由分批训练引起的(希望您不在上述情况下)。使用批处理训练时(因为我们没有足够的内存来一次容纳整个数据集)。波动是正常的,恰好是在那个特定时期,权重具有这样的值,以致精度下降很多。的确,降低学习率将帮助您获得更好的准确性和验证准确性,因为这将有助于神经网络“退出”高原的可能状态。

答案 1 :(得分:1)

值波动是正常的。就您而言,这可以用您的学习率和大量的时代来解释。

您训练时间过长,已经达到平稳状态(准确性没有提高)。 在训练结束时使用较高的学习率可能会导致停滞或收敛问题。

learning rate vs validation accuracy

在图像中,您可以看到学习率= 0.1时,它可以非常快地达到高精度,但随后达到平稳并下降。对于学习率= 0.001,它达到高精度的速度较慢,但​​仍在不断提高。

因此,在您的情况下,我认为问题在于培训结束时学习率高。您可以使用可变的学习率来获得两全其美的效果,首先要大,而到最后要低。例如,在精度提高不超过0.1%之后,学习率下降到0.0000001。

您可以使用来自keras callbacks的LearningRateScheduler或ReduceLROnPlateau进行此操作

reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
                          patience=5, min_lr=1e-10)
model.fit_generator(
    train_generator,
    steps_per_epoch = 100,
    epochs=200,
    validation_data=validation_generator,
    validation_steps=50,
    callbacks=[reduce_lr])