我的 Keras CNN 不学习

数据挖掘 神经网络 深度学习 喀拉斯 张量流 美国有线电视新闻网
2022-02-11 18:44:55

我正在尝试使用 Keras,并设法构建了一个简单的 CNN 来对蓝色图像(相同蓝色阴影的 300x300 图像)和红色图像(相同大小,只是红色)进行分类。这是一个虚拟问题,我认为 NN 会立即解决,但情况似乎并非如此。事实上,即使在 20+ epochs 之后,准确率仍然是 50%。

我认为我可以尝试做很多不同的事情,但是我在这里做的任何异常错误可能会导致在如此简单的任务中表现如此糟糕吗?

# Create a Keras model.
model = keras.Sequential()
model.add(
    keras.layers.Conv2D(
        input_shape=(300, 300, 3),
        filters=64,
        kernel_size=(3, 3),
        activation='relu',
    )
)
model.add(
    keras.layers.Conv2D(
        filters=64,
        kernel_size=(3, 3),
        activation='relu',
    )
)
model.add(
    keras.layers.MaxPooling2D(
        pool_size=(2, 2),
        strides=(2, 2),
    )
)
model.add(keras.layers.Flatten())
model.add(
    keras.layers.Dense(
        units=128,
        activation='relu'
    )
)
model.add(keras.layers.Dropout(0.5))
model.add(
    keras.layers.Dense(
        units=1,
        activation='sigmoid',
    )
)

# Train the model.
sgd = keras.optimizers.SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(
    optimizer=sgd,
    loss='mean_squared_error',
    metrics=['binary_accuracy']
)
model.fit(images, labels, epochs=20, batch_size=5)

哪个输出:

20/20 [==============================] - 18s 887ms/step - loss: 0.5954 - binary_accuracy: 0.4000
Epoch 2/20
20/20 [==============================] - 16s 794ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 3/20
20/20 [==============================] - 16s 781ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 4/20
20/20 [==============================] - 17s 853ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 5/20
20/20 [==============================] - 18s 877ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 6/20
20/20 [==============================] - 18s 891ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 7/20
20/20 [==============================] - 17s 825ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 8/20
20/20 [==============================] - 17s 861ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 9/20
20/20 [==============================] - 17s 846ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 10/20
20/20 [==============================] - 17s 835ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 11/20
20/20 [==============================] - 16s 800ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 12/20
20/20 [==============================] - 16s 806ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 13/20
20/20 [==============================] - 16s 811ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 14/20
20/20 [==============================] - 17s 827ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 15/20
20/20 [==============================] - 16s 806ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 16/20
20/20 [==============================] - 16s 786ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 17/20
20/20 [==============================] - 16s 795ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 18/20
20/20 [==============================] - 16s 796ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 19/20
20/20 [==============================] - 16s 788ms/step - loss: 0.5000 - binary_accuracy: 0.5000
Epoch 20/20
20/20 [==============================] - 16s 794ms/step - loss: 0.5000 - binary_accuracy: 0.5000
3个回答

如果你还记得这个理论,CNN 内核基本上是根据边缘检测原理工作的。因此,既然您的图片是纯蓝色或纯红色,则没有边缘。我猜这是这里的主要问题,因为我认为 ML 库会初始化适合边缘检测的内核。为了更全面:

  • 由于内核是随机小数,因此红色内核的总和几乎等于蓝色内核的总和。下一层在下一层的所有通道中将主要有 ( sum of red kernel * 255) 和 ( sum of blue kernel * 255),这将大致相等。由于您使用了不适当的损失函数,CNN 对内核总和的差异导致的微小变化变得不敏感。

我会建议:

  • 将填充更改为相同可能会起作用,因为那时将在图片中引入边缘(黑-红,黑-蓝)。
  • 尝试在图片的一侧添加显着的白色边缘。
  • 平方误差对 sigmoid 激活效果不佳,您需要使用交叉熵损失。
  • 我必须相信尝试使用较小的学习率,因为 CNN 存在梯度爆炸的问题。

一些东西:

  1. 您确定您的数据/标签设置正确吗?
  2. 每个类的每个示例都完全相同吗?
  3. 最重要的是,为什么要使用均方误差?你的目标值不应该是 0 和 1,你的损失函数不应该是二元交叉熵吗?

根据您的评论和您的整体架构,看看您的分类层、密集层。你只有一个神经元,它只是提取特征的线性分离器。此外,您正在删除提取的特征并将它们以速率馈送到线性分离器0.5这意味着您正在破坏信号。尽量不要先使用 dropout 来找到一个可以很好地学习数据的模型,甚至记住它以找到适合您的任务的模型,并在 flatten 层之后和最后一层之前添加至少一个更密集的层也许10神经元对非线性数据点进行分类。看来你的任务是分类,所以继续使用二元交叉熵。