之前在【paper笔记】图像风格迁移博文中大概介绍了图像风格迁移的原理。博主准备使用一个系列来讲解复现的过程,使用的深度学习框架是TensorFlow,首先实现的是图像生成网络模块。
1.TensorFlow预备知识
1.1tf.pad(tensor, paddings, mode='CONSTANT', constant_values=0)
按照某种方式填充张量。我们以2维张量为例,在维度0前添加0个维度,维度0后添加1个维度;维度1前添加1个维度,维度1后添加2个维度。
1 | x = tf.ones(shape=[3, 2]) |
1.2tf.where(condition, x=None, y=None)
类似于np.where()
,根据condition
选择x
或者y
。比如可以用来将张量中的nan
转化为0
.
1 | import numpy as np |
1.3tf.nn.moments(x, axes, shift=None, name=None, keep_dims=False)
计算x
的均值和方差。
1 | x = tf.constant([1., 2., 3., 4., 5., 6.], shape=[3, 2]) |
1.4tf.stack(values, axis=0)
把张量列表按照给定轴堆叠,堆叠张量会比元素张量多1个维度。设元素张量的尺寸为(A, B, C)
,如果axis == 0
,那么堆叠张量尺寸为(N, A, B, C)
. 如果axis == 1
,那么堆叠张量尺寸为(A, N, B, C)
.
1 | # 元素尺寸是(2,),N=3 |
1.5tf.slice(input_, begin, size)
对张量进行切片操作。input_
是待切片张量,begin
是切片的起始位置,和input_
的维度对应,size
是切片的大小,三者的尺寸一致。
1 | x = tf.constant(np.arange(9), shape=[3, 3]) |
2.各层网络实现
2.1conv2d
定义
为了较好的处理图像边界像素,使用REFLECT
的方式进行像素填充。在神经网络中常常使用4维张量表示图像数据集,第一维表示第几张图像,第二维表示图像高度,第三维表示图像宽度,第四维表示图像的通道数,因此定义的卷积函数在填充时,只需填充第二维和第三维的数据。
1 | def conv2d(x, input_depth, output_depth, ksize, strides, mode='REFLECT'): |
2.2instance_norm
定义
InstanceNorm是将一个样本进行标准化(均值为0,标准差为1),类似于BatchNorm,这么做可以加快网络的收敛速度,提高非线性拟合的能力,而且可以有效地提高图像风格迁移的质量。
1 | def instance_norm(x): |
分母增加了一个微小的平滑因子,避免除以0
.
2.3relu
定义
就是简单的包装了一下tf.nn.relu()
,当某个数值是nan
的时候,置为0
.
1 | def relu(x): |
2.4residual
定义
残差层如下图所示。
残差网络是何凯明等人在2015年的ImageNet比赛中提出来的,其在数据集上准确率已经超越了人类。残差网络非常深,达到了152层之深,网络名称是ResNet,其中最重要的就是残差层。
如果权重变得特别的小,那么残差层学习的就是恒等函数(H(x)≈x),这是比较容易的,而且网络的性能不受影响,因此ResNet不管层数有多少,训练误差都不会像没有残差块的网络那样越来越大。
1 | def residual(x, input_depth, ksize, strides): |
2.5resize_conv2d
定义
resize_conv2d()
实现的是反卷积层的功能,反卷积(deconv)的名字其实有点迷惑性,因为它本质就是卷积。卷积有一个特点,就是不在边界填充数值的话,张量的尺寸会越来越小,因此卷积神经网络的结构一般也是越来越深,越来越窄。但是有时候需要扩大张量的尺寸,比如把深窄的张量还原成3层但是较大的张量,即图像。方法就是把提前把张量扩得超级大,然后进行卷积,这样卷积后的张量相比于卷积前的张量尺寸还是减小的,但是相比于扩大之前的张量,还是变大了。
关于反卷积可以查看博文深度学习|反卷积/转置卷积 的理解 transposed conv/deconv,讲得很不错。
1 | def resize_conv2d(x, input_depth, output_depth, ksize, strides, traning): |
3.图像生成网络搭建
拟搭建的网络结构如下图所示。
简单而言,就是3个卷积层,5个残差层,3个反卷积层。
使用第二节定义的各层函数,按照上图的结构搭建图像生成网络。
1 | def net(image, training): |
4.参考资料
[1] 何之源. 21个项目玩转深度学习[M]. 北京:电子工业出版社, 2018.
[2] jdefla. 深度学习 | 反卷积/转置卷积 的理解 transposed conv/deconv[EB/OL]. https://blog.csdn.net/u014722627/article/details/60574260.
[3] moverzp. 【paper笔记】图像风格迁移[EB/OL]. http://moverzp.com/2018/08/10/%E3%80%90paper%E7%AC%94%E8%AE%B0%E3%80%91%E5%9B%BE%E5%83%8F%E9%A3%8E%E6%A0%BC%E8%BF%81%E7%A7%BB/.
[4] Gatys L A, Ecker A S, Bethge M. A Neural Algorithm of Artistic Style[J]. Computer Science, 2016.
[5] Johnson J, Alahi A, Li F F. Perceptual Losses for Real-Time Style Transfer and Super-Resolution[C]// European Conference on Computer Vision. Springer, Cham, 2016:694-711.
[6] https://tensorflow.google.cn/tutorials/