使用 Tensorflow 在联合损失上实现交集

Mas*_*oda 5 python bounding-box object-detection conv-neural-network tensorflow

这可能更像是一个 Tensorflow 梯度问题。我一直在尝试将 Intersection over Union (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)
Run Code Online (Sandbox Code Playgroud)

它按预期工作。但是,我遇到的问题是损失并没有减少。该模型确实进行了训练,但结果并不理想,所以我想知道我是否正确实施了它。我必须自己计算梯度吗?我可以计算出梯度由衍生该借条丢失本文使用tf.gradients(),虽然我不知道如何将随tf.train.AdamOptimizer()。阅读文档,我觉得compute_gradientsapply_gradients是我需要使用的命令,但我找不到有关如何使用它们的任何示例。我的理解是,Tensorflow 图应该能够通过链式法则得出梯度本身。那么在这个问题中甚至需要自定义渐变吗?如果自定义梯度不是必需的,那么我可能只是有一个不适定的问题,需要调整一些超参数。

注意:我已经尝试过 Tensorflow 的 IoU 实现tf.metrics.mean_iou(),但是inf每次都会吐出来,所以我放弃了。

Sha*_*rky 6

梯度计算发生在optimizer.minimize函数内部,因此不需要在损失函数内部显式使用。然而,您的实现只是缺少可优化、可训练的变量。

iou = get_iou(masks, predictions)
mean_iou_loss = tf.Variable(initial_value=-tf.log(tf.reduce_sum(iou)), name='loss', trainable=True)
train_op = tf.train.AdamOptimizer(0.001).minimize(mean_iou_loss)
Run Code Online (Sandbox Code Playgroud)

除了数值稳定性、可微性和特定实现之外,这应该足以将其用作损失函数,该函数会随着迭代而变化。

另请看一下:

https://arxiv.org/pdf/1902.09630.pdf

为什么不使用 IOU 进行训练呢?