Python 验证丢失有时会达到峰值

Python 验证丢失有时会达到峰值,python,keras,deep-learning,Python,Keras,Deep Learning,我想检测哪一个是真实图像,哪一个是伪造图像。我有+-8000个数据集图像(组合)。因此,我用LR=1e-4BS=32EPOCHS=100对模型进行了训练。这就是结果。有时,我的val损失正在急剧上升,但在那之后,它又回到了列车损失线以下。我的模型怎么了?如有任何答复,将不胜感激。提前谢谢 将损失函数想象为一个曲面,其维数与模型中的自由参数相同。该曲面中的每个点对应于一组参数值,并与损失值(您正试图最小化)关联。我假设你正在用某种梯度下降/反向传播算法训练这个CNN模型(所有的KERA都属于这一

我想检测哪一个是真实图像,哪一个是伪造图像。我有+-8000个数据集图像(组合)。因此,我用
LR=1e-4
BS=32
EPOCHS=100
对模型进行了训练。这就是结果。有时,我的val损失正在急剧上升,但在那之后,它又回到了列车损失线以下。我的模型怎么了?如有任何答复,将不胜感激。提前谢谢


将损失函数想象为一个曲面,其维数与模型中的自由参数相同。该曲面中的每个点对应于一组参数值,并与损失值(您正试图最小化)关联。我假设你正在用某种梯度下降/反向传播算法训练这个CNN模型(所有的KERA都属于这一类)

在此设置中,梯度估计将始终是有噪声的,因为您的训练数据不是整个样本空间的完整样本(不包含所有可能的输入值,否则将难以解决实际问题),并且可能没有与验证集的分布完全匹配的分布。你在计算一个基于不完全有限样本的梯度估计(可能是无限的)。因此,每一步都不会精确地指向使真实损失函数最小化的方向,但有望足够接近,使模型收敛到一个有用的解。即使你能以某种方式计算出精确的梯度,一些算法,通过设计,将不会完全遵循这个方向(例如,使用的算法)。此外,由于超调(尤其是在学习率较高的情况下),即使遵循精确的梯度方向也可能导致损失值增加

使用小批量(批量大小在调用中选择,在您的情况下为32)也会引入一些额外的噪声,因为每个权重更新迭代的梯度不会在所有可用的训练数据上计算,而只会在有限的子集(批量)上计算。这额外的噪音是一个小代价付出了相当大的加速小批量产量,导致更快的收敛

事实上,一些噪声实际上是可取的,因为它可以帮助优化器避开局部极小值,如下所示(玩具示例):

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

        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"))