【发布时间】:2017-06-26 22:34:06
【问题描述】:
我正在使用 keras 创建一个卷积神经网络,以尝试将图像分类为两个不同的类别,并且由于某种原因,在第一个 epoch 之后,准确性永远不会改变。
使用 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),如果这很重要的话。
【问题讨论】:
-
我会说你的网络对于数据来说太简单了。您需要通过添加层和增加参数(权重)的数量来使其更复杂。
-
你的班级分布是什么?网络比随机好吗?
-
我猜这里报告的准确率是训练准确率?您是否尝试过使用更大的网络?
标签: python python-3.x machine-learning tensorflow keras