CNN 的高、持续训练损失

数据挖掘 机器学习 神经网络 喀拉斯 美国有线电视新闻网 ocr
2022-03-01 10:08:39

我尝试用 CNN 解决多字符手写问题,但我遇到了训练损失(~125.0)和验证损失(~130.0)都很高并且没有减少的问题。我在 Keras 中使用以下架构:

x = Convolution2D(32, (3, 3), padding ='same', kernel_initializer='he_normal')(model_input)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Convolution2D(32, (3, 3), kernel_initializer='he_normal')(x)
x = Activation('relu')(x)
x = MaxPooling2D(pool_size=(2, 2))(x)
x = Dropout(0.25)(x)
x = Flatten()(x)
conv_out = (Dense(512, activation='relu', kernel_constraint=maxnorm(3)))(x)

lst = [x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13]

sgd = SGD(lr=lrate, momentum=0.9, decay=lrate/nb_epoch, nesterov=False)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

在人工检查中,我发现所有预测的标签都是一个恒定序列。

有哪些可能的改进方法?训练数据似乎还可以(至少就任何一堆笔迹而言)。

1个回答

我怀疑你正面临一个垂死的 ReLU 问题。检查每一层的梯度,看看它们是否开始变为 0。由于反向传播的工作方式和链式法则的简单应用,一旦梯度为 0,它就不再对模型做出贡献。因此,如果您的模型卡住了,那么您的大量神经元现在很可能已经死亡。

尝试使用 LeakyRelu 或 Maxout 看看是否有帮助。