Python 正在获取数组输出,但我需要一个具有稀疏\u类别损失的输出

Python 正在获取数组输出,但我需要一个具有稀疏\u类别损失的输出,python,machine-learning,keras,neural-network,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 impo

我正在尝试用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的数组

这是输出

让我们了解稀疏分类交叉熵 它将使您能够通过整数标签(而不是一个热数组)测量错误

那么为什么会出现错误呢? 根据我的解释,你的人际网络应该能够预测14个班级。因此,在一个热编码上所做的工作仍然需要在网络上完成(并不是说你给了一个热编码,这只是一个提醒我们该做什么的方法的闪回),因此,你需要14个输出神经元来完成; 最后一层应如下所示:

classifier.add(Dense(units = 14, kernel_initializer = 'uniform', activation = 'sigmoid'))
顺便说一句,使用
metrics=['sparse\u categorical\u accurity']

如果您想要整数输出 有两种选择(据我所知):

或者简单地说:

y_pred = classifier.predict_classes(X_test)
让我们了解稀疏分类交叉熵 它将使您能够通过整数标签(而不是一个热数组)测量错误

那么为什么会出现错误呢? 根据我的解释,你的人际网络应该能够预测14个班级。因此,在一个热编码上所做的工作仍然需要在网络上完成(并不是说你给了一个热编码,这只是一个提醒我们该做什么的方法的闪回),因此,你需要14个输出神经元来完成; 最后一层应如下所示:

classifier.add(Dense(units = 14, kernel_initializer = 'uniform', activation = 'sigmoid'))
顺便说一句,使用
metrics=['sparse\u categorical\u accurity']

如果您想要整数输出 有两种选择(据我所知):

或者简单地说:

y_pred = classifier.predict_classes(X_test)

如果需要[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)

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

如果您希望整数输入在[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)

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

您有一个带S形激活的输出单元,y值变化为0-13?因为对于sigmoid来说,不可能产生0-1范围以外的结果。@viceriel当我更改为relu时,它确实提供了一个输出。但是,它仍然返回一个数组数组。第一个值是我想要的输出,数组的其余部分用0.0填充,直到数组的长度为13。有没有办法让神经网络只预测数组中的第一个值?或者我必须添加额外的代码来隔离第一个值吗?您有一个带sigmoid激活的输出单元,y值变化为0-13?因为对于sigmoid来说,不可能产生0-1范围以外的结果。@viceriel当我更改为relu时,它确实提供了一个输出。但是,它仍然返回一个数组数组。第一个值是我想要的输出,数组的其余部分用0.0填充,直到数组的长度为13。有没有办法让神经网络只预测数组中的第一个值?或者我必须添加额外的代码来隔离第一个值吗?我不是一个热编码我的y。这是从0到12的绝对整数。当最后一层是14个单位时,它会生成一个数组答案,就像我上面问题中的答案一样。然而,我只想要一个0-12之间的输出,我不是一个热编码我的y。这是从0到12的绝对整数。当最后一层是14个单位时,它会生成一个数组答案,就像我上面问题中的答案一样。但是我只需要一个0-12之间的输出