我的问题可能很容易解决,但我没有找到任何答案,也不知道如何实现,因为我对Keras和Tensorflow也很新。
问题:我使用了一个预训练的图像分割网(PSPNet,由Hengshuang Zhao等人2017),有人将权重从Caffe转换为Keras并使用Tensorflow后端(PSPNet-Keras-tensorflow)。
我想计算相对于权重的分类交叉熵损失函数的梯度,到目前为止并不是那么复杂,我可以解决。但问题是损失函数,因为我只想在预测的单个像素处丢失。
到目前为止,我失去整个图像的原因是:
weights = model.trainable_weights
gradients = model.optimizer.get_gradients(model.total_loss, weights)
# model is compiled with categorical crossentropy
input_tensor = [model.inputs[0], # input data
model.sample_weights[0], # how much to weight each sample by
model.targets[0], # labels
keras.backend.learning_phase() # train or test mode]
get_gradients = keras.backend.function(inputs=input_tensors, outputs=gradients)
如何调整此值以仅计算单个像素的损耗?
PS:之后我想迭代整个图像(~2百万像素),并为每个像素计算相对于权重的分类交叉熵损失的梯度。
感谢您提供任何帮助和建议。
答案 0 :(得分:0)
我建议您创建一个具有不同损失函数的模型,该模型仅在您感兴趣的特定像素上进行评估。
编辑:
您使用的model.total_loss
是整体损失。请查看\ keras \ engine \ training.py。你会在那里找到总损失的实际计算。尝试重现这些步骤,但您仍然需要一个不会减少空间维度的自定义丢失函数。我希望这对你来说已经足够了。