1、概述
对抗生成模型是人工智能模型中经常使用的结构,本文介绍使用tensorflow实现手写数字的生成。生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。
生成效果如下图所示(该图片来自于tensorflow官网):
2、模型基本结构
模型的基本结构如下图所示
对模型说明如下
- 首先生成一个维度为100的随机噪点数据,该数据作为生成图像的原始语料
- 噪点数据经过生成模型的反卷积操作将维度为100的噪点数据扩充为28*28*1的图像数据
- 生成数据与真实数据经过判别的模型,通过特殊的代价函数的设计保证生成效果
2.1 生成器的基本结构
基本流程说明如下:
1、原始噪点信息:(256, 100)
2、噪点信息进行全链接处理 (256, 3136)
3、对x进行标准化处理,标准化之后的数据方差更接近于0.标准差更接近1
4、为了方便反卷积,将x数据整合为形状 7 7 64
5、进行第一次反卷积,形状不变(256, 7, 7, 64)
6、进行第二次反卷积,第二次反卷积之后深度减半,长宽加倍(256, 14, 14, 32)
7、进行第三次反卷积,第三次反卷积之后深度变为1,长宽变为28,为训练数据对象保持一致(256, 28, 28, 1)
生成器的参考代码如下:
class Generator(tf.keras.Model):
def __init__(self):
super(Generator, self).__init__()
self.fc1 = tf.keras.layers.Dense(7*7*64, use_bias=False)
self.batchnorm1 = tf.keras.layers.BatchNormalization()
self.conv1 = tf.keras.layers.Conv2DTranspose(64, (5, 5), strides=(1, 1), padding='same', use_bias=False)
self.batchnorm2 = tf.keras.layers.BatchNormalization()
self.conv2 = tf.keras.layers.Conv2DTranspose(32, (5, 5), strides=(2, 2), padding='same', use_bias=False)
self.batchnorm3 = tf.keras.layers.BatchNormalization()
self.conv3 = tf.keras.layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False)