《深度学习之Tensorflow》-12对抗神经网络GAN

1.DCGAN-基于深度卷积的GAN

改动:

  • G网上取消了所有的池化层,改用转置卷积并且步长大于等于2进行上采样;
  • D网中也使用加入步长的卷积进行池化;
  • D网和G网中都使用BN,但是最后一层不使用BN,为了保证模型学到数据的正确均值和方差;
  • 去掉了FC,编程了全卷积网络;
  • G网中使用Relu激活函数,最后一层是Tanh;
  • D网中使用LeakyRelu作为激活函数。

2.InfoGAN

InfoGAN主要的改进在于使网络具有信息解读的功能,也就是加入了控制的功能。原来的GAN是不可控制的,现在通过修改部分输入,对生成的内容进行部分控制。
简单介绍:
G:根据噪声和附加信息生成模拟图;
D:分别输入模拟图和真实图,输出各自的真假二分类判断,类别判断,附加信息判断。
损失函数
loss_D:1/2[(真实数据二分类,1)+(模拟数据二分类,0)];
loss_G:(模拟数据二分类,1);
分类Loss:1/2[(模拟数据预测类别,真实分类)+(真实数据预测类别,真实类别)]【AC-GAN提出的增加后部分损失,这样才能保证模拟和真实的样本类别一样,而不仅仅是模拟数据类别对,而与输入不符合】
隐含信息Loss:(模拟数据预测信息,真实信息)

D先训练:loss_D+分类Loss+隐含信息Loss
G后训练:loss_G+分类Loss+隐含信息Loss

"""loss计算"""
# 判别器 loss
loss_d_r = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=disc_real, labels=y_real))
loss_d_f = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=disc_fake, labels=y_fake))
loss_d = (loss_d_r + loss_d_f) / 2

# generator loss
loss_g = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=disc_fake, labels=y_real))

# categorical factor loss
loss_cf = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_fake, labels=y)) 
loss_cr = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_real, labels=y)) 
loss_c =(loss_cf + loss_cr) / 2

# continuous factor loss
loss_con =tf.reduce_mean(tf.square(con_fake-z_con))

3.AC-GAN

即Auxiliary Classifier GAN,在判别器中输出对应的分类概率,然后增加输出的分类与真实分类的损失计算,保证生成的模拟数据与所属的类别一一对应,而不是产生类似模式崩溃的效果,每次都产生类似的样本。

4.AEGAN:基于自编码的GAN

AE的基本原理是特征的映射,把高位特征压缩到低维特征。而AEGAN则可以在重建的过程中生成与自己类似的样本,效果类似变分自解码网络。
训练过程:先正常训练G和D,然后固定G和D的参数,G的输出(模拟数据output1)作为AE的输入,AE的输出再作为G的输入,G的新输出(模拟数据压缩再生成output2),output1和output2进行计算平方差损失进行优化对象。、

5.WGAN:基于推土机距离的GAN

GAN的问题:loss无法指示训练的进程,生成样本缺乏多样性,训练苦难。
原因:D和G的学习快慢不能达到较好的平衡。

6.WGAN-GP:带梯度惩罚项的WGAN

eps = tf.random_uniform([batch_size, 1], minval=0., maxval=1.)
X_inter = eps*real_X + (1. - eps)*random_Y
grad = tf.gradients(D(X_inter), [X_inter])[0]
grad_norm = tf.sqrt(tf.reduce_sum((grad)**2, axis=1))
grad_pen = 10 * tf.reduce_mean(tf.nn.relu(grad_norm - 1.))

D_loss = tf.reduce_mean(D(random_Y)) -tf.reduce_mean(D(real_X))  + grad_pen
G_loss = -tf.reduce_mean(D(random_Y))

7.LSGAN:最小乘二GAN

# 判别器 loss
loss_d = tf.reduce_sum(tf.square(disc_real-1) + tf.square(disc_fake))/2

# generator loss
loss_g = tf.reduce_sum(tf.square(disc_fake-1))/2

# categorical factor loss
loss_cf = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_fake, labels=y)) 
loss_cr = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=class_real, labels=y)) 
loss_c =(loss_cf + loss_cr) / 2

# continuous factor loss
loss_con =tf.reduce_mean(tf.square(con_fake-z_con))

8.GAN-cls:具有匹配感知的判别器

在InfoGAN中通过ACGAN增加损失的方式指导模拟数据与生成数据的对应关系,在GAN-cls中,通过增强判别器的功能来实现。使其不仅能够判断真假,还能匹配真伪。
主要修改D:

  • 输入:真实图片+真实标签、真实图片+假标签、假图片+真实标签(至少一个真)
  • 判别结果:真、假、假(都真才真)
def discriminator(x,y):
    reuse = len([t for t in tf.global_variables() if t.name.startswith('discriminator')]) > 0
    with tf.variable_scope('discriminator', reuse=reuse):
    //标签y先通过FC变为一样维度,然后调整为图片形状,再和图片concat,类似作为一个通道
        y = slim.fully_connected(y, num_outputs=n_input, activation_fn = leaky_relu)
        y = tf.reshape(y, shape=[-1, 28, 28, 1])
        x = tf.reshape(x, shape=[-1, 28, 28, 1])
        
        x= tf.concat(axis=3, values=[x,y])
        x = slim.conv2d(x, num_outputs = 64, kernel_size=[4,4], stride=2, activation_fn=leaky_relu)
        x = slim.conv2d(x, num_outputs=128, kernel_size=[4,4], stride=2, activation_fn=leaky_relu)
        x = slim.flatten(x)
        shared_tensor = slim.fully_connected(x, num_outputs=1024, activation_fn = leaky_relu)
        disc = slim.fully_connected(shared_tensor, num_outputs=1, activation_fn=tf.nn.sigmoid)
        disc = tf.squeeze(disc, -1)

    return disc

9.SRGAN:适用超分辨率重建的GAN

9.1 ESPCN:基于卷积神经网络的图像超分辨率方法

核心概念:亚像素卷积层,即先在低像素图片进行卷积,最后输出含义多个feature map的结果,最后按照tf.depth_to_space()的方法,把多通道平铺成需要大小的图片。

#espcn
net = slim.conv2d(x_small, 64, 5)
net =slim.conv2d(net, 32, 3)
net = slim.conv2d(net, 4, 3)
net = tf.depth_to_space(net,2)

9.2 SRGAN

传统的方法使用的代价函数是基于像素点的最小均方差(MSE),该代价函数使重建结果具有较高的信噪比,但是缺少了高频信息,所有会出现过度平滑的纹理。SRGAN的思想是增加特征空间的平方差,使用VGG来进行提取。同时使用判别器来判断真实和模拟数据的真伪。

VGG输入真图和重建图分别得到feature map,再计算内容Loss:

#vgg 特征值
_, end_points = vgg.vgg_19(rgbmean, num_classes=1000,is_training=False,spatial_squeeze=False)                    
conv54=end_points['vgg_19/conv5/conv5_4']
print("vgg.conv5_4",conv54.shape)
fmap=tf.split(conv54,2)

content_loss=tf.losses.mean_squared_error(fmap[0],fmap[1])

总损失:

//重建图二分类损失
adv_loss=tf.reduce_mean(tf.square(D_G_z-1.0))
gen_loss=(adv_loss+content_loss)
//判别器判别损失
disc_loss=(tf.reduce_mean(tf.square(D_x-1.0)+tf.square(D_G_z)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值