【发布时间】:2021-07-09 18:22:12
【问题描述】:
这是我用来分类图片类别的算法 - 跑鞋、铅笔和书。然而,在 3000 个 shuffled 图像(这就是我所拥有的)上运行算法后,我注意到:
-
每一个epoch的val_accuracy都是一样的,等于0.3400
-
当我打印自己拍摄的 6 张图像的预测结果时,当它应该返回一个数值时,结果数组如下:
[[1.][1.][1.][1.][1.][1.]] -
因为它总是 1,所以它总是会为我的每一张图片预测相同的类别,在我的例子中是书。
-
我已经按照另一篇帖子的建议进行了一项测试,用跑鞋和铅笔各 1000 个样本和一本书样本进行训练。结果始终是书。
算法:
model = Sequential()
model.add(Conv2D(64,(3,3), input_shape = X_train.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Conv2D(64,3,3))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Dense(1))
model.add(Activation('softmax'))
model.compile(loss="binary_crossentropy",
optimizer="adam",
metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=24, epochs=3, validation_split=0.1)
predictions = model.predict(X_test)
输出(2692 个样本,因为有些是错误的)
Train on 2692 samples, validate on 300 samples
Epoch 1/3
2692/2692 [==============================] - 17s 6ms/sample - loss: -0.0171 - accuracy: 0.3354 - val_loss: -0.5111 - val_accuracy: 0.3400
Epoch 2/3
2692/2692 [==============================] - 20s 8ms/sample - loss: -0.0171 - accuracy: 0.3354 - val_loss: -0.5111 - val_accuracy: 0.3400
Epoch 3/3
2692/2692 [==============================] - 21s 8ms/sample - loss: -0.0171 - accuracy: 0.3354 - val_loss: -0.5111 - val_accuracy: 0.3400
当我运行 print(predictions) 时,结果是:
[[1.][1.][1.][1.][1.][1.]]
谢谢!
【问题讨论】:
-
Softmax 输出总和为 1,并且您将它与一个神经元一起使用,因此结果一点也不令人惊讶。
-
我是 keras 新手,我应该如何修复代码,以便它可以描述 3 个不同类的可能性?
-
将最后一层改为
model.add(Dense(3)) -
它给了我一个错误提示 ValueError: A target array with shape (2992, 1) was passed for an output of shape (None, 3) while using as loss
binary_crossentropy.这种损失期望目标具有与输出相同的形状。 -
啊,如果你的标签是热编码的,那么损失也应该是
categorical_crossentropy,否则sparse_categorial_crossentropy。
标签: python tensorflow machine-learning keras image-classification