DCGAN生成动漫头像(附代码)
DCGAN。顾名思义,就是深度卷积生成对抗神经网络,也就是引入了卷积的,但是它用的是反卷积,就是卷积的反操作。
我们看看DCGAN的图:
生成器开始输入的是噪声数据,然后经过一个全连接层,再把全连接层的输出reshape,然后经过反卷积,
判别器就是卷积层,最后一个全连接层,用sigmoid激活函数。
DCGAN注意事项:
生成器的全部激活函数用relu,除了最后一层用tanh函数
判别器的激活函数都是LeakyRelu,最后一层是sigmoid、
生成器和判别器都是用BN层,
在判别器中只需要一层全连接层用于最后的分类,不要接太多,一个就好
训练的时候需要将原始输入图像resize到[-1,1]
生成器最后一层不使用BN层,判别器第一层不使用BN层
然后将下DCGAN的网络结构:
首先是生成网络:
第一层:全连接层,输出神经元个数64×8×图像长×图像宽,这个地方的长和宽是要原始图片反推过来的,然后reshape成[batch_size,图像长,图像宽,64×8],然后接着relu激活函数
第二层:反卷积层(deconv),卷积核大小[5,5],步长2,权重使用高斯分布,同时权重的初始化标准差stddev=0.02,输出通道数64×4,后面接BN层,然后使用relu作为激活函数
第三层:也是反卷积层,参数和上面的一样,输出通道数是64×2,也是BN加relu
第四层:也是反卷积层,参数和上面的一样,输出通道数是64×1,也是BN加relu
第五层:反卷积层,输出通道数为3,后面接relu(没有BN层)
然后看我实现的代码:
导入相关的库
import matplotlib.pyplot as plt
import tensorflow as tf
from scipy import misc
import os
import numpy as np
%matplotlib inline
这个是显示图片,方便训练过程中查看
def vis_img(batch_size,samples):fig,axes = plt.subplots(figsize=(7,7),nrows=8,ncols=8,sharey=True,sharex=True)for ax,img in zip(axes.flatten(),samples[batch_size]):#print(img.shape)ax.xaxis.set_visible(False)ax.yaxis.set_visible(False)im = ax.imshow(img.reshape((32, 32,3)), cmap='Greys_r')plt.show()return fig, axes
得到batch
import os
from scipy import misc
import numpy as np
def read_img(path):img = misc.imresize(misc.imread(path),size=[32,32])return imgdef get_batch(path,batch_size):img_list = [os.path.join(path,i) for i in os.listdir(path)]n_batchs = len(img_list)//batch_sizeimg_list = img_list[:n_batchs*batch_size]for ii in range(n_batchs):tmp_img_list = img_list[ii*batch_size:(ii+1)*batch_size]img_batch = np.zeros(shape=[batch_size, 32, 32, 3])for jj,img in enumerate(tmp_img_list):img_batch[jj] = read_img(img)yield img_batch
构建生成网络
def generator(inputs,stddev=0.02,alpha=0.2,name='generator',reuse=False):with tf.variable_scope(name,reuse=reuse) as scope:fc1 = tf.layers.dense(gen_input,64*8*6*6,name='fc1')re1 = tf.reshape(fc1, (-1, 6, 6, 512),name='reshape')bn1 = tf.layers.batch_normalization(re1,name='bn1')#ac1 = tf.maximum(alpha * bn1, bn1,name='ac1')ac1 = tf.nn.relu(bn1,name='ac1')de_conv1 = tf.layers.conv2d_transpose(ac1,256,kernel_size=[5,5],padding='same',strides=2,kernel_initializer=tf.random_normal_initializer(stddev=stddev),name='decov1')bn2 = tf.layers.batch_normalization(de_conv1,name='bn2')#ac2 = tf.maximum(alpha * bn2, bn2,name='ac2')ac2 = tf.nn.relu(bn2,name='ac2')de_conv2 = tf.layers.conv2d_transpose(ac2, 128, kernel_size=[5, 5],padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev),strides=2, name='decov2')bn3 = tf.layers.batch_normalization(de_conv2,name='bn3')#ac3 = tf.maximum(alpha * bn3, bn3,name='ac3')ac3 = tf.nn.relu(bn3,name='ac3')de_conv3 = tf.layers.conv2d_transpose(ac3, 64, kernel_size=[5, 5],padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev), strides=2, name='decov3')bn4 = tf.layers.batch_normalization(de_conv3,name='bn4')#ac4 = tf.maximum(alpha * bn4, bn4,name='ac4')ac4 = tf.nn.relu(bn4,name='ac4')logits = tf.layers.conv2d_transpose(ac4, 3, kernel_size=[5, 5], padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev), strides=2,name='logits')output = tf.tanh(logits)return output
构建判别网络:
def discriminator(inputs,stddev=0.02,alpha=0.2,batch_size=64,name='discriminator',reuse=False):with tf.variable_scope(name,reuse=reuse) as scope:conv1 = tf.layers.conv2d(inputs,64,(5,5),(2,2),padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev),name='conv1')ac1 = tf.maximum(alpha*conv1,conv1,name='ac1')conv2 = tf.layers.conv2d(ac1, 128, (5,5), (2, 2), padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev), name='conv2')bn2 = tf.layers.batch_normalization(conv2, name='bn2')ac2 = tf.maximum(alpha * bn2, bn2, name='ac2')conv3 = tf.layers.conv2d(ac2, 256, (5,5), (2, 2), padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev), name='conv3')bn3 = tf.layers.batch_normalization(conv3, name='bn3')ac3 = tf.maximum(alpha * bn3, bn3, name='ac3')conv4 = tf.layers.conv2d(ac3, 512, (5,5), (2, 2), padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev), name='conv4')bn4 = tf.layers.batch_normalization(conv4, name='bn4')ac4 = tf.maximum(alpha * bn4, bn4, name='ac4')flat = tf.reshape(ac4,shape=[batch_size,6*6*512],name='reshape')fc2 = tf.layers.dense(flat, 1, kernel_initializer=tf.random_normal_initializer(stddev=stddev), name='fc2')return fc2
lr = 0.0002
epochs = 100
batch_size = 64alpha = 0.2
with tf.name_scope('gen_input') as scope:gen_input = tf.placeholder(dtype=tf.float32,shape=[None,100],name='gen_input')with tf.name_scope('dis_input') as scope:real_input = tf.placeholder(dtype=tf.float32,shape=[None,96,96,3],name='dis_input')gen_out = generator(gen_input,stddev=0.02,alpha=alpha,name='generator',reuse=False)real_logits = discriminator(real_input,alpha=alpha,batch_size=batch_size)
fake_logits = discriminator(gen_out,alpha=alpha,reuse=True)#var_list_gen = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope='generator')
#var_list_dis = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope='discriminator')
train_var = tf.trainable_variables()
var_list_gen = [var for var in train_var if var.name.startswith('generator') ]
var_list_dis = [var for var in train_var if var.name.startswith('discriminator')]
with tf.name_scope('metrics') as scope:loss_g = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.ones_like(fake_logits)*0.9,logits=fake_logits))loss_d_f = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.zeros_like(fake_logits),logits=fake_logits))loss_d_r = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=tf.ones_like(real_logits)*0.9,logits=real_logits))loss_d = loss_d_f + loss_d_rgen_optimizer = tf.train.AdamOptimizer(0.0002,beta1=0.5).minimize(loss_g,var_list=var_list_gen)dis_optimizer = tf.train.AdamOptimizer(0.0002,beta1=0.5).minimize(loss_d, var_list=var_list_dis)
训练神经网络:
with tf.Session() as sess:sess.run(tf.global_variables_initializer())coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)writer = tf.summary.FileWriter('./graph/DCGAN',sess.graph)saver = tf.train.Saver()for epoch in range(epochs):total_g_loss = 0total_d_loss = 0KK = 0for batch in get_batch('./faces/',batch_size):x_real = batchx_real = x_real/127.5 - 1x_fake = np.random.uniform(-1,1,size=[batch_size,100])KK += 1_,tmp_loss_d= sess.run([dis_optimizer,loss_d],feed_dict={gen_input:x_fake,real_input:x_real})total_d_loss += tmp_loss_d_, tmp_loss_g = sess.run([gen_optimizer,loss_g],feed_dict={gen_input:x_fake})_, tmp_loss_g = sess.run([gen_optimizer,loss_g],feed_dict={gen_input:x_fake})total_g_loss += tmp_loss_gif epoch % 10 == 0:x_fake = np.random.uniform(-1,1,[64,100])samples = sess.run(gen_out,feed_dict={gen_input:x_fake})samples = (((samples - samples.min()) * 255) / (samples.max() - samples.min())).astype(np.uint8)vis_img(-1, [samples])print('epoch {},loss_g={}'.format(epoch, total_g_loss/2/KK))print('epoch {},loss_d={}'.format(epoch, total_d_loss/KK))writer.close()saver.save(sess, "./checkpoints/DCGAN")
结果展示:
DCGAN生成动漫头像(附代码)相关推荐
- DCGAN生成动漫头像【学习】
DCGAN生成动漫头像 在假期看了李宏毅老师的GAN的介绍,看到了课后题DCGAN生成动漫头像的作业,实现一下.记录学习过程. 参考的文章: [Keras] 基于GAN自动生成动漫头像 因为使用的是t ...
- vs2019 利用Pytorch和TensorFlow分别实现DCGAN生成动漫头像
这是针对于博客vs2019安装和使用教程(详细)的DCGAN生成动漫头像项目新建示例 目录 一.DCGAN架构及原理 二.项目结构 1.TensorFlow 2.Pytorch 三.数据集下载(两种方 ...
- pytorch:DCGAN生成动漫头像
动漫头像数据集下载地址:动漫头像数据集_百度云连接,DCGAN论文下载地址: https://arxiv.org/abs/1511.06434 数据集里面的图片是这个样子的: 这是DCGAN的主要改进 ...
- 使用TensorFlow2.0搭建DCGAN生成动漫头像(内含生成过程GIF图)
文章目录 生成对抗网络介绍 一.造假 二.训练判别器 三.训练生成器 DCGAN介绍 搭建DCGAN 数据来源 必要工作 读取数据 构建生成器 构建判别器 连接模型 连接图片 生成函数 训练 生成对抗 ...
- 通过PyTorch用DCGAN生成动漫头像
数据集 数据集我们用AnimeFaces数据集,共5万多张动漫头像. 链接:https://pan.baidu.com/s/1cp-A8ZV74YBelkSuKxuM6A 提取码:face 要把所有的 ...
- 基于Tensorflow和DCGAN生成动漫头像实践(二)
本篇内容为动漫头像生成的主要代码部分,第一次写这种代码,从读取数据到生成走了一个完整的流程.创建TFrecord过程可以看上一篇内容. 代码内容: #!/usr/bin/env python2 # - ...
- 基于DCGAN的动漫头像生成
基于DCGAN的动漫头像生成 数据 数据集:动漫图库爬虫获得,经过数据清洗,裁剪得到动漫头像.分辨率为3 * 96 * 96,共5万多张动漫头像的图片,从知乎用户何之源处下载. 生成器:输入为随机噪声 ...
- 有趣的图像生成——使用DCGAN与pytorch生成动漫头像
有趣的图像生成--使用DCGAN与pytorch生成动漫头像 文章目录 有趣的图像生成--使用DCGAN与pytorch生成动漫头像 一.源码下载 二.什么是DCGAN 三.DCGAN的实现 1.** ...
- pytorch实现DCGAN生成动漫人物头像
pytorch实现DCGAN生成动漫人物头像 DCGAN原理 参考这一系列文章 数据集 21551张64*64动漫人物头像 生成效果 训练1个epoch(emm-) 训练10个epoch(起码有颜色了 ...
最新文章
- 「技术综述」一文道尽传统图像降噪方法
- SharePoint 2013 中如何使用Silverlight
- Windows系统MySQL安装配置
- MNIST数据可视化
- java iterator获取索引_2020年Java面试题最新整理(1625)
- mysql导入导出数据
- rabbitmq 查看消费者_RabbitMQ 和 Kafka 的比较
- 工信部证书含金量_关于推荐考取BIM工程师、装配式工程师证书
- Android开发笔记(四十九)异步任务处理AsyncTask
- 最详细 Spring Boot 入门(-)
- Java50道经典习题-程序7 处理字符串
- C++ sort()函数
- 从csrss弹出的ASSERT对话框谈起
- java毕业设计——基于java+JSP+MyEclipse的网上订餐系统设计与实现(毕业论文+程序源码)——网上订餐系统
- 小炫酷的3D旋转立方体相册
- java学习第114天,p699-706(05/12),完成QQ群发
- Windows 编程基础(四)
- 编码 GBK 的不可映射字符 (0x81)
- div html 下边加横线,如何在HTML文本下添加一个虚线下划线
- python turtle绘制圣诞树,就一棵破松树
热门文章
- 2022卡塔尔世界杯。CSDN世界杯勋章来啦
- 看得见风和日丽,看不见风起“云”涌
- aix打开linux共享目录超长,AIX修改用户名和密码长度限制
- 西北农林科技大学计算机系运动会,西北农林科技大学召开2018年学院春季运动会...
- SafeNet通过新的光纤签名设备加强应对电子银行诈骗
- LuceneSolrElasticSearch-面试题
- 混合波束成形|重叠子阵结构下的HBF探讨
- 使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
- 如你所愿!一款高效率的学习神器,打开就是永久会员SVIP权限!
- 科普类:什么是量子霸权?