首页 > 代码库 > 【每一个人都是梵高】A Neural Algorithm of Artistic Style

【每一个人都是梵高】A Neural Algorithm of Artistic Style

文章地址:A Neural Algorithm of Artistic Style
代码:https://github.com/jcjohnson/neural-style

这篇文章我认为可以起个浪漫的名字——每一个人都是梵高。
主要做的一件事情非常有意思。就是例如以下图的等式,通过将a图的style和p图的content进行融合。得到第三幅图x。style+content=styled content
技术分享
怎么做呢?首先他定义了两个loss。分别表示终于生成的图x和style图a的样式上的loss,以及x和content图p的内容上的loss。α,β<script type="math/tex" id="MathJax-Element-12">\alpha,\beta</script>是调节两者比例的參数。终于的loss function是两者的加和。

通过optimize总的loss求得终于的x。


技术分享

Details

所用的CNN网络是VGG-16,利用了它16个卷积层和5个pooling层来生成feature。
如果某一层得到的响应是FlRNl?Ml<script type="math/tex" id="MathJax-Element-1">F^l\in R^{N^l*M^l}</script>,当中Nl<script type="math/tex" id="MathJax-Element-2">N^l</script>为l层filter的个数,Ml<script type="math/tex" id="MathJax-Element-3">M^l</script>为filter的大小。Flij<script type="math/tex" id="MathJax-Element-4">F^{l}_{ij}</script>表示的是第l层第i个filter在位置j的输出。

content loss

如果p和x在CNN中的响应分别为Pl和Fl。将他们内容上的loss表示成每一个pixel的二范数:
技术分享
则用梯度下降法,content loss对F求导为:
技术分享

Style Loss

图x的style表示为GlRNl?Nl<script type="math/tex" id="MathJax-Element-5">G^l\in R^{N^l*N^l}</script>,当中Glij=kFlik?Fljk<script type="math/tex" id="MathJax-Element-6">G^{l}_{ij}=\sum_k F^{l}_{ik}*F^{l}_{jk}</script>,即CNN同一层不同filter响应的互相关,至于为什么互相关可以表示style,well。I don’t know….
那么每一层style loss为
技术分享
当中style图a的在CNN中的响应为A。


则总的style loss为每一层的加权和:
技术分享

Total Loss

在定义好了两个loss的形式以后,又回到了最初的问题,就是最小化总的loss:
技术分享
要注意的是。不同于一般的CNN优化,这里优化的參数不再是网络的w和b。而是初始输入的一张噪声图片x
技术分享
终于我们想让他变成右图这样styled content。

Experiments

  1. 对同一张content图片运用不同style的结果例如以下图所看到的,fantastic!!
    技术分享

  2. total loss中α<script type="math/tex" id="MathJax-Element-45">\alpha</script>和β<script type="math/tex" id="MathJax-Element-46">\beta</script>的比例:
    从上到下表示的是运用不同conv层的feature进行style,conv1->conv5是一个从总体到局部的过程;
    从左到右表示的是不同的α/β<script type="math/tex" id="MathJax-Element-47">\alpha/\beta</script>的比例,10?5<script type="math/tex" id="MathJax-Element-48">10^{-5}</script>->10?2<script type="math/tex" id="MathJax-Element-49">10^{-2}</script>是指更注重style还是更强调content。
    技术分享

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

【每一个人都是梵高】A Neural Algorithm of Artistic Style