我试图了解如何在神经风格转移中计算内容损失背后的直觉。我正在阅读一篇文章:https ://medium.com/mlreview/making-ai-art-with-style-transfer-using-keras-8bb5fa44b216 ,它从内容丢失功能解释了神经风格转移的实现:

文章解释说:
F 和 P 是行数等于 N 且列数等于 M 的矩阵。
N 是第 l 层中的过滤器数量,M 是第 l 层的特征图中空间元素的数量(高度乘以宽度)。
从下面用于从特定 Conv 层获取特征/内容表示的代码中,我不太了解它是如何工作的。基本上我打印了每一行代码的输出以试图使它更容易,但它仍然留下了一些问题要问,我在代码下面列出了这些问题:
def get_feature_reps(x, layer_names, model):
"""
Get feature representations of input x for one or more layers in a given model.
"""
featMatrices = []
for ln in layer_names:
selectedLayer = model.get_layer(ln)
featRaw = selectedLayer.output
featRawShape = K.shape(featRaw).eval(session=tf_session)
N_l = featRawShape[-1]
M_l = featRawShape[1]*featRawShape[2]
featMatrix = K.reshape(featRaw, (M_l, N_l))
featMatrix = K.transpose(featMatrix)
featMatrices.append(featMatrix)
return featMatrices
def get_content_loss(F, P):
cLoss = 0.5*K.sum(K.square(F - P))
return cLoss
1-对于线featRaw = selectedLayer.output,当我打印时featRaw,我得到输出:
Tensor("block4_conv2/Relu:0", shape=(1, 64, 64, 512), dtype=float32)。
A-
Relu:0这是否意味着RELU激活还未被应用?b-我还假设我们正在输出特征图输出
block4_conv2,而不是过滤器/内核本身,对吗?c- 为什么一开始的轴是 1?我对 Conv 层的理解是,它们只是由应用于输入的过滤器/内核的数量(具有形状高度、宽度、深度)组成。
d- 是
selectedLayer.output简单地输出 Conv 层的形状,还是输出对象还包含其他信息,例如来自该层的输出特征图的像素值?
2-使用行:featMatrix = K.reshape(featRaw, (M_l, N_l)打印featMatrix将输出的位置:Tensor("Reshape:0", shape=(4096, 512), dtype=float32)。
a-这是我最困惑的地方。因此,为了获得图像的特定 Conv 层的特征/内容表示,我们只需创建一个二维矩阵,第一个是过滤器的数量,另一个是过滤器/内核的面积(高度 * 宽度)。那没有意义!我们如何从中获得图像的独特特征?!我们不会从特征图中检索任何像素值。我们只是获取过滤器/内核的区域大小和过滤器的数量,而不是检索任何内容(像素值)本身!
b- 最终
featMatrix也是转置的 - 即featMatrix = K.transpose(featMatrix)与输出Tensor("transpose:0", shape=(512, 4096), dtype=float32)。为什么会这样(即为什么要反转轴)?
3 - 最后我想知道,一旦我们检索到内容表示,我怎样才能将它输出为一个 numpy 数组并将其保存为图像?
任何帮助将非常感激。