【问题标题】:How to implement customized loss function and perform gradient back-propagation in tensorflow如何在tensorflow中实现自定义损失函数并进行梯度反向传播
【发布时间】:2018-07-17 16:26:47
【问题描述】:

我需要基于tensorflow框架实现YOLOv2。 首先,在我的网络设计中,每个单元格和一个类(人脸)有五个锚点,因此最终网络输出具有 n * c * h * w 形状的 4D 张量。这里n表示batch size,c = 5 *(位置坐标+客观性得分+分类概率)=5 *(4 + 1 + 1)= 30,h/w分别表示特征图的高度和宽度。 其次,YOLOv2采用多任务损失函数:

所以我定义了以下函数来计算总损失:

def yolov2_loss_function(pred, ground_truth, global_step)

这个函数接受三个参数:pred代表网络输出张量,上面已经讲过了,ground_truth代表对应的GT,global_step代表迭代次数。此函数返回一个标量值,用于表示总损失。 最后我使用下面的代码来执行 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变量只是一个标量,tensorflow框架如何知道输出张量中每个元素的residual/gradient并进一步进行反向传播呢?我知道自动差速器的机制,但自动差速器的前提是每个输出元件都应该有残差。 虽然在函数 yolov2_loss_function 中我首先计算每个元素的残差,然后输出它们的总损失。但是,tensorflow框架是如何知道每个输出元素的残差的呢?

非常感谢。

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    我认为你搞混了。

    对于任何函数可微函数 $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”。这里没有问题。

    【讨论】:

    • 感谢您的快速和友好的帮助。你的意思是我应该使用以下代码:residual_tensor = yolov2_residual_function(pred, gt, global_step) total_loss = tf.reduce_mean(tf.square(residual_tensor)) optimizer = tf.train.MomentumOptimizer(learning_rate=lr,momentum=momentum)。 minimum(total_loss, global_step=global_step) 这里,yolov2_residual_function 返回一个 4D 张量,代表输出层的残差张量,然后使用 tf.reduce_mean(tf.square(residual_tensor)) 计算总 MSE 损失。我理解对了吗?
    猜你喜欢
    • 2021-07-27
    • 2018-06-14
    • 2021-03-11
    • 2021-10-26
    • 2019-12-16
    • 2020-07-29
    • 2021-06-07
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多