keras 风格转移示例有一个无法解释的常数

Posted

技术标签:

【中文标题】keras 风格转移示例有一个无法解释的常数【英文标题】:keras style transfer example has an unexplained constant 【发布时间】:2021-05-04 13:56:27 【问题描述】:

我正在关注神经风格迁移的 keras 示例,在风格损失函数中它们除以数字 4,我已经阅读了 Gatys 等人的原始论文。和其他文章在寻找这个整数的含义及其对整个过程的贡献,但找不到解释。

代码来自:https://keras.io/examples/generative/neural_style_transfer/

有人知道是什么吗?

 def style_loss(style, combination):
    S = gram_matrix(style)
    C = gram_matrix(combination)
    channels = 3
    size = img_nrows * img_ncols
    return tf.reduce_sum(tf.square(S - C)) / (4.0 * (channels ** 2) * (size ** 2))

【问题讨论】:

【参考方案1】:

你可以在A Neural Algorithm of Artistic Style的原论文中找到他们这样做的原因,总之,人们这样做主要是因为在计算损失梯度之后,常数值会被抵消,所以公式会更好看。

Flij是第l层位置j处第i个过滤器的激活

NlMl 是第 l 层特征图的数量和高度乘以特征图的宽度,El 是第 l 层的样式损失

如你所见,常数值被抵消了

当然你可以在不取消梯度的常数值的情况下进行数学运算,毕竟它只是一个常数值,不会对结果产生太大影响

Paper 对内容损失的处理与样式损失相同:

Plij是l层内容图像的特征表示

虽然keras example of neural style transfer 中的代码没有取消内容丢失的常数值:

def content_loss(base, combination):
    return tf.reduce_sum(tf.square(combination - base))

或者你可以认为它使用content_weight 来抵消常量值:

loss = loss + content_weight * content_loss(
    base_image_features, combination_features
)

【讨论】:

以上是关于keras 风格转移示例有一个无法解释的常数的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 中创造恒定的价值

《Python 深度学习》刷书笔记 Chapter 8 Part-3 神经网络风格转移

Keras - 无法将我的输入数据释放到 keras 模型。检查输入时出错

无法匹配 Keras LSTM 模型所需的维数

如何在 Keras 中使用标量常数来衡量隐藏的标量输出

有状态 LSTM - 批次之间和批次内的隐藏状态转移 (Keras)