GAN network learning process (1)

Simple GAN network taking handwritten digit data set as an example

Note: written in jupyter notebook, different from pycharm code
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 little tricks

ReLU
is used in G; LReLU is used in D;
BN is not used in the output layer of the generator, which will cause the neural network to be unstable; the last layer is activated by tanh;

Guess you like

Origin blog.csdn.net/HenryFanQAQ/article/details/109183245