首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理tf.keras中输出标签的“无效参数错误”

如何处理tf.keras中输出标签的“无效参数错误”
EN

Stack Overflow用户
提问于 2020-10-23 14:50:58
回答 2查看 140关注 0票数 0

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

代码如下:

代码语言:javascript
复制
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 1 1 7 8 2 8 6 8 7 7 5 8 6 [node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (定义在:6) ]

EN

回答 2

Stack Overflow用户

发布于 2020-10-23 15:07:06

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

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

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-10-23 15:10:16

当你在模型的顶部有8层,并且你使用稀疏类别交叉熵损失时,它希望标签值在0到7之间。当它获得8的标签时,它会创建一个错误。当您从8个神经元更改为9个神经元时,它希望看到0到8范围内的标签,因此它不会生成错误。由于没有一个样本的标签为0,因此您的网络将正确分类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64495230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档