machine-learning - 如何在 Keras 中进行逐点分类交叉熵损失?

标签 machine-learning neural-network keras cross-entropy loss-function

我有一个生成 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/

相关文章:

image - CNN - 图像调整大小 VS 填充(是否保持纵横比?)

python - 虚拟变量水平不存在于未见数据中

machine-learning - 神经网络可以学习简单的插值吗?

audio - 话语长度如何影响说话人识别中的神经网络?

python - 在 Pycaffe 中通过索引访问 blob

python - 使用函数式 API 初始化后如何更改网络?

python - 构建网络以检测 CT 扫描中的裂缝

python - 模型的输出张量必须是 Keras `Layer` 的输出(从而保存过去层的元数据)。当使用 CNN LSTM 的函数式 api 时

python - Keras CNN 仅预测单个类别

python - Keras2.0如何连接2个 'mask_zero=True'的Embedding层?