机器学习-生成对抗网络实战(二-1)

这篇博客详细介绍了生成对抗网络(GAN)的基础概念和实现细节。首先,定义了生成器和判别器的网络结构,包括多个转置卷积层和卷积层,用于图像从低维到高维的生成及真假判断。网络模型的选择着重于转置卷积,通过不同步长和填充计算输出尺寸。最后,概述了前向传播的过程。文章强调理解每个网络层的作用和维度变换,为后续的训练过程打下基础。
摘要由CSDN通过智能技术生成

建议大家先看机器学习-生成对抗网络基础概念(一),再来看实战就应该知道程序的具体流程了。本篇主要定义了生成对抗网络(Generative Adversarial Network)中的生成网络和判别网络部分,大家着重理解每一个网络层的含义和变换。

具体的训练过程在下一节机器学习-生成对抗网络实战(二-2)会有讲解,希望大家先将本篇看懂。


目录

Part1:

自定义生成器网络类:

生成网络:

自定义判别器网络类:

判别器网络:


Part1:

自定义生成器网络类:

生成网络:

class Generator(keras.Model):
    # 生成器网络
    def __init__(self):
        super(Generator, self).__init__()
        filter = 64
        # 转置卷积层1,输出channel为filter*8,核大小4,步长1,不使用padding,不使用偏置
        # 输入是1*1,此时的卷积核大小为4*4根据公式1-1+4,最终输出是4*4,通道数为64*8
        self.conv1 = layers.Conv2DTranspose(filter*8, 4,1, 'valid', use_bias=False)
        self.bn1 = layers.BatchNormalization()
        # 转置卷积层2    输入是4*4,套用公式输出为4*2=8 输出是8*8,通道数为64*4
        self.conv2 = layers.Conv2DTranspose(filter*4, 4,2, 'same', use_bias=False)
        self.bn2 = layers.BatchNormalization()
        # 转置卷积层3    同上,输出是16*16,通道数64*2
        self.conv3 = layers.Conv2DTranspose(filter*2, 4,2, 'same', use_bias=False)
        self.bn3 = layers.BatchNormalization()
        # 转置卷积层4    同上,输出是32*32,通道数64*1
        self.conv4 = layers.Conv2DTranspose(filter*1, 4,2, 'same', use_bias=False)
        self.bn4 = layers.BatchNormalization()
        # 转置卷积层5    同上,输出是64*64,通道数3
        self.conv5 = layers.Conv2DTranspose(3, 4,2, 'same', use_bias=False)

输入时的像素是1*1的,后面会有讲,这里主要讲解维度变化。

网络模型选择的是转置卷积:

当填充padding=’VALID’时,输出=(输入像素维度-1)*步长+卷积核的维度

当填充padding=’SAME’时,输出=输入像素维度*步长

输入是1*1,卷积核大小为4*4,padding=’VALID’。根据公式宽=高=(1-1)*1+4=4,最终输出是4*4,通道数为64*8

输入是4*4,padding=’SAME’。根据公式宽=高=4*2=8,输出是8*8,通道数为64*4

以此类推最终输出64*64,通道数为3的张量。

前向传播:

就是利用上述网络,最后利用tanh激活,得到输出范围为-1~1,便于后续使用。


自定义判别器网络类:

判别器网络:

class Discriminator(keras.Model):
    # 判别器
    def __init__(self):
        super(Discriminator, self).__init__()
        filter = 64
        # 卷积层
        self.conv1 = layers.Conv2D(filter, 4, 2, 'valid', use_bias=False)
        self.bn1 = layers.BatchNormalization()
        # 卷积层
        self.conv2 = layers.Conv2D(filter*2, 4, 2, 'valid', use_bias=False)
        self.bn2 = layers.BatchNormalization()
        # 卷积层
        self.conv3 = layers.Conv2D(filter*4, 4, 2, 'valid', use_bias=False)
        self.bn3 = layers.BatchNormalization()
        # 卷积层
        self.conv4 = layers.Conv2D(filter*8, 3, 1, 'valid', use_bias=False)
        self.bn4 = layers.BatchNormalization()
        # 卷积层
        self.conv5 = layers.Conv2D(filter*16, 3, 1, 'valid', use_bias=False)
        self.bn5 = layers.BatchNormalization()
        # 全局池化层
        self.pool = layers.GlobalAveragePooling2D()
        # 特征打平
        self.flatten = layers.Flatten()
        # 2分类全连接层
        self.fc = layers.Dense(1)

针对卷积层生成矩阵的形状简单说一下:

卷积核为4*4,步长为2,因此输入64*64的矩阵得到(64-4)/2+1=31,因此第一层输出为31*31的矩阵。大家可以自行推导。

最终以2*2矩阵,1024通道进入池化层。之后将像素减半得到1*1的矩阵,接着将其打平(即n行1列)传入全连接层得到二分类的输出。

前向传播不再赘述。


代码来自于《TensorFlow深度学习》-龙龙老师

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值