CNN分类时损失函数的选择
在使用keras进行神经网络构建时,报如下错误:
tensorflow.python.framework.错误_impl.InvalidArgumentError错误:登录和标签必须具有相同的第一维度,got logits shape[32,4]和labels shape[128]
出错原因:
model.compile(metrics=['accuracy'],optimizer='adam', loss='sparse_categorical_crossentropy')
进行分类时:
如果target是one-hot的编码形式,损失函数loss用categorical_crossentropy
one-hot编码:[0, 1, 0, 0],[1, 0, 0, 0],[0, 0, 0, 1]
如果target是数字编码,损失函数loss用sparse_categorical_crossentropy
数字编码:1, 0, 3
修改:
model.compile(metrics=['accuracy'],optimizer='adam', loss='categorical_crossentropy')
把’sparse_categorical_crossentropy’换成’categorical_crossentropy’即可。
官方定义:
categorical_crossentropy
keras.backend.categorical_crossentropy(target, output, from_logits=False)
输出张量与目标张量之间的分类交叉熵。
参数
- target: 与 output 尺寸相同的张量。
- output: 由 softmax 产生的张量 (除非 from_logits 为 True, 在这种情况下 output 应该是对数形式)。
- from_logits: 布尔值,output 是 softmax 的结果, 还是对数形式的张量。
返回
输出张量
sparse_categorical_crossentropy
keras.backend.sparse_categorical_crossentropy(target, output, from_logits=False)
稀疏表示的整数值目标的分类交叉熵。
参数
- target: 一个整数张量。
- output: 由 softmax 产生的张量 (除非 from_logits 为 True, 在这种情况下 output 应该是对数形式)。
- from_logits: 布尔值,output 是 softmax 的结果, 还是对数形式的张量。
返回
输出张量