为啥使用相同的 Keras 模型和输入进行预测时会得到不同的结果?

Posted

技术标签:

【中文标题】为啥使用相同的 Keras 模型和输入进行预测时会得到不同的结果?【英文标题】:Why am I getting different results on a prediction using the same Keras model and input?为什么使用相同的 Keras 模型和输入进行预测时会得到不同的结果? 【发布时间】:2021-12-18 23:41:08 【问题描述】:

在这里发帖是我最后的手段,因为我在网上找不到类似的东西。我训练了一个模型来将嵌入分类(一个简单的三层密集神经网络)。

现在我想使用经过训练的模型进行实时预测,但我发现如果我将整个 test 数据帧输入到模型中,就会得到元素号 @987654321 的预测@,并将其与我通过仅将 test 数据框的元素编号 i 输入到模型中得到的预测进行比较,我得到不同的结果。如果我解释得不够好,这是代码:

i = 522
y_pred = model.predict(X_test)
y_pred_2 = model.predict(X_test.iloc[[i]])

print (f'np.argmax(y_pred[i]) np.argmax(y_pred_2)')

output: 8 5

就好像我的模型在一次运行中处理整个测试集与一次处理一行时的行为不同。我正在使用 pandas 作为输入数据。

编辑:更多信息,y_predy_pred_2 的输出形状分别为 (603, 10)(1, 10),其中 10 是我拥有的类数。

两个预测的一些示例值,带有任意i

y_pred[i]: array([1.3353945e-02, 2.8374636e-09, 1.4435661e-08, 3.4135045e-18,
   7.7986561e-02, 3.7737598e-03, 2.0284578e-10, 2.7154891e-03,
   9.0203673e-01, 1.3346069e-04], dtype=float32)

y_pred_2 = array([[1.1702824e-16, 1.6781385e-37, 2.5281618e-33, 0.0000000e+00,
        2.3075200e-09, 1.0000000e+00, 9.9125501e-35, 6.2606384e-22,
        5.8689110e-14, 2.3486194e-24]], dtype=float32)

【问题讨论】:

检查y_predy_pred_2的形状 @PaulH 它们分别是 (603, 10) 和 (1,10),因为第一个包含对测试集中所有 603 行的预测 【参考方案1】:

np.argmax 默认为行轴。您将获得跨行的最大预测,并且希望跨列。试试:

print(f'np.argmax(y_pred[i], axis=1) np.argmax(y_pred_2, axis=1)')

【讨论】:

我得到的结果是一个形状数组(input_samples,classes),所以在这种情况下,两个 argmax 参数的结果是相同的。 我不认为它是这样工作的。如果你尝试我的建议会怎样? 我得到了相同的结果,因为问题出在 y_pred 本身而不是所选类中。 y_predy_pred_2 应该具有相同的值,但由于某种原因它们相距甚远...... 您可以打印y_pred[i]y_pred_2 并将其添加到您的帖子中吗? 我刚刚添加了一些值。每个i都会发生这种情况!

以上是关于为啥使用相同的 Keras 模型和输入进行预测时会得到不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

Keras model.predict() 为测试输入中的所有值返回相同的预测输出

在 Keras 中使用 `predict` 以与给定相同的顺序预测一维数组

为啥keras模型编译后预测速度变慢?

keras sequential 预测值为啥输出后半部分为恒定值

上传图像以使用 keras 进行预测时出现错误消息

如何使用训练有素的 Keras CNN 模型对新的未标记数据进行预测