用于多类分类问题的 Keras 输出层,取值范围为 -128 到 127

Posted

技术标签:

【中文标题】用于多类分类问题的 Keras 输出层,取值范围为 -128 到 127【英文标题】:Keras output layer for multiclass classification problem with value range -128 to 127 【发布时间】:2022-01-22 02:24:15 【问题描述】:

我有一个 128 个神经元的输入层。两个隐藏层 128 个神经元,每个都具有 relu 激活功能。现在我很难构建我的输出层。您可以将输入值与 mnist 数据集的像素值进行比较。每个输入(128 个数值)都有一个从 -128 到 127 范围内的输出。这个范围内的每个值(-128 到 127)代表一个输出类。我用激活函数 sigmoid 承包了一个 256 的输出层。

我的代码是

model_1 = keras.Sequential([
    keras.layers.Dense(128, input_shape=(128,), activation='relu'),
    keras.layers.Dropout(.5),
    keras.layers.Dense(128, input_shape=(128,), activation='relu'),
    keras.layers.Dense(256, input_shape=(128,), activation='sigmoid')
])

model_1.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model_1.fit(X_train, Y_train, epochs=5)

在我的训练数据集中,输入输出都是int8数据类型。但是我收到这样的错误

"INVALID_ARGUMENT: Received a label value of -124 which is outside the valid range of [0, 255). Label values: 44 -26 -120 -73 -84 -21 -123 90 -14 76 -43 -8 72 -94 -78 60 -121 -98 -124 106 -79 72 -2 -79 -116 55 0 6 82 -45 -35 -17"

谁能帮我解决这个问题?我的损失函数有问题吗?如何告诉输出层我的输出类在 -128 到 127 的范围内?

【问题讨论】:

【参考方案1】:

注意一面:从损失函数可以看出,模型是分类器,输出层有 255 个神经元,太多了。

输出层的神经元个数必须与标签相同 在(某些情况下)数组的范围(y)

所以当您使用sparse_categorical_crossentropy 时,您应该将类向量转换为二进制类矩阵

to category

【讨论】:

在输出层,需要 256 个神经元,因为我有 256 个类来解决这个特定问题。但是我发现了问题。问题出在我的数据集上。不过谢谢你的评论。

以上是关于用于多类分类问题的 Keras 输出层,取值范围为 -128 到 127的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定层 Keras 上进行范围归一化

如何使用keras评估多类分类的结果?

用于不平衡多类多标签分类的神经网络

使用 LSTM Keras 的序列数据进行多类分类不起作用

使用 Keras 进行多类图像分类的多重预测

在 Keras 中训练多类图像分类器