python - 如何处理 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]
解决方案
使用 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
推荐阅读
- swift - 如何在 Linux 上使用 Foundation 的 URLRequest 类型?
- coldfusion - 如何将查询的查询用作子查询(Coldfusion)
- c++ - 为什么'const'在这两种情况下表现不同?
- c# - 在 C# 中通过 Tor 浏览器获取新身份的问题
- javascript - 根据 selected:option 的值更改工具提示的标题并输出到输入框
- python - 使用 gevent 池时的`NewConnectionError`
- twilio - 我可以使用 twilio 可编程聊天实现手势吗?
- javascript - 使用 ES6 反应原生文档示例
- rabbitmq - 如何关闭 celery 中的连接以避免 RabbitMQ 中的“客户端意外关闭 TCP 连接”警告
- codenameone - 代号 一个 WebSocket 代码连接服务器失败