我正在使用一个分类标签为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 1 1 7 8 2 8 6 8 7 7 5 8 6 [node sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits (定义在:6) ]
发布于 2020-10-23 15:07:06
使用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发布于 2020-10-23 15:10:16
当你在模型的顶部有8层,并且你使用稀疏类别交叉熵损失时,它希望标签值在0到7之间。当它获得8的标签时,它会创建一个错误。当您从8个神经元更改为9个神经元时,它希望看到0到8范围内的标签,因此它不会生成错误。由于没有一个样本的标签为0,因此您的网络将正确分类。
https://stackoverflow.com/questions/64495230
复制相似问题