这可能更多是关于Tensorflow梯度问题。我一直在尝试将交并比(IoU)作为损失函数实现,并遇到了一些问题。此处是计算IoU的代码片段:
def get_iou(masks, predictions):
ious = []
for i in range(batch_size):
mask = masks[i]
pred = predictions[i]
masks_sum = tf.reduce_sum(mask)
predictions_sum = tf.reduce_mean(pred)
intersection = tf.reduce_sum(tf.multiply(mask, pred))
union = masks_sum + predictions_sum - intersection
iou = intersection / union
ious.append(iou)
return ious
iou = get_iou(masks, predictions)
mean_iou_loss = -tf.log(tf.reduce_sum(iou))
train_op = tf.train.AdamOptimizer(0.001).minimize(mean_iou_loss)
它按预测的那样工作。但我遇到的问题是损失不会减少。模型确实进行了训练,但结果不尽如人意,所以我想知道我是否正确地实现了它。我需要自己计算梯度吗?我可以使用 tf.gradients()
计算 这篇论文 派生的IoU损失的梯度,但我不确定如何将其与 tf.train.AdamOptimizer()
结合使用。通过阅读文档,我觉得 compute_gradients
和 apply_gradients
是我需要使用的命令,但我找不到任何关于如何使用它们的示例。我的理解是,Tensorflow图应该能够通过链式法则自动推导出梯度。因此,在这个问题中,甚至需要自定义梯度吗?如果自定义梯度不必要,则可能只是我遇到了一个病态问题,需要调整一些超参数。
注意: 我已经尝试了Tensorflow的IoU实现,tf.metrics.mean_iou()
,但每次都会输出 inf
,所以我已放弃使用它。
loss
是如何定义的?它与mean_iou_loss
有什么关系? - Sharkymean_iou_loss
是损失函数。已经在上面修正了。 - MasterYoda