📜  风格转换的语法矩阵

📅  最后修改于: 2020-11-11 01:15:49             🧑  作者: Mango

用于样式转换的克矩阵

以前,我们提取了我们想要用于内容和样式图像的所有相关功能。卷积神经网络可以很好地从馈入其中的任何图像中提取内容元素。

提取的样式特征需要一个额外的预处理步骤才能更有用。研究人员将gram矩阵用于更有效的样式特征提取,并使其成为重要的一步。从卷积网络提取的任何特征仍然保留与内容相关的信息,例如对象结构和位置。

通过将gram矩阵应用于这些提取的特征,可以消除与内容相关的信息,并且不会影响样式信息。从图像中提取样式本身就是一个广泛的话题。将gram矩阵应用于从卷积神经网络提取的特征有助于创建与数据相关的纹理信息。

使用以下简单方程式定义克矩阵:

克= V ^ TV

这里,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_matrix()函数应用于我们先前提取的样式特征。

现在,我们将为样式克创建一个字典,并将每个图层映射到其相应特征的克矩阵。我们字典的关键将是特定的层。而该值将包含同一图层的各个样式特征的语法矩阵。之后,我们将迭代样式特征字典中的每一层,以获取先前提取的所有特征的语法矩阵。

style_grams={layer:gram_matrix(style_features[layer]) for layer in style_features}

样式权重字典的初始化

我们有所有提取的特征和一个字典,其中包含提取的所有特征各自的语法矩阵。我们选择了五层来从ii中提取特征,并提供了多种方法来重建图像样式,这也使视图具有可定制性。我们将通过将某些权重参数与每一层相关联来选择将某些层优先于其他层。

注意:靠近模型开头的图层通常可以有效地重新创建样式特征,而后面的图层则可以为样式元素提供更多的变化。

#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 

现在,我们将使用样式和内容图像数据来优化目标图像。因此,我们将从原始目标图像开始。我们的目标图像将从内容.clone语句获取为:

target=content.clone().requires_grad_(True).to(device) 

现在,我们拥有了所有三个图像,并将在以后执行优化过程。