【发布时间】:2019-08-20 21:20:44
【问题描述】:
这可能更像是一个 TensorFlow 梯度问题。我一直在尝试将 Intersection over Union (IoU) 作为损失来实施,并且遇到了一些问题。言归正传,这是我计算 IoU 的代码的 sn-p:
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() 计算由this paper 得出的这个IoU 损失的梯度,尽管我不确定如何将它与tf.train.AdamOptimizer() 结合起来。阅读文档,我觉得compute_gradients 和apply_gradients 是我需要使用的命令,但我找不到任何关于如何使用它们的示例。我的理解是,Tensorflow 图应该能够通过链式法则自己得出梯度。那么在这个问题中甚至需要自定义渐变吗?如果不需要自定义渐变,那么我可能只是遇到了不适定问题,需要调整一些超参数。
注意:我已经尝试过 Tensorflow 的 IoU 实现,tf.metrics.mean_iou(),但每次都会吐出inf,所以我放弃了。
【问题讨论】:
-
loss是如何定义的?它与mean_iou_loss有何关系? -
好眼光,我只是抄错了。
mean_iou_loss是损失。在上面修复它。
标签: python tensorflow conv-neural-network object-detection bounding-box