如何实现自定义损失函数并在张量流中执行梯度反向传播

时间:2018-07-17 16:26:48

标签: tensorflow

我需要基于tensorflow框架实现YOLOv2。 首先,在我的网络设计中,每个像元有五个锚和一个类(面),因此最终网络输出具有n * c * h * w形状的4D张量。此处n代表批次大小,c = 5 *(位置坐标+客观得分+分类概率)= 5 *(4 +1 +1)= 30,h / w分别代表特征图的高度和宽度。 其次,YOLOv2采用了多任务丢失功能: YOLOv2 loss function

因此,我定义了以下函数来计算总损失:

def yolov2_loss_function(pred, ground_truth, global_step)

此函数接受三个参数:pred代表上面已​​经描述的网络输出张量,ground_truth代表相应的GT,global_step代表迭代次数。此函数返回一个标量值,该值用于表示totol损失。 最后,我使用以下代码执行SGD训练:

......
total_loss = yolov2_loss_function(pred, gt, global_step)
optimizer = tf.train.MomentumOptimizer(learning_rate=lr, momentum=momentum).minimize(total_loss, global_step=global_step)
......

我不确定以上过程是否正确。特别是total_loss变量只是一个标量,张量流框架如何知道输出张量中每个元素的残差/梯度并进一步执行向后传播?我知道自动差动的机理,但是自动差动的前提是每个输出元件都应有残差。 尽管在函数yolov2_loss_function中,我首先计算每个元素的残差,然后输出其总损耗。但是,tensorflow框架如何知道每个输出元素的残差?

非常感谢您。

1 个答案:

答案 0 :(得分:0)

我想你把它弄混了。

对于任何可微分函数$ f \ colon \ mathbb {R} ^ n-> \ mathbb {R},x \ mapsto f(x)$偏导数$ \ frac {\ partial} {\ partial x_i} f(x)$存在。

因此,即使从标量值函数将梯度映射为标量,也可以将梯度写为矢量。

对于“ f(a,b)= a * a * b”,导数为wrt。 a是“ 2 * a * b”和wrt。 b是“ a * a”。没问题。