深度学习之基于DCGAN实现动漫人物的生成
注:因?yàn)橛布?#xff0c;這次的實(shí)驗(yàn)并沒(méi)有生成圖片,但是代碼應(yīng)該是沒(méi)有問(wèn)題的,可以參考學(xué)習(xí)一下。
本次基于DCGAN實(shí)現(xiàn)動(dòng)漫人物的生成。最終的效果可以參考大神**K同學(xué)啊**的博客。與上篇文章基于DCGAN生成手寫數(shù)字的步驟基本一致。
1.導(dǎo)入庫(kù)
import tensorflow as tf import numpy as np import glob,imageio,os,PIL,pathlib import matplotlib.pyplot as plt# 支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來(lái)正常顯示中文標(biāo)簽 plt.rcParams['axes.unicode_minus'] = False # 用來(lái)正常顯示負(fù)號(hào)2.數(shù)據(jù)準(zhǔn)備
data_dir = "E:/tmp/.keras/datasets/car_face_photos" data_dir = pathlib.Path(data_dir)pic_paths = list(data_dir.glob('*')) pic_paths = [str(path) for path in pic_paths] img_count = len(list(pic_paths))#共21551張圖片 plt.figure(figsize=(10, 5)) plt.suptitle("數(shù)據(jù)示例", fontsize=15)for i in range(40):plt.subplot(5, 8, i + 1)plt.xticks([])plt.yticks([])# 顯示圖片images = plt.imread(pic_paths[i])plt.imshow(images)plt.show()查看圖片:
數(shù)據(jù)預(yù)處理:
1.歸一化到[-1,1]之間
2.調(diào)整圖片大小為[64,64]
3.將數(shù)據(jù)按照batch_size劃分開,并打亂
3.生成器與判別器的構(gòu)建
生成器采用tf.keras.layers.Conv2DTranspose(上采樣層)從噪聲數(shù)據(jù)中產(chǎn)生圖片。以一個(gè)使用該種子作為輸入的 Dense 層開始,然后多次上采樣直到達(dá)到所期望的 64x64x3 的圖片尺寸。
除了最后一層使用tanh作為激活函數(shù)外,其余的都采用LeakyReLU作為激活函數(shù)。
判別器為基于CNN的圖片分類器
#判別器的構(gòu)建 def Discriminator_model():model = tf.keras.Sequential([tf.keras.layers.Conv2D(128,(5,5),strides=(2,2),padding="same",input_shape=[64,64,1]),tf.keras.layers.LeakyReLU(),tf.keras.layers.Dropout(0.3),tf.keras.layers.Conv2D(128,(5,5),strides=(2,2),padding="same"),tf.keras.layers.LeakyReLU(),tf.keras.layers.Dropout(0.3),tf.keras.layers.Conv2D(256, (5, 5), strides=(2, 2), padding="same"),tf.keras.layers.LeakyReLU(),tf.keras.layers.Dropout(0.3),tf.keras.layers.Conv2D(512, (5, 5), strides=(2, 2), padding="same"),tf.keras.layers.LeakyReLU(),tf.keras.layers.Dropout(0.3),tf.keras.layers.Flatten(),tf.keras.layers.Dense(1,activation='sigmoid')])return model discriminator = Discriminator_model() discriminator.summary() Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d (Conv2D) (None, 32, 32, 128) 3328 _________________________________________________________________ leaky_re_lu_4 (LeakyReLU) (None, 32, 32, 128) 0 _________________________________________________________________ dropout (Dropout) (None, 32, 32, 128) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 16, 16, 128) 409728 _________________________________________________________________ leaky_re_lu_5 (LeakyReLU) (None, 16, 16, 128) 0 _________________________________________________________________ dropout_1 (Dropout) (None, 16, 16, 128) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 8, 8, 256) 819456 _________________________________________________________________ leaky_re_lu_6 (LeakyReLU) (None, 8, 8, 256) 0 _________________________________________________________________ dropout_2 (Dropout) (None, 8, 8, 256) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 4, 4, 512) 3277312 _________________________________________________________________ leaky_re_lu_7 (LeakyReLU) (None, 4, 4, 512) 0 _________________________________________________________________ dropout_3 (Dropout) (None, 4, 4, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 8192) 0 _________________________________________________________________ dense_1 (Dense) (None, 1) 8193 ================================================================= Total params: 4,518,017 Trainable params: 4,518,017 Non-trainable params: 0 _________________________________________________________________4.loss值與優(yōu)化器
計(jì)算交叉熵
cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)因?yàn)榉譃榕袆e器的生成器,因此loss值的計(jì)算方式也是不同的。
判別器的loss值:判斷真實(shí)圖片為1的loss與判斷生成圖片為0的loss之和。因?yàn)榕袆e器希望將真實(shí)圖片判別為1,將生成圖片判別為0.
生成器的loss值:判斷生成圖片為1的loss。因?yàn)樯善飨M傻膱D片是真實(shí)圖片,即判別為1.
優(yōu)化器也分為兩個(gè):
generator_opt = tf.keras.optimizers.Adam(learning_rate=1e-4) discriminator_opt = tf.keras.optimizers.Adam(learning_rate=1e-4)參數(shù)設(shè)置
epochs = 600 noise_dim = 100 num_exp_to_generate = 16seed = tf.random.normal([num_exp_to_generate,noise_dim])5.批次訓(xùn)練
訓(xùn)練循環(huán)在生成器接收到一個(gè)隨機(jī)種子作為輸入時(shí)開始。該種子用于生產(chǎn)一張圖片。判別器隨后被用于區(qū)分真實(shí)圖片(選自訓(xùn)練集)和偽造圖片(由生成器生成)。針對(duì)這里的每一個(gè)模型都計(jì)算損失函數(shù),并且計(jì)算梯度用于更新生成器與判別器。
def train_step(images):noise = tf.random.normal([batch_size,noise_dim])#生成一個(gè)batch_size*noise_dim的數(shù)據(jù),相當(dāng)于生成了batch_size個(gè)長(zhǎng)度為100的隨機(jī)向量with tf.GradientTape() as gen_tape,tf.GradientTape() as dis_tape:#兩個(gè)Tape,一個(gè)代表生成器,一個(gè)代表判別器。real_out = discriminator(images,training = True)#利用判別器對(duì)真實(shí)的圖片進(jìn)行訓(xùn)練,得到一個(gè)modelgen_image = generator(noise,training = True)#利用生成器對(duì)噪聲數(shù)據(jù)生成圖片fake_out = discriminator(gen_image, training=True)#利用判別器對(duì)生成的圖片進(jìn)行訓(xùn)練gen_loss = Generator_loss(fake_out)#利用判別器對(duì)生成圖片的判斷計(jì)算生成器的loss值dis_loss = Discriminator_loss(real_out,fake_out)##利用判別器對(duì)生成圖片和真實(shí)圖片的判斷計(jì)算判別器的loss值gradient_gen = gen_tape.gradient(gen_loss,generator.trainable_variables)#根據(jù)生成器的loss值和網(wǎng)絡(luò)模型計(jì)算梯度gradient_dis = dis_tape.gradient(dis_loss, discriminator.trainable_variables)#根據(jù)判別器的loss值和網(wǎng)絡(luò)模型計(jì)算梯度Generator_opt.apply_gradients(zip(gradient_gen,generator.trainable_variables))#根據(jù)梯度對(duì)生成器進(jìn)行梯度更新Discriminator_opt.apply_gradients(zip(gradient_dis,discriminator.trainable_variables))#根據(jù)梯度對(duì)判別器進(jìn)行梯度更新可視化圖片并保存到本地
def Generator_plot_image(gen_model,test_noise,epoch):pre_images = gen_model.predict(test_noise,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)plt.axis('off')fig.savefig("E:/tmp/.keras/datasets/cartoon_photos_gen_DCGAN/%05d.png" % epoch)plt.close()訓(xùn)練模型:
def train(dataset,epochs):for epoch in range(epochs):for image_batch in dataset:train_step(image_batch)print('.',end='')print()Generator_plot_image(generator,seed,epoch) train(dataset,epochs)也可以用來(lái)生成其他的圖片,可以起到數(shù)據(jù)增強(qiáng)的效果。
努力加油a啊
總結(jié)
以上是生活随笔為你收集整理的深度学习之基于DCGAN实现动漫人物的生成的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深度学习之基于DCGAN实现手写数字生成
- 下一篇: 深度学习之基于LeNet-5实现cifa