我们需要用到VGG19的网络,这个网络长下面的样子,一张三通道的彩色图片作为输入,经过一系列的卷积和pooling层,有5个pooling层,中间夹着一组2个或者4个的卷积层,比方说第一个pooling层之前就有两个卷积层,最后一个pooling层之前有四个卷积层。最后是3个全连接层。
我们给第一个pooling层前面的两个卷积层分别起名conv1_1, conv1_2
为了得到最后风格迁移后的图片,我们需要先将content Image(那只猫)和style image(浮世绘风格)都通过VGG 19 的网络
对于将content Image(那只猫),我们将它送到网络之后,在最后一层卷积层,卷积层的输出就是输入图片的content representation。我们先得content representation。
然后再将style image(浮世绘风格)通过VGG 19 的网络,并得到多个卷积层的输出,也就是style representation
最后,我们就用content representation和style representation来和成最后的target图片
在论文中,content representation是从conv4_2那一层的输出得到的
我们希望content image的content表示和target image的content表示是基本一样的。
为了达到这个目的,就定义了content loss,这是为了对比content和target的representation。我们分别用Cc和Tc表示。这里我们用mean square来计算它们的loss。但是和前面我们学到的训练网络减小loss不同,我们这里不训练CNN,我们值改变target image,不断的update直到它们的表示基本一致。另外我们还要定义target和style图像的loss
在这里,我们也不是正常的在使用VGG19进行训练,而是将它作为一个feature extractor,然后用反向传播来减小loss。
一张图片的style reprensentation需要查看不同层输出的feature的联系。也就是看这些features的相似性。相似性可以是color,texture等
一张风格图片进来之后,会经过五组卷积层,style representation的计算是通过每组卷积的第一个卷积层的输出来进行的。每一层的联系是用Gram matrix来计算的。
Gram matrix是这样计算的,假设我们有一个4×4的图片,要经过一个8个filter的卷积操作,形成一个4×4×8的卷积层
从卷积层的8个feature中找到它们的关系。第一步就是将每个feature都向量化,
每个都这样操作,最后4×4×8的三维的卷积层,就变成了8×16的2D的表示
下一步就是将这个matrix乘上它的转置,得到gram matrix,这样空间信息就会不相关,这样gram matrix就是包含non-localized information,也就是说不看图像中的content,只关注color和texture等风格信息。
最后的到的就是8×8的一个矩阵,这里的8是和filter的数量一致的
这样第四行和第二列相乘得到的数字就是衡量第四个feature和第二个feature的相似程度
这里,就需要找到target image和style image的gram matrix,然后计算mean square。这里因为是五个conv层,所以计算5组
然后用Ss表示Style图片的representation,Ts表示target图片的representation,计算loss,其中a是常数,每层的value数?w也是规定好的,表示每层的style reprensentatio对追钟的target iamge影响有多大,同样的,这里也是变Ts
然后我们就有了total loss,是两种loss相加
两种loss的权重可以不一样,这样生成的最后的图片有的是风格强一些,有的风格弱一点
代码:
Style_Transfer_Exercise.ipynb in the style-transfer folder.
git clone https://github.com/udacity/deep-learning-v2-pytorch.git
【Pytorch】20. Style Transfer风格迁移代码分析
本系列笔记来自Udacity课程《Intro to Deep Learning with Pytorch》
全部笔记请关注微信公众号【阿肉爱学习】,在菜单栏点击“利其器”,并选择“pytorch”查看