【问题标题】:Keras Sequential prediction always returning the same resultKeras 顺序预测总是返回相同的结果
【发布时间】:2021-07-09 18:22:12
【问题描述】:

这是我用来分类图片类别的算法 - 跑鞋、铅笔和书。然而,在 3000 个 shuffled 图像(这就是我所拥有的)上运行算法后,我注意到:

  1. 每一个epoch的val_accuracy都是一样的,等于0.3400

  2. 当我打印自己拍摄的 6 张图像的预测结果时,当它应该返回一个数值时,结果数组如下:

    [[1.][1.][1.][1.][1.][1.]]

  3. 因为它总是 1,所以它总是会为我的每一张图片预测相同的类别,在我的例子中是书。

  4. 我已经按照另一篇帖子的建议进行了一项测试,用跑鞋和铅笔各 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


【解决方案1】:

由于您尝试将数据分为 3 类,因此模型的顶层应该是

model.add(Dense(3))
model.add(Activation('softmax'))

您没有显示如何生成 X-train 和 y_train 的代码。如果 y_train 是一种热编码,那么你的 model.compile 代码应该是

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

如果 y_train 是整数,model.compile 应该是

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多