GAN网络学习历程(1)

it2023-05-14  69

简单GAN网络以手写数字数据集为例

注:使用 jupyter notebook编写,与pycharm代码有所不同 tensorflow-GPU=2.0.0

import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers import matplotlib.pyplot as plt %matplotlib inline import numpy as np import glob import os #导入数据 (train_image, train_labels),(_,_) = tf.keras.dataset.minst.loaddata()#不需要测试数据,用占位符 # train_image.shape (60000,28,28) #train_images.dtype dtype(‘uint8’) 数据类型要利用归一化落到0的周围,因为激活函数 #能在0的周围发挥最大的作用 train_image = train_image.dtype(‘float32’)#将图片类型uint8转化为float型 (train_image – 127.5)/127.5 #使训练图像取值范围落到[-1,1] BATCH_SIZE = 256 BUFFER_SIZE = 60000 #一次取多少张/* #输入管道 datasets = tf.data.Dataset.from_tensor_slices(train_image) # 从rain_image 中创建数据集 datasets = datasets.shuffle(BUFFER_SIZE).batch(BATCH_SIZE) 定义生成器model def generator_model(): Model = tf.keras.Sequential()#创建顺序模型 添加几个层 #第一层 Model.add(layers.Dense(256,input_shape=(100,), use_bias=False))#长度为100的向量 Model.add(layers.BatchNormalization()) Model.add(layers.LeakyReLU())#使用内置激活函数 #第二层不需要input_shape了 Model.add(layers.Dense(512 , use_bias=False))#长度为100的向量 Model.add(layers.BatchNormalization()) Model.add(layers.LeakyReLU())#使用内置激活函数 #第三层 输出层 Model.add(layers.Dense(28*28*1, use_bias=False,activation=’tanh’))#长度为100的向量tanh激活函数使用tanh保证输出结果落在(-1,1)之间。 Model.add(layers.BatchNormalization()) Model.add(layers.LeakyReLU())#使用内置激活函数 Model.add(layers.Reshape((28,28,1)))#28*28*1的图片 Return model #定义辨别器model def discriminator_model(): model = keras.Sequential() model.add(layers.Flatten()) #把三维的输入图片给扁平 model.add(layers.Dense(512 , use_bias=False)) model.add(layers.batchnormalization()) model.add(layers.LeakyReLU()) model.add(layers.Dense(256 , use_bias=False)) model.add(layers.batchnormalization()) model.add(layers.LeakyReLU()) model.add(layers.Dense(1)) #判断是真是假 Dense为全连接层 return model #Loss函数 cross_entropy= tf.keras.losses.BinaryCrossentropy(from_logits=True)#使用内置损失函数 #判别器Loss def discriminator_loss(real_output,fake_ output): Real_loss = Cross_entropy(tf.ones_like(real_output), real_output) fake_loss = Cross_entropy(tf.zeros_like(fake_output), fake_output) return Real_loss + fake_loss #生成器Loss def generator_loss(fake_output):#生成器只接收fake output 输入的不是一张图片 return Cross_entropy(tf.ones_like(fake_output), fake_output) #希望我们的图片都能为真 #优化器定义 generator_opt = tf.keras.optimizers.Adam(1e-4)#学习率为0.0001 discriminator_opt = tf.keras.optimizers.Adam(1e-4) #参数设置 EPOCHS = 100 noise_dim = 100 num_exp_to_generate = 16 #观察生成过程 用种子 Seed = tf.random.normal ([num_exp_to_generate, noise_dim]) discriminator = discriminator_model() generator = generator_model()#执行这两个函数,返回两个model def train_step(images): Noise = tf.random.normal([BTACH_SIZE, noise_dim]) With tf.gradientTape() as gen_tape, With tf.gradientTape() as disc_tape, #记录梯度信息 real_out = discriminator(images, training = True) gen_image = generator(noise,training = true)#输入noise 产生一张图片 fake_out = discriminator(images, training = True) gen_loss = generator_loss(fake_output) disc_loss = discriminator_loss(real_output,fake_output) #计算梯度 gradient_gen = gen_tape_gradient(gen_loss,generator.trainable_variables) gradient_gen = disc_tape_gradient(disc_loss,discriminator.trainable_variables) #优化函数 generator_opt.apply_gradient(zip(gradient_gen, generator.trainable_variables)) discriminator_opt.apply_gradient(zip(gradient_disc, discriminator.trainable_variables))

GAN小tricks

G中使用ReLU; D中使用LReLU; 生成器中输出层不用BN,会导致神经网络不稳定;最后一层使用tanh激活;

最新回复(0)