首页 > 解决方案 > 如何处理 tf.keras 中输出标签的“无效参数错误”

问题描述

我正在使用分类标签为 1 到 8 的数据集。在使用 keras 顺序模型时,当我创建一个具有 8 个神经元的输出层时,它会给出一个无效参数错误。我的理解是它将标签识别为 0 到 7 并且不包括 8。因此,当我创建一个具有 9 个神经元的输出层时,它似乎可以工作。我的问题是,可以使用 9 个神经元而不是 8 个神经元吗?

代码如下:

model = keras.models.Sequential()
model.add(keras.layers.InputLayer(input_shape=X.shape[1:] )) 
model.add(keras.layers.Dense(70, activation="selu",kernel_initializer="lecun_normal"))
model.add(keras.layers.Dense(70, activation="selu",kernel_initializer="lecun_normal"))
model.add(keras.layers.Dense(8, activation="softmax"))

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])
history = model.fit(X, y, epochs=100,
                    validation_data=(X_test, y_test))

错误消息:InvalidArgumentError:收到的标签值 8 超出了 [0, 8) 的有效范围。标签值:2 7 7 6 8 1 2 8 6 3 6 8 2 6 1 2 5 8 8 8 1 1 7 8 2 8 6 8 7 5 8 6 [[node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits(定义于:6)] ] [操作:__inference_train_function_823581]

标签: pythontensorflowkeras

解决方案


使用 9 个神经元不是一个正确的选择。因为,您的数据集中共有 8 个类标签,所以您的 logit 向量应该是8-dimensional,然后通过应用softmax函数将其转换为分类分布,从而计算交叉熵损失。softmax 分类分布的计算包括一个归一化因子,它是 logit 向量分量的指数之和。因此,添加 9 个神经元只会使这种计算出现缺陷,因为您每次都会添加一个额外的随机值。

在这种情况下,最好的解决方案是在预处理阶段调整标签。这是一项非常简单的工作,也不需要太多编码。假设您的标签存储在一个 numpy 数组中,您可以执行以下操作:

labels = np.array([1, 2, 3, 4, 1, 5, 8]

map_dict = {1:0, 2:1, 3:2, 4:3, 5:4, 6:5, 7:6, 8:7}

for k, v in map_dict.items():
    labels[labels == k] = v

推荐阅读