生成对抗网络随记

题带知识点的学习记录,看到什么不懂的立马增加知识点

生成对抗网络随记

前言

本科毕设时接触了Unet医学分割网络,现在是对该项目的后续发展,如何利用已有的CT图像生成MR图像,因此需要学习生成对抗网络(GAN)。
本文主要参考博客四天搞懂生成对抗网络系列,感谢!


一、区分 判别(分类)网络与生成网络

判别(分类)网络:输入训练集图片下,输出分类标签y。即学习的目的是在输入图片x的条件下,尽量增大模型输出分类标签y的概率。
生成网络:输入随机噪声信号与简单先验分布p(x)(训练集图片),输出一张服从p(x)分布的具有训练集特征的图片。

二、GAN介绍

1.基本原理

生成对抗网络一般由一个生成器(生成网络),和一个判别器(判别网络)组成。
生成器通过学习训练集数据的特征,在判别器的指导下,将随机噪声分布尽量拟合为训练数据的真实分布,从而生成具有训练集特征的相似数据。而判别器则负责区分输入的数据是真实的还是生成器生成的假数据,并反馈给生成器。两个网络交替训练,能力同步提高,直到生成网络生成的数据能够以假乱真,并与与判别网络的能力达到一定均衡。

2.网络结构

判别网络结构
Conv1卷积层设置为64个卷积核,每个卷积核大小为3x3;Pool1池化层选择MaxPooling保留最大值,池化大小为2x2。 知识点1 卷积层参数

# 判别器Dclass D(fluid.dygraph.Layer):
    def __init__(self, name_scope):
        super(D, self).__init__(name_scope)
        name_scope = self.full_name()
        # 第一组卷积池化
        self.conv1 = Conv2D(num_channels=1, num_filters=64, filter_size=3)
        self.bn1 = fluid.dygraph.BatchNorm(num_channels=64, act='relu')
        self.pool1 = Pool2D(pool_size=2, pool_stride=2)
        # 第二组卷积池化
        self.conv2 = Conv2D(num_channels=64, num_filters=128, filter_size=3)
        self.bn2 = fluid.dygraph.BatchNorm(num_channels=128, act='relu')
        self.pool2 = Pool2D(pool_size=2, pool_stride=2)
        # 全连接输出层
        self.fc1 = Linear(input_dim=128*5*5, output_dim=1024)
        self.bnfc1 = fluid.dygraph.BatchNorm(num_channels=1024, act='relu')
        self.fc2 = Linear(input_dim=1024, output_dim=1)

知识点2 BN层

在这里插入图片描述

3.训练步骤

在这里插入图片描述
训练时先训练判别器:将训练集数据(Training Set)打上真标签(1)和生成器(Generator)生成的假图片(Fake image)打上假标签(0)一同组成batch送入判别器(Discriminator),对判别器进行训练。计算loss时使判别器对真数据(Training Set)输入的判别趋近于真(1),对生成器(Generator)生成的假图片(Fake image)的判别趋近于假(0)。此过程中只更新判别器(Discriminator)的参数,不更新生成器(Generator)的参数。

然后再训练生成器:将高斯分布的噪声z(Random noise)送入生成器(Generator),然后将生成器(Generator)生成的假图片(Fake image)打上真标签(1)送入判别器(Discriminator)。计算loss时使判别器对生成器(Generator)生成的假图片(Fake image)的判别趋近于真(1)。此过程中只更新生成器(Generator)的参数,不更新判别器(Discriminator)的参数。

总结:每轮先更新两次D(真假样本各一次)再更新一次G

三、CGAN(Conditional GAN)介绍

针对GAN网络生成的不灵活性(若想生成0~9的手写数字,需要将数据集按标签分为10组,并每组训练一个模型)所提出的通过添加限制条件来控制GAN生成数据的特征和类型。

1、目标函数比较

CGAN优化的目标是:在条件Y下,在判别器最大化真实数据与生成数据差异的情况下,最小化这个差距。训练CGAN的生成器时要同时送入随机噪声z和条件y(即手写数字数据集的数字标签),生成网络学习的概率分布P(x|y)。
在这里插入图片描述
**D(x)**表示D网络判断真实图片是否真实的概率,**D(G(z))**是D网络判断G生成的图片的是否真实的概率。
生成器G希望D(G(z))尽可能大,此时会使得V(D,G)整个式子的值相应变小⇒目标函数的记号为min_G;
判别器D希望D(x)尽可能大(真实图像应接近1),此时会使得V(D,G)整个式子的值相应变大⇒目标函数的记号为max_D;

2、网络结构对比

在这里插入图片描述
注意:此时仍然需要输入随机噪声z,不能用条件y(一个取值仅为0~9的维度为1的向量)替代。一般噪声z的维度为几十到一百就能生成比较理想的图片细节,如果太低会导致生成器拟合能力不足,生成图片质量低下。
Pix2Pix模型的输入是一张和输出尺寸相同的图片,可以不输入噪声z。

3、网络代码

CGAN码上实现
重点:将标签y需要与生成器和判别器的每层网络生成的特征图进行拼接

四、像素迁移网络Pix2Pix

1、传统GAN生成图片与Pix2Pix的不同

正确生成
正确生成;
错误输出,虽然生成器学习到输入数据集“猫”的像素概率分布,但是明显形态与输入不同
错误输出,虽然生成器学习到输入数据集“猫”的像素概率分布,但是明显形态与输入不同;但因为这也是一张猫图片,是符合训练集图片的像素概率分布的,所以会被经典GAN判别为真图片。

2、Pix2Pix的网络结构

为了解决这一问题,我们将输入的猫草图作为“条件标签”和生成的猫图片一起送入判别器进行判断。判别器D的训练目标就是在输入不是一对真实图像(A&B‘)时输出小的概率值(比如最小是0),在输入是一对真实图像(A&B)时输出大的概率值(比如最大是1)。生成器G的训练目标就是使得生成的B’和A作为判别器D的输入时,判别器D输出的概率值尽可能大,这样就相当于成功欺骗了判别器D。如下图:
在这里插入图片描述

  • CGAN的生成器采用“先下采样编码,再上采样解码”的encoder-decoder结构;Pix2Pix则采用U-net(使用了多尺度融合的方式进行跨层连接),U-net网络增加了skip connections模块, 直接从i层传输到n-i层,n是总得网络层数,i是与n-i层之间有相应的通道。
  • 判别器PatchGAN: 下文中即将提到Pix2Pix的损失函数利用GAN结构构建高频信息,因此不需要将整张图片输入到判别器内,让判别器对图像的每个大小为N x N的patch做真假判别就可以了。这样可以减少参数数量,加快训练速度。PatchGAN的判别器输出的是一个30×30的特征图,这个特征图的每一个点对应原图片一块70×70大小的patch。计算对抗loss时将这个特征图降维取均值,以衡量生成图片的每一个patch与真图片的差异。

3、损失函数

Pix2Pix的loss由L1CGAN损失构成。
L1损失(保证生成图片物体的边缘对齐和颜色还原):
在这里插入图片描述
L1即为逐像素求差的绝对值再求平均,其中z指C输入给生成器的(一般是高斯分布的)噪声,Pix2Pix网络中不输入z;
CGAN损失(使生成的图片更清晰,也就是所谓构建图片的“高频部分”):
在这里插入图片描述
由此可得Pix2Pix网络的总Loss函数可表示为:
在这里插入图片描述

4、网络代码

Pix2Pix码上实现

知识点总结

知识点1 卷积层参数

卷积层参数:卷积核大小、步长和填充
一个卷积核对应一个前馈神经网络的神经元,核中每个元素对应一个权重系数和偏差量;
步长定义了卷积核相邻两次扫过特征图时位置的距离:步长为1 —— 逐个扫过元素
步长为n —— 下次扫描跳过(n-1)个

实例:16x16的输入图像经过单位步长、无填充的5x5的卷积核后,输出12x12的特征图

知识点2 BN(BatchNorm)层

深度学习中每一个batch输入的数据都具有不同的分布,为达到深度学习的目的:学习训练数据的分布,并在测试集上达到很好的泛化效果,需要对数据做归一化。但考虑到深度学习需要每次学到的数据分布应该是变化且逐渐逼向GroundTrue,不能简单的对每个batch直接归一化(会变成均值为0,方差为1的数据,对网络训练没有任何意义),因此是对可训练的参数进行归一化。
Batchnorm原理详解
在这里插入图片描述

知识点3 残差块(网络)

由于在设计网络结构时无法预估最佳的网络层数,所以一般实际设计层数相比于最佳层数只多不少,这时我们希望多余的卷积层能够进行恒等映射,即输入等于输出,F(x)=x,从而保证多余的神经网络不会影响我们最优的效果。
在这里插入图片描述
上图为构建的一个残差块,x作为输入;F(x)则是残差,也是经过第一层线性变化并激活后的输出。通过在第二层输出值激活加入X,保留了输入的x,则当F(x)=0时,输出即为输入。相比之下,让网络输出趋近于0比趋近于x更容易。

知识点4 无监督/有监督学习

在GAN网络中,有监督表示训练数据是成对的 ,无监督表示训练数据是未配对的。Pix2pix网络就是有监督网络,而cycleGAN就是无监督网络。

**无监督学习:**对没有label(分类)的训练样本进行学习,以发现训练样本集中的结构性知识。这里,所有的标记(分类)是未知的。因此,训练样本的岐义性高。聚类就是典型的无监督学习。
有监督学习:对具有label(分类)的训练样本进行学习,以尽可能对训练样本集外的数据进行标记(分类)预测。这里,所有的标记(分类)是已知的。因此,训练样本的岐义性低。

知识点5 注意力机制

注意力机制希望计算机在进行信息编码与解码时能够参考人眼对物体观察的特性:对重点的注意力更多,对背景的注意力会相应减少.例如在机器翻译时,当已经输入eating,我们期望下一个立刻看到食物名词,而不是用于描述食物外形的形容词,因此会对"apple"的注意力更高,对"green"的注意力相对较少.
在这里插入图片描述
简言之,深度学习中的注意力机制可以被广义地解释为表示重要性的权重向量:为了预测或者推断某个元素,例如图片中的一个像素,或者句子中的一个单词,我们使用注意力向量估计它与其他元素的相关性有多强,并将它们的值与注意力向量加权之后的值之和作为目标的近似值。注意力机制
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值