无论我使用哪种类型的激活函数,keras卷积神经网络都将预测全零

时间:2018-09-13 01:57:17

标签: python machine-learning neural-network keras

我是刚开始使用卷积神经网络和keras。作为附带项目,我从棒球参考中刮擦了MLB球员的头像。对于每个玩家,我将其图像分成不同的块(15x15像素),然后随机将图像放回原处,并记录图像是否实际放在一起。我的目标是创建一个卷积神经网络,该卷积神经网络可以识别2张图像实际何时在一起。

我的输入数据是15x30x3(将2个15x15块放在一起以制作15x30图像),对于目标是1还是0,以判断2个图像是否实际在一起。

我的数据包括: 0.7186不匹配和 0.2813个比赛

我的模型结构如下:

model = Sequential()

model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(15,30,3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

model.fit(X_train, y_train, 
      batch_size=64, epochs=10, verbose=1)

结果是:

Epoch 1/10
136996/136996 [==============================] - 21s 154us/step - loss: 
4.5399 - acc: 0.7183 
Epoch 2/10
136996/136996 [==============================] - 16s 117us/step - loss: 
4.5369 - acc: 0.7185
Epoch 3/10
136996/136996 [==============================] - 16s 117us/step - loss: 
4.5355 - acc: 0.7186
Epoch 4/10
136996/136996 [==============================] - 16s 116us/step - loss: 
4.5354 - acc: 0.7186
Epoch 5/10
136996/136996 [==============================] - 16s 116us/step - loss: 
4.5393 - acc: 0.7184
Epoch 6/10
136996/136996 [==============================] - 16s 117us/step - loss: 
4.5373 - acc: 0.7185
Epoch 7/10
136996/136996 [==============================] - 16s 117us/step - loss: 
4.5369 - acc: 0.7185
Epoch 8/10
136996/136996 [==============================] - 16s 117us/step - loss: 
4.5374 - acc: 0.7185
Epoch 9/10
136996/136996 [==============================] - 16s 117us/step - loss: 
4.5374 - acc: 0.7185
Epoch 10/10
136996/136996 [==============================] - 16s 117us/step - loss: 
4.5360 - acc: 0.7186

如果我将输出层更改为     model.add(密集(2,激活='softmax')) 并使用categorical_crossentropy作为损失,结果非常相似,并且仍然基本上预测了全零。我还摆弄了优化器。

请注意,准确性始终与我的数据集中不匹配的比例大致匹配。 IE总是预测为0。

我在做什么错了?

感谢您的所有输入。

1 个答案:

答案 0 :(得分:0)

与@dennlinger的注释一致,您应该检查类是否不平衡。如果是这样,请尝试使用类似数量的样本,或者您需要使用类权重。

在您的情况下,您有两个类别,可以像这样轻松计算权重:weight_0 = (total number of samples) / (samples with zero)weight_1 = (total number of samples) / (samples with one)

然后,在class_weight函数中添加fit参数。您可以关注this answer