我正在尝试将一个简单的神经网络与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的数组
这是输出
答案 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)
这将产生预测的整数标签。