获取数组输出,但我想输出一个sparse_categorical loss

时间:2019-06-18 21:12:58

标签: python machine-learning keras neural-network

我正在尝试将一个简单的神经网络与keras配合使用。我有输入,我想有一个整数输出,表示自己的一类。我希望它的范围是0-13。但是,当最后一个输出设置为1时,会给我一个错误

InvalidArgumentError: Received a label value of 12 which is outside the valid range of [0, 1).  Label values:

到目前为止,这是我用于编译神经网络的内容

import keras
from keras.models import Sequential
from keras.layers import Dense

classifier = Sequential()
classifier.add(Dense(units = 10, kernel_initializer = 'uniform', 
                     activation = 'relu', input_dim = 10))
classifier.add(Dense(units = 11, kernel_initializer = 'uniform', activation = 'relu'))
classifier.add(Dense(units = 8, kernel_initializer = 'uniform', activation = 'relu'))
classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'sparse_categorical_crossentropy', metrics = ['accuracy'])

classifier.fit(X_train, y_train, batch_size = 2000, epochs = 20)

我的训练输入是数组数组,标签只是一个值从0到12的数组

这是输出

enter image description here

2 个答案:

答案 0 :(得分:1)

让我们了解稀疏的分类交叉熵

它将恰好使您能够通过整数标签(而不是单热点数组)来测量误差。

那为什么出错?

根据我的解释,您的网络应该能够预测14个班级。因此仍然需要对网络进行一站式编码的操作(不是您的一站式编码,这只是一个闪回该方法的提醒我们的操作),您需要14个输出神经元来执行因此, 最后一层应该像这样:

classifier.add(Dense(units = 14, kernel_initializer = 'uniform', activation = 'sigmoid'))

以及使用metrics = ['sparse_categorical_accuracy']

的良好做法

如果要整数输出

有2个选项(据我所知):

y_pred = np.argmax(classifier.predict(X_test), axis=1)

或简单地:

y_pred = classifier.predict_classes(X_test)

答案 1 :(得分:0)

如果要在[0,13]范围内输入整数,则对应于14个输出类别(索引从0到13,从零开始),因此您需要适当地配置网络:

classifier.add(Dense(units = 14, kernel_initializer = 'uniform', activation = 'softmax'))

训练后,当模型进行预测时,您将获得整数[0,13]上的概率分布。要获取编码的整数,您必须以最大的概率获取索引,例如:

pred = classifier.predict(some_data)
integer = np.argmax(pred, axis=-1)

这将产生预测的整数标签。