机器学习小项目(1)图片风格转移
简介
这学期开始上《机器学习》相关的课,老师要求每个组都阅读一篇最近发表的关于机器学习的论文,并做展示,其中有很多有趣的小项目,就在这里分享一下。
![](https://img.haomeiwen.com/i7154507/74b22d12eb351d99.png)
![](https://img.haomeiwen.com/i7154507/ab7ba1508cfe2a6a.png)
两张用到的参考图片如下:
![](https://img.haomeiwen.com/i7154507/87c108cdeaa25842.png)
![](https://img.haomeiwen.com/i7154507/34f1b7f3bb617e8e.jpg)
参考
原论文
Image Style Transfer Using Convolutional Neural Networks.pdf
论文分析及代码详解
基本都是参考这篇文章做出来的
知乎 keras示例程序解析(2):图像风格转移
相关知识
深度学习、图像分类入门,从VGG16卷积神经网络开始
如何用简单易懂的例子解释格拉姆矩阵/Gram matrix
VGG网络
先看看网络结构图
![](https://img.haomeiwen.com/i7154507/88a62b59b6cc2224.png)
图中这些啥convolution,maxpooling都是啥啊?
卷积核
![](https://img.haomeiwen.com/i7154507/4e182f1efd9b5699.png)
可以通俗理解为特征提取的一个模版,一个图像经过这个卷积核之后便能提取出只包含对应特征的图像。
注意不要忘了后面还接上了一个ReLU函数,用来引入非线性。
Max Pooling
![](https://img.haomeiwen.com/i7154507/e8666b76c4f5b9d4.png)
很多翻译把这个称为池化…
结构
![](https://img.haomeiwen.com/i7154507/88a62b59b6cc2224.png)
比较令人困惑的一点就是224*224*3到224*224*64,为什么图片数量(厚度)增多了?这是怎么实现的?
这个问题可以追溯到LeNet这个比较早的模型,同样的问题出现在了S2到C3这里,其解释可以参考
卷积神经网络 LeNet-5各层参数详解,C3里的图层是对S2各图层的组合,也就是说,将原有特征图层混合成了新的特征图层。
![](https://img.haomeiwen.com/i7154507/ae4b7f0b73085b2e.png)
内容处理
本部分建议参考对应代码及解析
Keras:neural_style_transfer.py
知乎 keras示例程序解析(2):图像风格转移
提取
![](https://img.haomeiwen.com/i7154507/2fd6a2cab7753d5e.png)
内容就是采用CNN的某一层或者某几层来表示,层级越高,表示就越抽象。如图,低层的响应是纹理和细节的相应,高层的响应是语义信息的响应。
训练
这里是本论文一个新颖的地方,平常接触到的都是给一堆图片,训练CNN的参数;在这里则是给一个经过ImageNet训练好的CNN(训练好代表它已经可以提取生活中常见的物体的特征),反过来训练出一个图片。训练的是什么参数呢?
![](https://img.haomeiwen.com/i7154507/1619272c6e6c3812.png)
p: 原始内容图片
x: 生成图片(初始一个白噪声图片)
Pl: 原始图片在CNN中第l层的内容表示(就是某一层网络的输出 详细理解请参考代码)
Fl: 生成图片在CNN中第l层的内容表示
Flij: 第l层第i个filter上位置j处的激活值
其导数为
![](https://img.haomeiwen.com/i7154507/a7c77e0d88fb442e.png)
来对比一下:
传统梯度下降:参数=原参数-学习率*(Loss对参数的导数)更新参数 即可实现Loss减小
这篇论文中:对内容损失求导,更新参数F(F由X得到,即更新X)使得内容损失减小,使得X在内容上越来越趋近于P
风格处理
和内容类似,首先看风格是如何描述的,
![](https://img.haomeiwen.com/i7154507/4ed4dbb1a4d7bbcb.png)
然后对比每一个生成图片的风格G和参考图片风格A的差异E,加权平均每一层的差异得到总的风格损失Lstyle
![](https://img.haomeiwen.com/i7154507/9937cb437312013e.png)
然后训练参数,减小这个损失。
总体流程
![](https://img.haomeiwen.com/i7154507/440f911d8a4ca377.png)
实验
这些是论文中提到的一些实验现象。
内容层级的选择
![](https://img.haomeiwen.com/i7154507/0a654dde25eb0b26.png)
层级越高,内容越抽象,融合度越好
![](https://img.haomeiwen.com/i7154507/6cf42240da1166b5.png)
初始化方式的不同
![](https://img.haomeiwen.com/i7154507/abeb5cbc21cc6179.png)
待生成图片一开始是什么样的?风格图片、内容图片亦或是白噪声,最终效果都差不多,只是白噪声训练时间可能长一些。
![](https://img.haomeiwen.com/i7154507/840c63ace1876743.png)
![](https://img.haomeiwen.com/i7154507/1b14decfb6409d9b.png)
疑问
这是我在实验过程中遇到的疑问。
图片大小影响
![](https://img.haomeiwen.com/i7154507/84163e252c6d71a1.png)
![](https://img.haomeiwen.com/i7154507/8201a49565532281.png)
![](https://img.haomeiwen.com/i7154507/65919b4137211f37.png)
可以看出100*100效果最好,然而这个VGG网络不是针对ImageNet 224*224的图片提取特征的吗,效果理应最好啊?
![](https://img.haomeiwen.com/i7154507/5811bc603b722ef3.png)
大概是本来应该在第二层被提取的特征在第一层就被提取,相当于深度增加,而层级越深效果越好,所以100*100的反而最好。
后tu记cao
大概是一个月之前搞的展示了…完成这篇论文的阅读加上实验用了两周,很多不太懂的地方看了代码就比较清楚了。最关键的是效果很有趣,所以网上参考资料很多,别的组选了一些高深的题目,比如3D物体空间位置重构这种东西- -,也就需要自己开荒了。