深度学习:神经风格转移
文章目录
- 风格转移简介
- 直观感受CNN
- 代价函数
- 内容代价函数
- 风格代价函数
风格转移简介
简单来讲,就是将想绘制的内容,从写实派转化为别的艺术风格,为了方便表述,我们约定想绘制的内容为C,想学习的风格为S,最后生成的作品为G,可以从下图直观的感受风格转移:
要实现神经风格转移,我们先直观地感受一下CNN的网络中究竟发生了什么。
直观感受CNN
让我们以下图展示的CNN为例:
先从第一层开始,对于第一层中的某个单元,我们寻找最能激活它的九个图块(因为浅层的这些单元只能接收到很小的一块图像),可以发现这些单元感知的都是一些色块或边缘(线条)这种简单的图像特征:
随着网络的深入,我们发现单元感知的图像变得越来越大,不仅是从图片规模上,而且在概念层面也变得越来越“大”且复杂:
代价函数
众所周知,搭建学习算法离不开代价函数,通过最小化代价函数,我们能让神经网络的输出越来越接近我们想要的结果,那么如何为风格转移构造代价函数呢?
我们希望在输出G中实现的目标有两个:一是包含我们想画的内容C,二是我们想拥有的风格S。所以,代价函数也有两部分构成,内容代价函数Jcontent(C,G)J_\text{content}(C,G)Jcontent(C,G)用于评判G绘制C的情况,而风格代价函数Jstyle(S,G)J_{style}(S,G)Jstyle(S,G)则评价G是否有S“內味儿”。我们通过两个超参数α\alphaα和β\betaβ来调整内容与风格这两个指标的比重,最终表达式为
J(G)=αJc(C,G)+βJs(S,G)J(G)=\alpha J_\text{c}(C,G)+\beta J_s(S,G) J(G)=αJc(C,G)+βJs(S,G)(用两个超参数来调整内容与风格的相对比重似乎有点多余,但是风格转移原作者就是这么干的)
大概的运算流程就是先随机生成一张雪花图,之后通过梯度下降之类的算法最小化J(G)J(G)J(G),逐渐得到一张绘制了内容C,但是风格趋近于S的作品。
接下来让我们看看怎么具体地实现两个代价函数。
内容代价函数
内容代价函数相较风格代价函数而言要简单一些,我们要做的就是选择一个已经训练过的CNN(如VGG),向该网络中分别输入C和G,然后在网络中比较中间的位置挑选一个隐藏层a[l]a^{[l]}a[l],比较这两张图片在这个隐藏层上的差别,即
Jc(C,G)=∣∣a[l](C)−a[l](G)∣∣2J_c(C,G)=||a^{[l](C)}-a^{[l](G)}||^2 Jc(C,G)=∣∣a[l](C)−a[l](G)∣∣2
注意如果lll选的太浅,得到的G像素值会跟C非常相似,而如果lll太深,得到的G可能在画面元素上跟C有些相似(比如都有狗,有一滩水),但就看不出画的是同一个内容了。
风格代价函数
用中间隐藏层的激活值计算内容代价还算好理解,那么在网络中“风格”究竟是怎样捕捉的呢?我们的定义是激活层中位置相同但通道不同的单元激活值之间的相关系数。从上一大节我们可以看到,在中间的隐藏层会识别一些纹路、色彩等信息,而相关系数就是计算这些元素同时出现的概率。比如条纹纹理和蓝色的相关系数高,那么就说明风格S倾向于蓝色条纹。
具体来讲,假设我们选择了第lll个隐藏层,这个矩阵的大小为nH×nW×nCn_H\times n_W\times n_CnH×nW×nC,那么这一层的相关系数为
Gkk′[l](S)=∑i=1nH∑j=1nWaijk[l](S)aijk′[l](S)Gkk′[l](G)=∑i=1nH∑j=1nWaijk[l](G)aijk′[l](G)Js[l](S,G)=1(2nHnWnC)2∑k=1nC∑k′=1nC(Gkk′[l](S)−Gkk′[l](G))2G_{kk'}^{[l](S)}=\sum_{i=1}^{n_H}\sum_{j=1}^{n_W}a_{ijk}^{[l](S)}a_{ijk'}^{[l](S)}\\ G_{kk'}^{[l](G)}=\sum_{i=1}^{n_H}\sum_{j=1}^{n_W}a_{ijk}^{[l](G)}a_{ijk'}^{[l](G)}\\ J_s^{[l]}(S,G)=\frac{1}{(2n_Hn_Wn_C)^2}\sum_{k=1}^{n_C}\sum_{k'=1}^{n_C}(G_{kk'}^{[l](S)}-G_{kk'}^{[l](G)})^2 Gkk′[l](S)=i=1∑nHj=1∑nWaijk[l](S)aijk′[l](S)Gkk′[l](G)=i=1∑nHj=1∑nWaijk[l](G)aijk′[l](G)Js[l](S,G)=(2nHnWnC)21k=1∑nCk′=1∑nC(Gkk′[l](S)−Gkk′[l](G))2
其中,矩阵G计算的是某两个通道之间的相关系数,又被称为格拉姆矩阵(gram matrix),而常数项没有那么重要,因为最后都可以通过参数β\betaβ调整。
如果想让风格的计算更准确,我们可以考虑多个隐藏层,赋予每个隐藏层不同的权重λ[l]\lambda^{[l]}λ[l],最后的风格代价函数写为
Js(S,G)=∑lλ[l]Js[l](S,G)J_s(S,G)=\sum_l \lambda^{[l]}J_s^{[l]}(S,G) Js(S,G)=l∑λ[l]Js[l](S,G)使得风格可以综合考虑来自浅层和深层的更多信息。
深度学习:神经风格转移相关推荐
- 神经风格转移:Anaconda快速搭建DL框架学梵高(Van Gogh)绘画Ubuntu16.04 CPUGPU版
神经风格转移:Anaconda快速搭建DL框架学梵高(Van Gogh)绘画 Ubuntu16.04 CPU&GPU版 最近开始学ML和DL的知识,开始新的方向,像吴恩达说的,看的再多,不跑几 ...
- 深度学习项目-风格转换
深度学习项目-风格转换 神经风格转换 1.导入包 2.加载VGG模型 3.搭建神经风格算法 4. 风格权值 5.解决优化问题 神经风格转换 神经风格转换(Neural Style Transfer,N ...
- android中的深度学习——快速风格迁移
============= 这是一个图片处理APP,里面使用了Opencv.深度学习.MVVM.Databinding.RxJava.各种设计模式等等,在后面一段时间我会写一系列博客来一步步剖析这个项 ...
- 吴恩达深度学习之风格迁移
个人的学习笔记,一直更新中,如有错误,评论区见,冲冲冲! 笔记来源:吴恩达深度学习 4.6 什么是神经风格转换?_哔哩哔哩_bilibili 1 输入输出 风格迁移输入:内容(Content)图像C ...
- 毕设 深度学习图像风格迁移
文章目录 0 简介 1 VGG网络 2 风格迁移 3 内容损失 4 风格损失 5 主代码实现 6 迁移模型实现 7 效果展示 8 最后 0 简介 今天学长向大家介绍一个机器视觉项目 基于深度学习卷积神 ...
- 论文笔记 | 基于深度学习的乳腺转移瘤识别(Deep Learning for Identifying Metastatic Breast Cancer)
论文阅读笔记:原文链接 摘要 生物医学图像国际研讨会(International Symposium on Biomedical Imaging,ISBI)举办了一个在前哨淋巴节点全幻灯图中自动检测转 ...
- 【模型结构绘制】深度学习神经网络模型结构图绘制工具及方法总结【写论文必备】
本文我们聊聊如何才能画出炫酷高大上的神经网络图,下面是常用的几种工具. 这个工具可以非常方便的画出各种类型的图,是下面这位小哥哥开发的,来自于麻省理工学院弗兰克尔生物工程实验室, 该实验室开发可视化和 ...
- 【毕业设计】深度学习图像风格迁移算法研究与实现 - python 卷积神经网络
文章目录 0 简介 1 VGG网络 2 风格迁移 3 内容损失 4 风格损失 5 主代码实现 6 迁移模型实现 7 效果展示 8 最后 0 简介
- 毕设 深度学习图像风格迁移 - opencv python
文章目录 0 前言 1 VGG网络 2 风格迁移 3 内容损失 4 风格损失 5 主代码实现 6 迁移模型实现 7 效果展示 8 最后 0 前言
- 吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 神经风格转换--编程作业
吴恩达Coursera深度学习课程 deeplearning.ai (4-4) 神经风格转换–编程作业 注:由于这个作业目前未找到完整的中文版的,所以楼主综合了几篇不完整的,自己完整运行了一遍(pyt ...
最新文章
- EJSS: 南土所梁玉婷组-生境决定了土壤植物系统中细菌、抗性基因和可移动元件间的关系...
- POJ 3368	Frequent values 线段树区间合并
- JavaEE 资源注入
- cannot delete activity in SAP CRM WebClient UI
- MySQL笔记——JDBC入门
- CentOS之安装docker
- [redis] 介绍安装
- 蓝桥杯2018年第九届C/C++省赛B组第七题-螺旋折线
- 调整home和根分区大小
- 拉扎维对于简单CMOS电路的增益计算方法
- 自动将视频文件生成字幕的软件autosub的替代工具字幕酱(支持英文、日语和法语、德语、韩语)
- python 自动换ip_python实现自动更换ip的方法
- 大佬云集的在线少儿英语市场,谁才是那匹冲出重围的黑马?
- LQBv23-Python:三升序列
- 网页播放器看视频页面绿屏解决方法
- C语言中的void和void指针-void*,及void指针做函数参数。
- 程序员面试100题之七 最长公共子字符串
- 桌面显卡天梯图2023年2月 台式机显卡天梯图2023
- 315,关于《C程序设计伴侣》一书致人民邮电出版社的公开信
- php 解压文件中有中文,ZipArchive 解压中文文件乱码解决方案和疑惑
热门文章
- 【HDU 5965】扫雷【线性递推】
- 随机变量的原点矩、中心距、变异系数
- effective java 枚举_Effective.Java第34-44条(枚举)
- 加载字典文件,扫描网站潜在目录
- 圆周移位是怎么移的_【装修干货】马桶移位改造全攻略,总有一天你能用得上!赶紧收藏...
- As-If-Serial 理解
- FastReport.Net使用:[18]形状(Shape)控件用法
- Oracle11g常用数据字典
- WEBFORM--第一讲
- [poj2449]Remmarguts' Date(spfa+A*)