我有一个生成 4D 输出张量的网络,其中空间维度(~像素)中每个位置的值将被解释为该位置的类概率。换句话说,输出是(num_batches, height, width, num_classes)
。我有相同大小的标签,其中真正的类被编码为 one-hot。我想用它来计算categorical-crossentropy
损失。
问题#1:K.softmax
函数需要一个2D
张量(num_batches, num_classes)
问题#2:我不确定如何合并每个仓位的损失。将张量 reshape
为(num_batches * height * width, num_classes)
然后调用K.categorical_crossentropy
是否正确?或者更确切地说,调用 K.categorical_crossentropy(num_batches, num_classes)
height*width 次并平均结果?
最佳答案
找到this issue来证实我的直觉。
简而言之:softmax 将采用 2D 或 3D 输入。如果它们是 3D,keras 将采用这样的形状(样本、时间维度、numclasses),并对最后一个应用 softmax。由于一些奇怪的原因,它不适用于 4D 张量。
解决方案:将输出 reshape 为像素序列
reshaped_output = Reshape((height*width, num_classes))(output_tensor)
然后应用你的softmax
new_output = Activation('softmax')(reshaped_output)
然后要么将目标张量 reshape 为二维,要么将最后一层 reshape 为(宽度、高度、num_classes)。
否则,如果我现在不在手机上,我会尝试使用 TimeDistributed(Activation('softmax'))
。但不知道这是否有效...稍后会尝试
我希望这有帮助:-)
关于machine-learning - 如何在 Keras 中进行逐点分类交叉熵损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43033436/