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