四时宝库

程序员的知识宝库

深度学习深度学习(二十六)DCGAN(深度学习完整视频)

说到GAN其实大部分应用都来自于图像处理,而说到图像处理,实际拿手,专业的还是CNN卷积网络。昨天举例子的GAN网络大家也看到了,使用的是普通的神经网络进行处理的。而所谓的DCGAN其实实现GAN对抗网络组网的方式完全不变的,变化的是网络模型本身,由普通的神经网络,变成了卷积网络。所以DCGAN本身的要点不在于GAN,而在于DC上面,我们一个来看。

首先,我们先来看看判别网络,我先直接上代码:

首先,和普通的CNN不同,这里的CNN网络是没有池化层的,那如何将维度变小呢?这里用到的是strides=2,就是移动窗口变成2来降低窗口大小。

而为何这里可以用strides=2而原先使用评价池化方式来降低维度呢?这里要介绍另外一个函数:

bn2 = tf.layers.batch_normalization(x2, training=True)

据我查的一些资料表示,这个函数是一个正规化函数,他是可以修正因为没有池化而直接用strides=2的缩小维度带来的偏差。而之前池化,是一个很老的方法,有可能以后的CNN网络都用这个来替代。另外,这个网络也没有对bias的处理,这应该也是tf.layers.batch_normalization的作用。

另外,这里补充一个函数(这个函数实际应该上一篇讲解的,但因为上一篇文章重点是讲模型,所以细节还是留在这一篇文章说明):

relu2 = tf.maximum(alpha * bn2, bn2)

这个函数实际上是Activation Function,是RELU的改良版本,它的好处在于对0的处理,而注意,这里的alpha参数对结果的影响非常大,也是一个重要的要调整的参数。

好,其他部分应该不难了,能看的懂。这里可能大家会奇怪,卷积函数的参数似乎和之前的不同。这个按下不表,一会再说,那个是重点。

判别网络模型,实际就是正常的(当然没有池化层)的CNN网络,那下面我们看看生成网络,还是先上代码:

生成网络,如果用卷积来表示的化,这里就是一个反卷积过程!

从代码上可以看出,这里和正常的卷积网络都是反的,首先数据是从展平数据开始,然后反向到卷积的图像数据。

另外,这里调用的是反卷积函数:

x2 = tf.layers.conv2d_transpose(x1, 256, 5, strides=2, padding='same')

反卷积函数当然就和卷积函数效果相反,它是让每一层的变化厚度变小,维度变大。

好了,带卷积网络的GAN就是DCGAN就是这样了,怎么样,不难吧。

下面重点介绍一下实际的代码,这里的卷积函数似乎和我们之前的卷积函数不一样!

是的,这点很重要,不了解这个参数含义,很难理解这个卷积和反卷积怎么使用的,这个是细节上的一个重点,这里的数据都不是乱填的。

首先提醒大家,这里要看仔细,和以前卷积函数不同,一个是
tf.nn.conv2d_transpose

另外一个是:

tf.layers.conv2d_transpose

这两个函数不同,他们的参数也是不一样的:

我们先看看卷积函数的:

tf.layers.conv2d(数据,输出深度,窗口大小,strides=平移数量,padding="same")

注意这里窗口大小是单个数字,表示长宽相等的,而strides平移数量默认是对图像本身长宽两个方向的移动数量。

而原来的函数,我原来文章有写,为方便对比,我也列出来:

conv_layer = tf.nn.conv2d(input, weight, strides=[1, 2, 2, 1], padding='SAME')

这里注意:weight是要给数组[窗口长,窗口宽,输入时深度,转换后的深度]

strides=[数组移动,横向移动,纵向移动,深度移动]

好,这个是卷积函数的差别,那么理解了卷积差别后,再理解反卷积的差别就容易的多了。

tf.layers.conv2d_transpose(输入数据,输出的图像厚度,卷积窗口大小, 窗口平移,…)

做个对比,下面两个函数功能相同:

x1 = tf.ones(shape=[64,7,7,256])

y1 = tf.layers.conv2d_transpose(x1, 128, 3, strides=2, padding=‘SAME’)

w=tf.ones([3,3,128,256])

y2 = tf.nn.conv2d_transpose(x1, w, output_shape=[64,14,14,128], strides=[1,2,2,1], padding=‘SAME’)

使用tf.nn.conv2d_transpose这种方式注意w的参数是和tf.nn.conv2d一样的,只是第3第4个参数顺序调换了一次。这个方式麻烦,但是这个方式有一个最大的好处就是输出的反卷积图片大小是可以自己定义的。这个非常关键。而使用tf.layers.conv2d输出图片大小并不完全能自己控制。

另外,再给个参考:

import tensorflow as tf

x1 = tf.ones(shape=[64,7,7,256])

y1 = tf.layers.conv2d_transpose(x1, 128, 3, strides=2, padding='SAME')

w=tf.ones([3,3,128,256])

y2 = tf.nn.conv2d_transpose(x1, w, output_shape=[64,14,14,128], strides=[1,2,2,1], padding='SAME')

x2=tf.nn.conv2d(y2,w,strides=[1,2,2,1],padding='SAME')

with tf.Session() as sess:

sess.run(tf.global_variables_initializer())

y1_value,y2_value,x2_value=sess.run([y1,y2,x2])

好了,DCGAN应该差不多了,这里还遗留一个知识点,就是反卷积函数,在理论上是怎么反卷积的,这个留作下一篇再讲解。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接