【问题标题】:What are the causes and possible solutions to always same binary class prediction in Convolutional Neural Network using Keras?使用 Keras 在卷积神经网络中总是相同的二元类预测的原因和可能的解决方案是什么?
【发布时间】:2017-11-03 01:49:19
【问题描述】:

我正在尝试解决签名识别问题。我使用 GPDS 数据库,并合并了 Genuine 和 Forgery 签名的所有组合,从而产生了 400 万个 200x200 像素图像的输入。

我使用 Keras 创建了一个基本的 CNN,由于我的硬件限制,我只使用了大约 5000 个输入和最多 10 个 epoch 进行训练。我的问题是,当我开始训练模型(model.fit 命令)时,我的准确率在 50% 左右变化,这是我的数据集的平衡,当 epoch 结束时,准确率正好是 50%。当我在训练后尝试预测一些结果时,预测都是相同的(例如,全 1 表示真正的签名)。

不确定是否是以下问题:

  • 局部最小值
  • 解决问题复杂性的小数据集
  • 权重、学习率、动量的初始化值错误……
  • 培训不足
  • 网络问题很简单

我是使用神经网络的新手,所以也许这只是基本问题,无论如何,有人可以帮助我吗??

代码如下:

model = Sequential()
model.add(Conv2D(100, (5, 5), input_shape=(1, 200, 200), activation='relu', data_format='channels_first'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer=’adam’, metrics=['accuracy'])
model.fit(x = x, y = y, batch_size = 100, shuffle = True, epochs=10)

【问题讨论】:

  • 模型可能太简单了,尝试添加一些额外的卷积层。
  • Lucas,你能有一个验证集并绘制你的训练集和验证集的损失,以确认模型是“学习”的吗?

标签: python machine-learning deep-learning keras


【解决方案1】:

您在 sigmoid 之前使用 relu 激活 (max(0,x)),我的猜测是(取决于您的层的初始化方式)您正在使 sigmoid 饱和。

饱和 sigmoid 会导致梯度为零,因此无法学习。

【讨论】:

  • 遇到了同样的问题,谢谢。这个问题(relu 使sigmoid 饱和)仅适用于二进制分类吗?还是适用于所有类型的任务?
  • 饱和可能发生在网络中任何“可饱和”层的任何位置。阅读this bit about activation functions它可能会对您有所帮助。
【解决方案2】:

神经网络的一个很好的调试技术是看看你是否可以过拟合两个训练批次的例子。我建议这样做,看看会发生什么。如果它没有达到 0 训练损失,那么模型对于问题来说太简单了。

【讨论】:

    猜你喜欢
    • 2019-01-31
    • 2015-04-15
    • 2016-12-22
    • 2020-06-06
    • 2020-12-17
    • 2021-11-08
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多