首页 > 解决方案 > 获取数组输出,但我想要一个具有 sparse_categorical 损失的输出

问题描述

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

这是输出

在此处输入图像描述

标签: pythonmachine-learningkerasneural-network

解决方案


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

它只会让您能够通过整数标签(而不是 one-hot 数组)来测量错误。

那么为什么会出错呢?

根据我的解释,您的网络应该能够预测 14 个类别。所以在 one-hot 编码上所做的事情仍然需要为网络完成(不是你喂 one-hot,这只是闪回那个方法来提醒我们做什么),你需要 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)

推荐阅读