PyTorch 教程-用于风格转移的Gram矩阵
之前,我们提取了我们想要的内容和风格图像的所有相关特征。卷积神经网络在提取输入图像的内容元素方面表现出色。
提取的风格特征需要一个额外的预处理步骤才能更有用。研究人员使用了Gram矩阵进行更有效的风格特征提取,并将其视为重要的步骤。从卷积网络提取的任何特征仍然包含内容相关的信息,比如对象结构和定位。
通过将Gram矩阵应用于这些提取的特征,可以消除这些与内容相关的信息,而不会影响风格信息。从图像中提取风格是一个广泛的主题。将Gram矩阵应用于从卷积神经网络中提取的特征有助于创建与数据相关的纹理信息。
Gram矩阵使用以下简单的方程定义:
Gram=V^T V
这里,V是任意向量,与其转置相乘。
定义gram_matrix()函数
#Initializing gram_matrix function for our tensor image
def gram_matrix(tensor):
#Unwrapping the tensor dimensions into respective variables i.e. batch size, distance, height and width
_,d,h,w=tensor.size()
#Reshaping data into a two dimensional of array or two dimensional of tensor
tensor=tensor.view(d,h*w)
#Multiplying the original tensor with its own transpose using torch.mm
#tensor.t() will return the transpose of original tensor
gram=torch.mm(tensor,tensor.t())
#Returning gram matrix
return gram
将gram_matrix()函数应用于风格特征
我们有了特征提取函数和Gram矩阵函数,可以进行风格转移的过程了。现在,我们将gram_matrix()函数应用于先前提取的风格特征。
现在,我们将为样式克隆创建一个字典,并将每个层映射到其相应特征的Gram矩阵。我们的字典的键将是特定的层。值将包含相同层的相应样式特征的Gram矩阵。之后,我们将迭代我们样式特征字典中的每个层,以获取我们之前提取的所有特征的Gram矩阵。
style_grams={layer:gram_matrix(style_features[layer]) for layer in style_features}
初始化样式权重字典
我们有了所有提取的特征和一个包含所有提取的特征的相应Gram矩阵的字典。我们选择了五个层进行特征提取,并提供了一种重新构建图像风格的各种方式,这也为可定制性留下了余地。我们选择通过为每个层关联特定的权重参数来优先考虑某些层而不是其他层。
注意: 通常,接近模型开头的层在重新创建样式特征方面通常更有效,而后来的层则提供了更多样式元素的变化。
#Initializing style_weights dictionary
style_weights={'conv1_1':1., #Key 1 with max value 1
'conv2_1':0.75, #Key 2 with max value 0.75
'conv3_1':0.2, #Key 3 with max value 0.2
'conv4_1':0.2, #Key 4 with max value 0.2
'conv5_1':0.2} #Key 5 with max value 0.2
我们需要定义的另一个权重参数是在内容图像和样式图像之间指定的平衡量。这允许我们通过定义样式与内容的比率来定制最终的目标图像。
content_weight=1
style_weight=1e6
现在,我们将使用样式和内容图像数据来优化我们的目标图像。因此,我们将从内容中获取我们的原始目标图像。我们的目标图像将从content .clone语句中获取,如下所示:
target=content.clone().requires_grad_(True).to(device)
现在,我们有了我们的三张图像,并将在后面执行优化过程。