有人可以解释一下内容丢失功能吗?

时间:2019-04-08 07:50:42

标签: python tensorflow deep-learning vgg-net style-transfer

我目前对TensorFlow和机器学习非常熟悉。我正在做一些有关样式转换的教程,现在我有一个示例代码的一部分,我以某种方式无法理解。

我想我的主要思想是:有三个图像,即内容图像,样式图像和混合图像。让我们先谈谈内容损失,因为如果我能理解的话,我也会理解样式损失。因此,我有了内容图像和混合图像(从具有某种噪声的某种分布开始),以及VGG16模型。

据我所知,我现在应该将内容图像馈送到网络中的某个层,并查看该层内容图像输入的输出(功能图)。

此后,我还应该将带有混合图像的网络馈送到与以前相同的图层,并查看混合图像输入该层的输出(功能图)。

然后我应该从这两个输出中计算损失函数,因为我希望混合图像具有与内容图像相似的特征图。

我的问题是,我在网上可以找到的示例代码中不了解该操作的完成方式。

示例代码可以如下: http://gcucurull.github.io/tensorflow/style-transfer/2016/08/18/neural-art-tf/

但是几乎所有示例都使用相同的方法。

内容丢失的定义如下:

def content_loss(cont_out, target_out, layer, content_weight):

    # content loss is just the mean square error between the outputs of a given layer
    # in the content image and the target image

    cont_loss = tf.reduce_sum(tf.square(tf.sub(target_out[layer], cont_out)))

    # multiply the loss by its weight
    cont_loss = tf.mul(cont_loss, content_weight, name="cont_loss")

return cont_loss

并且这样称呼:

# compute loss
cont_cost = losses.content_loss(content_out, model, C_LAYER, content_weight)

其中content_out是内容图像的输出,其中model是使用的模型,C_LAYER是要获取其输出的图层的引用,而content_weight是我们乘以的权重。

问题是我莫名其妙地看不到混合图像在哪里馈入网络。在我看来,“ cont_loss”用于计算内容图像的输出与图层本身之间的均方根。

魔术应该在这里:

cont_loss = tf.reduce_sum(tf.square(tf.sub(target_out[layer], cont_out)))

但是我根本找不到在给定层上这如何在内容图像的特征图和混合图像的特征图之间产生RMS。

如果有人能指出我错了并向我解释该内容损失是如何计算的,我将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

丢失会迫使网络在您选择的层上进行类似的激活。

让我们称一个来自target_out[layer] l的卷积图/像素和一个来自cont_out c的对应图。您希望它们的差异l-c尽可能小,即它们的差异的绝对值。为了数值稳定性,我们使用平方函数而不是绝对值,因为它是一个平滑函数并且更能容忍小错误。

因此,我们得到(l-c)**2,即:tf.square(tf.sub(target_out[layer], cont_out))

最后,我们希望最小化批次中每个地图和每个示例的差异。这就是为什么我们使用tf.reduce_sum将所有差异求和成单个标量的原因。