你乐谷
首页 > 图文

深度学习笔记56_GAN也很简单_GAN模型的训练

2023-03-16 来源:你乐谷

深度学习笔记56_GAN也很简单_GAN模型的训练

本文核心词:人工智能,深度学习,keras

深度学习笔记56_GAN也很简单_GAN模型的训练


训练GAN图像
训练的流程如下:
从潜在空间中抽取随机的点(随机噪声)。
利用这个随机噪声用 generator 生成图像。
将生成图像与真实图像混合。
使用这些混合后的图像以及相应的标签(真实图像为“真”,生成图像为“假”)来训练discriminator
在潜在空间中随机抽取新的点。
使用这些随机向量以及全部是“真实图像”的标签来训练 gan。这会更新生成器的权重 (只更新生成器的权重,因为判别器在 gan 中被冻结),其更新方向是使得判别器能够将生成图像预测为“真实图像”。这个过程是训练生成器去欺骗判别器。
# 生成图像模型
import keras
from keras import layers
import numpy as np
latent_dim = 32
height = 32
width = 32
channels = 3
# 输入是一个潜在的随机向量,向量shape为(32,)
generator_input = keras.Input(shape=(latent_dim,))
# 第一层是一个全连接成,神经元的个数为(128*16*16)
x = layers.Dense(128*16*16)(generator_input)
# 激活函数使用 LeakyReLU
x = layers.LeakyReLU()(x)
# 将该层的输出转化为大小为(16,16),堆叠为128层的特征图
x = layers.Reshape((16,16,128))(x)
# 开始进行卷积网络
x = layers.Conv2D(256,kernel_size=5,padding=same)(x)
x = layers.LeakyReLU()(x)
# 转置卷积:完成对数据的尺寸的放大
x = layers.Conv2DTranspose(256,kernel_size=4,strides=2,padding=same)(x)
x = layers.LeakyReLU()(x)
# 卷积网络
x = layers.Conv2D(256, kernel_size=5, padding=same)(x)
x = layers.LeakyReLU()(x)
x = layers.Conv2D(256, kernel_size=5, padding=same)(x)
x = layers.LeakyReLU()(x)
# 生成一个大小为 32×32 的单通道特征图
x = layers.Conv2D(channels,
kernel_size=7,
activation=tanh,
padding=same)(x)
#将生成器模型实例化,它将形状为 (latent_dim,)
# 的输入映射到形状为 (32, 32, 3) 的图像
generator = keras.models.Model(generator_input,x)
# 判别器模型
discriminator_input = layers.Input(shape=(height,width,channels))
# 开始卷积网络训练
x = layers.Conv2D(128,3)(discriminator_input)
x= layers.LeakyReLU()(x)
x = layers.Conv2D(128,4,strides=2)(x)
x= layers.LeakyReLU()(x)
x = layers.Conv2D(128,4,strides=2)(x)
x= layers.LeakyReLU()(x)
x = layers.Conv2D(128,4,strides=2)(x)
x= layers.LeakyReLU()(x)
# 拉伸用来实现全连接层网络
x = layers.Flatten()(x)
# 使用dropout层来实现相关的网络
x = layers.Dropout(0.4)(x)
# 用来分类
x = layers.Dense(1,activation=sigmoid)(x)
# 将判别器模型实例化,它将形状为 (32,32,3)
#的输入转换为一个二进制分类决策(真 / 假)
# 搭建网络
discriminator = keras.models.Model(discriminator_input,x)
# 优化器
discriminator_optimizer = keras.optimizers.RMSprop(
lr = 0.0008,
clipvalue=1.0,# 使用梯度裁剪限制梯度值的范围
decay=1e-8) # 使用学习率衰减
discriminator pile(
optimizer = discriminator_optimizer,
loss =binary_crossentropy
)
#GAN模型
#如果在此过程中可以对判别器的权重进行更新,
# 那么我们就是在训练判别器始终预测“真”
discriminator.trainable = False
# 输入是潜在随机值
gan_input = keras.Input(shape=(latent_dim,))
# 输出就是判别器的判断
gan_output = discriminator(generator(gan_input))
gan = keras.models.Model(gan_input,gan_output)
gan_optimizer = keras.optimizers.RMSprop(lr=0.0004, clipvalue=1.0, decay=1e-8)
ganpile(optimizer=gan_optimizer, loss=binary_crossentropy)
import os
from keras.preprocessing import image
# 加载CIFAR10 数据
(x_train, y_train), (_, _) = keras.datasets.cifar10.load_data()
# 选择青蛙图像(类别编号为 6)
x_train = x_train[y_train.flatten() == 6]
# 数据标准化
x_train = x_train.reshape((x_train.shape[0],) 
(height, width, channels)).astype(float32) / 255.
# 迭代的次数 10000次
iterations = 10000
batch_size = 20
save_dir = result
start = 0
for step in range(iterations):
# 在潜在空间中采样随机点
random_latent_vectors = np.random.normal(
size=(batch_size,
latent_dim))
# 通过生成模型,将这些点解码为虚假图像
generated_images = generator.predict(random_latent_vectors)
# 本次迭代的需要处理多少张图片
stop = start batch_size
# 获得真实的图片
real_images = x_train[start:stop]
# 将这些虚假图像与真实图像合在一起
combined_images = np.concatenate([generated_images,real_images])
# 合并标签,区分真实和虚假的图像
labels = np.concatenate([np.ones((batch_size,1)),
np.zeros((batch_size,1))])
# 向标签中添加随机噪声
labels  = 0.05 * np.random.random(labels.shape)
# 训练判别器
d_loss = discriminator.train_on_batch(combined_images,labels)
# 在潜在空间中采样随机点
random_latent_vectors = np.random.normal(size=(batch_size,latent_dim))
# 合并标签,全部是“真实图像”(这是在撒谎)
misleading_targets = np.zeros((batch_size,1))
# 通过 gan 模型来训练生成器( 此 时 冻 结 判别器权重)
a_loss = gan.train_on_batch(random_latent_vectors,
misleading_targets)
start  = batch_size
if startlen(x_train)-batch_size:
start = 0
# 每 100 步保存并绘图
if step % 100 ==0:
# 保存模型权重
gan.save_weights(gan.h5)
print(discriminator loss:, d_loss)
print(adversarial loss:, a_loss)
# 保存一张生成图像
img = image.array_to_img(generated_images[0] * 255., scale=False)
img.save(os.path.join(save_dir,
generated_frog   str(step)   .jpg))
# 保存一张真实图像,用于对比
img = image.array_to_img(real_images[0] * 255., scale=False)
img.save(os.path.join(save_dir,
real_frog   str(step)   .jpg))
discriminator loss: 0.66969573
adversarial loss: 0.6532642
discriminator loss: 0.5475507
adversarial loss: 1.3109558
discriminator loss: 0.6699523
adversarial loss: 0.7478587
discriminator loss: 0.70896524
adversarial loss: 0.8421527
discriminator loss: 0.9083044
adversarial loss: 1.5422354
discriminator loss: 0.65306413
adversarial loss: 0.847822
最后自动生成的图片案例如下:个人觉得效果不是很好,应该还有优化的空间

深度学习笔记56_GAN也很简单_GAN模型的训练


分享关于人工智能,机器学习,深度学习以及计算机视觉的好文章,同时自己对于这个领域学习心得笔记。想要一起深入学习人工智能的小伙伴一起结伴学习吧!扫码上车!

猜你喜欢