python - 获取数组输出,但我想要一个具有 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 的数组
这是输出
解决方案
让我们了解稀疏分类交叉熵
它只会让您能够通过整数标签(而不是 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)
推荐阅读
- asp.net - 将城市名称替换为“City”
- android - Ionic 3 版本未更新——Android/Mac
- tensorflow - 您的内核可能是在没有 NUMA 支持的情况下构建的
- javascript - setInterval 在卸载前未清除
- azure - Microsoft Graph - 如何以非交互方式获取令牌?
- python-3.x - 熊猫:当第一行不是列名 Excel 文件时读取 excel 文件
- reactjs - 使用 google-map-react 的配额错误
- java - REST服务项目结构
- docker - 如何在 docker 容器中使用 gulp,以便前端构建过程在容器中进行?
- php - 未插入数据库的数据