验证损失有时会激增

时间:2020-04-18 10:02:37

标签: python keras deep-learning

我想检测哪个是真实图像,哪个是欺骗图像。而且我有+-8000个数据集图像(组合)。所以我用LR = 1e-4 BS = 32 EPOCHS = 100训练了模型。这就是结果。有时,我的Val损失会突然增加,但之后又回到火车损失线以下。我的模型会怎样?任何答案将不胜感激。提前致谢 !

training result graph

        model = Sequential()
        inputShape = (height, width, depth)
        chanDim = -1

        # if we are using "channels first", update the input shape
        # and channels dimension
        if K.image_data_format() == "channels_first":
            inputShape = (depth, height, width)
            chanDim = 1

        model.add(Conv2D(16, (3, 3), padding="same",
            input_shape=inputShape))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(Conv2D(16, (1, 1), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.25))

        # second CONV => RELU => CONV => RELU => POOL layer set
        model.add(Conv2D(32, (1, 1), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(Conv2D(32, (1, 1), padding="same"))
        model.add(Activation("relu"))
        model.add(BatchNormalization(axis=chanDim))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Dropout(0.25))

        model.add(Flatten())
        model.add(Dense(64))
        model.add(Activation("relu"))
        model.add(BatchNormalization())
        model.add(Dropout(0.5))
        # softmax classifier
        model.add(Dense(classes))
        model.add(Activation("softmax"))

1 个答案:

答案 0 :(得分:1)

将损失函数想象成一个表面,其尺寸与模型中自由参数的数量一样多。该曲面中的每个点都对应于一组参数值,并且与损耗值(您要尝试使其最小化)相关联。我假设您正在使用某种梯度下降/反向传播算法来训练此CNN模型(所有Keras optimizers都属于此类)。

在此设置中,梯度估计将始终是嘈杂的,因为您的训练数据不是整个样本空间的完整样本(不包含所有可能的输入值,否则对于现实世界中的问题将难以处理)没有与验证集的分布完全匹配的分布。您正在基于universe(可能是无限的)的不完整有限样本计算梯度的估计。因此,每一步都不会完全朝着使真实损失函数最小化的方向发展,但希望会足够接近以使模型收敛到一个有用的解决方案。即使您可以某种方式计算出精确的梯度,某些算法在设计上也不会完全遵循该方向(例如,使用momentum的算法)。此外,由于过冲(尤其是学习率较高),即使遵循精确的梯度方向也可能导致损耗值增加。

使用小批量(在model.fit()的调用中选择了批量大小,在您的情况下为32)也会引入一些额外的噪声,因为每次重量更新迭代的梯度都不会全部计算出来可用的训练数据,但只有一个有限的子集(批次)。考虑到小批量产量的显着提高,这种额外的噪声要付出很小的代价,从而导致更快的收敛。

实际上,实际上需要一些噪声,因为它可以帮助优化器摆脱局部最小值,如下所示(玩具示例):

Perfect gradient descent vs. Noisy gradient descent

因此,为回答您的问题,由于上述原因以及验证和训练集的事实,在训练过程中出现尖峰是完全正常的,无论是验证或训练损失是样本空间的有限样本和不完整样本。我怀疑验证指标可能更加嘈杂,因为验证集通常比训练集小得多,并且不是优化的目标(训练/验证分布可能不会完全重叠)。