我有一个使用Scikit-Learn API的Keras包装器构建的Keras分类器。神经网络有10个输出节点,训练数据全部用单热编码表示。
根据Tensorflow documentation,predict
函数输出(n_samples,)
的形状。当我拟合514541个样本时,该函数返回了一个形状为(514541, )
的数组,并且该数组的每个条目的范围都是0到9。
由于我有十个不同的输出,每个条目的数值是否与我在训练矩阵中编码的结果完全一致?
即。如果y_train
的单热编码的索引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'))
答案 0 :(得分:2)
您的问题存在一些问题。
神经网络有10个输出节点,训练数据全部用单热编码表示。
由于您的网络有10个输出节点,并且您的标签是单热编码的,因此您的模型的输出也应该是10维的,并且再次进行热编码,即形状(n_samples, 10)
。此外,由于您对最后一层使用softmax
激活,因此您的10维输出的每个元素都应该在[0,1]中,并解释为输出属于相应的概率(一个热点)编码)类。
根据Tensorflow文档,预测函数输出
(n_samples,)
的形状。
令人费解的是你提到Tensorflow的原因,而你的模型显然是Keras的模型;您应该参考Keras sequential API的predict
方法。
当我拟合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的单热编码的索引5代表"橙",预测值5意味着神经网络预测"橙"?
如果上述情况持续,是的。