神经网络在一个纪元后趋于平坦

2024-03-04

我正在使用 keras 创建一个卷积神经网络,尝试将图像分类为两个不同的类,并且出于某种原因,在第一个纪元之后,准确性永远不会改变。

使用 Keras 后to_categorical()我的标签看起来像:

[[0.  1.]
[1.  0.]
[1.  0.]
[0.  1.]]

我的模型的代码是:

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=[5, 5], strides=1, padding='same', activation='relu', input_shape=(imageSize, imageSize, 3)))
model.add(MaxPooling2D())
model.add(Conv2D(filters=64, kernel_size=[5, 5], strides=1, padding='same', activation='relu'))
model.add(MaxPooling2D())
model.add(Flatten())
model.add(Dense(2))
sgd = SGD()  # Use stochastic gradient descent for now
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

model.summary()

counter = 0
# Train one cycle at a time so we can shuffle data inbetween
for x in range(trainingEpochs):

    counter += 1
    print()  # New line
    print('Epoch ' + str(counter))

    trainingImages, trainingLabels = shuffle(trainingImages, trainingLabels, random_state=0)  # Shuffle both sets in unison

    model.fit(x=trainingImages, y=trainingLabels, batch_size=32, epochs=1, verbose=2)

此代码的输出结果为:

Epoch 1
36s - loss: 5.0770 - acc: 0.3554

Epoch 2
36s - loss: 4.9421 - acc: 0.3066

Epoch 3
36s - loss: 4.9421 - acc: 0.3066

Epoch 4
36s - loss: 4.9421 - acc: 0.3066

到目前为止,我已经尝试过更改批量大小、使用binary_crossentropy、更改洗牌方法、更改卷积参数、使用黑白照片而不是RGB、使用不同尺寸的图片、使用ADAM而不是SGD以及使用较低的学习率对于 SGD,但这些都没有解决问题。我很茫然,有人有什么想法吗?

编辑:trainingImages 的形状为 (287, 256, 256, 3)(如果这很重要的话)。


症状是训练损失相对较早地停止改善。假设你的问题是可以学习的,那么造成这种行为的原因有很多。这些是我的头顶想法:

  1. 输入预处理不当:

神经网络更喜欢零均值的输入。例如,如果输入全部为正,它将限制权重在同一方向上更新,这可能是不可取的(https://youtu.be/gYpoJMlgyXA https://youtu.be/gYpoJMlgyXA).

因此,您可能需要从所有图像中减去平均值(例如,从 3 个通道中的每一个通道中减去 127.5)。缩放以使每个通道中的单位标准差也可能有所帮助。

  1. 网络的泛化能力:

网络对于该任务来说不够复杂或不够深。

这很容易检查。您只需使用几张图像(例如 3 到 10 张)即可训练网络。网络应该能够过度拟合数据并将损失驱动到几乎为 0。如果不是这种情况,您可能需要添加更多层,例如使用超过 1 个 Dense 层。

另一个好主意是使用预先训练的权重(在 Keras 文档的应用程序中)。您可以调整顶部的密集层以适应您的问题。

  1. 权重初始化不当。

不正确的权重初始化会阻止网络收敛(https://youtu.be/gYpoJMlgyXA https://youtu.be/gYpoJMlgyXA,与之前相同的视频)。

对于 ReLU 激活,您可能希望使用 He 初始化而不是默认的 Glorot 初始化。我发现有时这可能是必要的,但并非总是如此。

最后,您可以使用 Keras 调试工具,例如 keras-vis、keplr-io、deep-viz-keras。它们对于打开卷积网络的黑匣子非常有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

神经网络在一个纪元后趋于平坦 的相关文章

随机推荐