Python 在使用Keras的卷积神经网络中,始终使用相同的二元类预测的原因和可能的解决方案是什么?

Python 在使用Keras的卷积神经网络中,始终使用相同的二元类预测的原因和可能的解决方案是什么?,python,machine-learning,deep-learning,keras,Python,Machine Learning,Deep Learning,Keras,我想解决一个签名识别问题。Im使用GPDS数据库,我合并了真伪签名的所有组合,得到了400万输入的200x200像素图像 我用Keras创建了一个基本的CNN,由于硬件的限制,我只使用了大约5000个输入和最多10个训练时段。我的问题是,当我开始训练模型(model.fit命令)时,我的准确度在50%左右变化,这是数据集的平衡,而当历元结束时,准确度正好是50%。当我在训练后尝试预测一些结果时,预测结果都是一样的(例如,所有的1表示真正的签名) 不确定是否存在以下问题: 局部极小值 由于问题的

我想解决一个签名识别问题。Im使用GPDS数据库,我合并了真伪签名的所有组合,得到了400万输入的200x200像素图像

我用Keras创建了一个基本的CNN,由于硬件的限制,我只使用了大约5000个输入和最多10个训练时段。我的问题是,当我开始训练模型(model.fit命令)时,我的准确度在50%左右变化,这是数据集的平衡,而当历元结束时,准确度正好是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)

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

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


饱和乙状结肠会导致零梯度,因此没有学习。

模型可能太简单,尝试添加一些额外的卷积层。Lucas,你能有一个验证集,并绘制训练集和验证集的损失图,以确认模型是“学习”的吗?得到了同样的问题,谢谢。这个问题(即
relu
使
sigmoid
饱和)是否仅适用于二进制分类?或者对于所有类型的任务?饱和可以发生在网络中任何“饱和”层的任何位置。阅读它可能会对你有所帮助。