风格迁移应用非常有趣,通过风格迁移也可以看到深层网络如何在不同层次提取特征。
可以看到,不只是颜色发生了变化,边缘,色块,对比度,甚至是笔触都转换成了明显的绘画效果.
《吴恩达深度学习》第四课第四周练习是一段风格迁移程序填空,编程语言为Keras,做完后感觉理解了细节的具体实现,但整体搭建框架和数据流向还比较糊涂。于是使用Pytorch又实现了一遍。下面列出此过程中的一些收获。
l 如何使用预训练模型生成图片 例程中涉及三张图片,一张提供内容C,一张提供风格G,目标是生成新图片N,新图片可以从白噪声开始,也可以与内容图片一致。 与对抗生成网络不同的是,风格迁移并不使用从小图逐渐放大的方法生成数据,而是将图N的Tensor设置成requires_grad=True,然后通过梯度调整图片内容,类似于梯度攻击中生成对模型更有攻击性的数据。
l 如何结合风格和内容 误差函数由两部分组成,一部分是C内容与N内容的差异,另一部分是G风格与N风格的差异,内容差异比较简单,只需要计算某一层两图输出的距离即可。 风格被定义为,同一层各个通道之间的关系,比如在CNN第四层输出128个通道,计算各个通道间数据的相关性,若通道A和通道B相关性高被认为是某种风格,从而判断两张图片风格是否一致。 每一层的输出都可以用来评价风格和内容是否一致,并根据其差异调整图片,使其向更加一致的方向变化。
参考
- 使用 PyTorch 进行 风格迁移 https://blog.csdn.net/fendouaini/article/details/101185963
- 《深度学习》教程习题(Keras实现) https://github.com/Wasim37/deeplearning-assignment