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
查看tensorflow版本
查看是否支持GPU 1 tf.test.is_gpu_available()
加载mnist手写数据集 1 (train_image,train_labels),(_,_) = tf.keras.datasets.mnist.load_data()
查看数据 1 2 train_image.shape (60000, 28, 28)
1 2 train_image.dtype dtype('uint8')
数据转换 1 train_image = train_image.reshape(train_image.shape[0],28,28,1).astype('float32')
查看数据 1 2 3 4 train_image.shape (60000, 28, 28, 1) train_image.dtype dtype('float32')
归一化 1 train_image = (train_image-127.5)/127.5 #[-1~1]
创建输入管道 1 2 BATCH_SIZE = 256 BUFFER_SIZE = 60000
1 2 datasets = tf.data.Dataset.from_tensor_slices(train_image) datasets = datasets.shuffle(BUFFER_SIZE).batch(BATCH_SIZE)
生成器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 def generator_model():#生成器 model = tf.keras.Sequential() model.add(layers.Dense(7*7*256,input_shape=(100,),use_bias=False)) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Reshape((7,7,256)))#7*7*256 model.add(layers.Conv2DTranspose(128,5,strides=(1,1),padding='same',use_bias=False)) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) #7*7*128 model.add(layers.Conv2DTranspose(64,5,strides=(2,2),padding='same',use_bias=False)) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) #14*14*64 model.add(layers.Conv2DTranspose(1,5,strides=(2,2),padding='same',use_bias=False,activation='tanh'))#28,28,1 return model
辨别器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def discriminator_model():#辨别器 model = tf.keras.Sequential() model.add(layers.Conv2D(64,(5,5),strides=(2,2),padding='same',input_shape=(28,28,1))) model.add(layers.LeakyReLU())#14,14,64 model.add(layers.Dropout(0.3)) model.add(layers.Conv2D(128,(5,5),strides=(2,2),padding='same')) model.add(layers.LeakyReLU())#7,7,128 model.add(layers.Dropout(0.3)) model.add(layers.Conv2D(256,(5,5),strides=(2,2),padding='same')) model.add(layers.LeakyReLU())#3,3,256 model.add(layers.Flatten()) model.add(layers.Dense(1)) return model
定义loss计算指标 1 2 # 计算loss cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)
定义辨别器loss 1 2 3 4 def discriminator_loss(real_out,fake_out):#辨别器loss 实际图片、生成图片 real_loss = cross_entropy(tf.ones_like(real_out),real_out)#我们希望真实的图片判定为1(ones) fake_loss = cross_entropy(tf.zeros_like(fake_out),fake_out)#我们希望生成的图片判定为0(zeros) return real_loss+fake_loss
定义生成器loss 1 2 def generator_loss(fake_out):#生成器loss 实际图片、生成图片 return cross_entropy(tf.ones_like(fake_out),fake_out)#对生成器我们希望生成的图片判定为0(zeros)
设置优化器 1 2 generator_opt = tf.keras.optimizers.Adam(1e-4)#10的负4次放 discriminator_opt = tf.keras.optimizers.Adam(1e-4)#10的负4次放
设置参数 1 2 3 4 5 6 EPOCHS = 100 noise_dim = 100 num_exp_to_genertor = 16#每个rpoch生成样本数量 seed = tf.random.normal([num_exp_to_genertor,noise_dim])# 正态分布随机数
1 2 generator = generator_model() discriminator = discriminator_model()
设置每步运算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @tf.function def train_step(images): noise = tf.random.normal([BATCH_SIZE,noise_dim]) with tf.GradientTape() as gen_type,tf.GradientTape() as disc_type: real_out = discriminator(images,training=True)#真实输出 辨别器 gen_image = generator(noise,training=True)#生成图片输出 fake_out = discriminator(gen_image,training=True) gen_loss = generator_loss(fake_out) disc_loss = discriminator_loss(real_out,fake_out) gradient_gen = gen_type.gradient(gen_loss,generator.trainable_variables)#计算生成器损失与生成器变量之间的梯度 gradient_disc = disc_type.gradient(disc_loss,discriminator.trainable_variables)#计算辨别器损失与辨别器变量之间的梯度 generator_opt.apply_gradients(zip(gradient_gen,generator.trainable_variables)) discriminator_opt.apply_gradients(zip(gradient_disc,discriminator.trainable_variables))
定义绘制函数 1 2 3 4 5 6 7 8 def genrate_plot_image(gen_model,test_noise):#将生成的图片打印出来 pre_images = gen_model(test_noise,training=False)#training=False 不需要训练 fig = plt.figure(figsize=(4,4)) for i in range(pre_images.shape[0]): plt.subplot(4,4,i+1) plt.imshow((pre_images[i,:,:,0]+1)/2,cmap='gray') plt.axis('off') plt.show()
模型训练 1 2 3 4 5 6 def train(dataset,epochs): for epoch in range(epochs): for image_batch in dataset: train_step(image_batch) print("*",end='') genrate_plot_image(generator,seed)