【问题标题】:MultiClass Keras Classifier prediction output meaningMultiClass Keras Classifier 预测输出含义
【发布时间】:2018-06-19 00:10:21
【问题描述】:

我有一个使用 Scikit-Learn API 的 Keras 包装器构建的 Keras 分类器。神经网络有10个输出节点,训练数据全部使用one-hot编码表示。

根据Tensorflowdocumentationpredict函数输出(n_samples,)的形状。当我拟合了 514541 个样本时,函数返回了一个形状为(514541, ) 的数组,数组的每个条目的范围是 0 到 9。

由于我有十个不同的输出,每个条目的数值是否与我在训练矩阵中编码的结果完全对应?

即如果我的y_train 的 one-hot 编码的索引 5 表示“橙色”,那么预测值 5 是否意味着神经网络预测为“橙色”?

这是我的模型示例:

model = Sequential()
model.add(Dropout(0.2, input_shape=(32,) ))

model.add(Dense(21, activation='selu'))
model.add(Dropout(0.5))

model.add(Dense(10, activation='softmax'))

【问题讨论】:

  • 你能分享一些代码吗?
  • @gidim 当然,我已经附上了我的代码。

标签: tensorflow machine-learning neural-network keras one-hot-encoding


【解决方案1】:

您的问题存在一些问题。

神经网络有10个输出节点,训练数据全部使用one-hot编码表示。

由于您的网络有 10 个输出节点,并且您的标签是单热编码的,因此您的模型的输出也应该是 10 维的,并且再次热编码,即形状为 (n_samples, 10)。此外,由于您在最后一层使用softmax 激活,因此 10 维输出的每个元素都应该在 [0, 1] 中,并解释为输出属于各自的概率(单热编码)类。

根据 Tensorflow 文档,预测函数输出的形状为 (n_samples,)

令人费解的是,为什么您提到 Tensorflow,而您的模型显然是 Keras 模型;你应该参考Keras sequential APIpredict方法。

当我拟合 514541 个样本时,该函数返回一个形状为 (514541, ) 的数组,该数组的每个条目的范围为 0 到 9。

如果发生这种情况,那一定是由于代码中的后面部分没有在此处显示;在任何情况下,想法都是从每个 10 维网络输出中找到具有最高值的 参数(由于它们被解释为概率,因此具有最高值的元素是直观的最有可能)。换句话说,在你的代码中一定有这样的东西:

pred = model.predict(x_test)
y = np.argmax(pred, axis=1) # numpy must have been imported as np

这将给出一个形状为(n_samples,) 的数组,每个y 是一个介于0 和9 之间的整数,正如您报告的那样。

即如果我对 y_train 的 one-hot 编码的索引 5 表示“橙色”,那么预测值为 5 是否意味着神经网络预测为“橙色”?

只要上述条件成立,是的。

【讨论】:

  • 感谢您的回答。我在问题中引用 Tensorflow 文档的原因是我使用了 tf.keras.wrappers.scikit_learn.KerasClassifier 类来创建我的模型。我提供的代码是我构建函数的一部分,在Keras docs 中有说明。
  • 此外,您能否详细说明“10 维输出的每个元素都应在 [0, 1] 中”的含义?谢谢
  • @EmersonH​​sieh 我的意思是[0.8, 0.565, 0.122,..., 0.93](10 元素列表/数组)
猜你喜欢
  • 2016-10-31
  • 2018-02-16
  • 1970-01-01
  • 2021-12-18
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 2017-08-27
相关资源
最近更新 更多