【问题标题】:Huge decrease in val_acc in my model training, what is the reason?我的模型训练中 val_acc 大幅下降,是什么原因?
【发布时间】:2020-07-02 08:08:58
【问题描述】:

我正在训练 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.36130th-140th epoch - 不包括 136th epoch -.

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 个 epoch,val_loss 提高到 0.84

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

激活矩阵 中删除所有重要值是非常不幸 dropout 还是什么?

这是我的最终结果:

模型如何解决这个问题?

谢谢你:)

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    突然下降只是由批量训练引起的(希望你不是我上面描述的情况)。当我们使用批量训练时(因为我们没有足够的内存来一次适应整个数据集)。波动是正常的,只是碰巧在那个特定的时期,权重具有这样的值,以至于准确度下降了很多。事实上,降低学习率会帮助您获得更好的准确度和验证准确度,因为它会帮助神经网络“退出”可能的平稳状态。

    【讨论】:

    • 感谢您的建议 - +1。 i.stack.imgur.com/BScxe.png 这是我在第 200 个 epoch 之后的最终结果。我认为它不会开始过度拟合,因为它会慢慢改善?
    • 其实我就是想知道136那个epoch急剧下降的原因。因为136之后,模型在%80附近波动,没什么大的惊喜,略有提升……
    【解决方案2】:

    数值有波动是正常的。在您的情况下,可以通过您的学习率和大量时期来解释。

    你训练的时间太长了,你已经达到了一个平台期(准确性没有提高)。 在训练结束时使用较大的学习率可能会导致停滞或收敛问题。

    在图像中,您可以看到,对于学习率 = 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])
    

    【讨论】:

    • 感谢您的回答 - +1。 i.stack.imgur.com/BScxe.png 这是我在第 200 个 epoch 之后的最终结果。 IMO,我的图表看起来更像lrate=0.001 ,因为它还在继续改进?但是在第 136 个 epoch,模型以某种方式将准确度提高到 0.668。如果模型达到一个平台期,模型应该无法改进,不是吗?
    • 其实我就是想知道136那个epoch急剧下降的原因。因为136之后,模型还是正常的。
    • 您的图表看起来更像 lr=0.1,相对稳定,但到处都有大约 10% 的下降。 lr=0.0001 波动不超过 1%
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 2019-11-25
    • 2021-10-03
    相关资源
    最近更新 更多