DCGAN生成动漫头像(附代码)

2023-11-08

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层)

判别器:
第一层:卷积层,卷积核大小:[5,5],权重初始化使用高斯分布,标准差为 stddev=0.02,输出的通道数为64,然后接LeakyRelu,相当于tf.maximum(x*0.2,x),使用斜率为0.2,没有BN层
第二层:卷积层,卷积核大小:[5,5],权重初始化使用高斯分布,标准差为stddev=0.02,输出的通道数为64×2,然后接BN层,然后是LeakyRelu,相当于tf.maximum(x*0.2,x),使用斜率为0.2
第三层:卷积层,卷积核大小:[5,5],权重初始化使用高斯分布,标准差为stddev=0.02,输出的通道数为64×4,然后接BN层,BN层后面是LeakyRelu,相当于tf.maximum(x*0.2,x),使用斜率为0.2
第四层:卷积层,卷积核大小:[5,5],权重初始化使用高斯分布,标准差为 stddev=0.02,输出的通道数为64×8,然后接BN层,BN层后面是LeakyRelu,相当于tf.maximum(x*0.2,x),使用斜率为0.2
然后是将第四层的输出reshape,拉平,
第五层:全连接层,输出神经元个数1,卷积核大小:[5,5],权重初始化使用高斯分布,标准差为stddev=0.02,

然后看我实现的代码:

导入相关的库

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 img

def get_batch(path,batch_size):
    img_list = [os.path.join(path,i) for i in os.listdir(path)]
    
    n_batchs = len(img_list)//batch_size
    img_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 = 64

alpha = 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_r
    gen_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 = 0
        total_d_loss = 0
        KK = 0
        for batch in get_batch('./faces/',batch_size):

            x_real = batch
            x_real = x_real/127.5 - 1
            x_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_g

        if 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")
结果展示:








本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DCGAN生成动漫头像(附代码) 的相关文章

随机推荐

  • 人脸识别对齐,向量搜索

    人脸对齐的概念 1 查找人脸 我们可以使用dlib来查找人脸 也就是所谓的侦测人脸 可以从下面github的地址去拿到models 人脸查找的models dnnFaceDetector dlib cnn face detection mo
  • #cmakedefine真实含义

    cmakedefine 用于configure file 中用于生成头文件的文件中 只有当CMakeLists txt中的同名变量为真时才会在生成的头文件中定义 区别于 define无论何时都会定义
  • 中介者模式-C++实现

    跟我在公司搭的框架好像 MediatorPattern cpp 定义控制台应用程序的入口点 include stdafx h include
  • buck变换器设计matlab_开关电源控制环路设计,非常实用!

    欢迎加入技术交流QQ群 2000人 电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子 新能源干货 行业发展趋势分析 最新产品介绍 众多技术达人与您分享经验 欢迎关注微信公众号 电力电子技术与新能源 M
  • RichErp - vue 使用总结 - data 和 props

    data仅代表自己的内部的状态数据 所以如果一个Component仅仅是自身改变状态 然后把状态反馈给外界的话 理论上说只用data就可以了 显然组件通常不会这样 而是需要一种可进可出的状态 也就是允许外界对组件内部的数据进行修改 同时组件
  • R语言的pairs函数和ggpairs函数在数据可视化中扮演着重要的角色,能够实现散点图矩阵图的可视化

    R语言的pairs函数和ggpairs函数在数据可视化中扮演着重要的角色 能够实现散点图矩阵图的可视化 本文将介绍这两个函数的用法 并通过源代码演示如何使用它们进行数据可视化 1 R语言的pairs函数 pairs函数是R语言中一个强大的数
  • React 进阶: useSyncExternalStore API 外部状态管理

    React 进阶 useSyncExternalStore API 外部状态管理 文章目录 React 进阶 useSyncExternalStore API 外部状态管理 完整代码示例 动机 关于状态的思考 方案一 自行接入外部状态 外部
  • 分类器概念篇

    分类器是数据挖掘中对样本进行分类的方法的统称 包含决策树 逻辑回归 朴素贝叶斯 神经网络等 分类器的构造和实施大体会经过以下几个步骤 选定样本 包含正样本和负样本 将所有样本分成训练样本和测试样本两部分 在训练样本上执行分类器算法 生成分类
  • 以违停检测为示例的利用微软云AIOT技术加速项目落地

    AIoT即融合了AI 人工智能 和IoT 物联网 的技术 图形图像处理是人工智能领域中重要的一个分支 在日常生活中也存在大量基于图形图像的处理的场景 比如交通违章抓拍 基于视觉的司机防疲劳监测 家用摄像机的老人摔倒报警等功能 对于物联网则在
  • Kafka消息分区&producer拦截器&无消息丢失(八)

    上篇文章说了 acks 1代表什么都不管 即使配置了回调也不会起作用 0代表不会等待replic副本里的不会持久化 只要broker leader持久化成功则返回给producer 1代表all 则表示全部持久化成功才返回成功给produc
  • dubbo分布式日志跟踪

    dubbo分布式日志追踪 需要修改两个地方 一个是consumer端的 InvokerInvocationHandler java 红色是修改的地方 public class InvokerInvocationHandler impleme
  • 微服务项目打包时指定jar包复制到同一文件夹下

    转载于原文 在项目最外层pom文件中指定文件存放位置
  • 密码学技术如何选型?再探工程能力边界的安全模型|第5论

    作者 李昊轩 来源 微众银行区块链 牢不可破的密码学算法也怕物理攻击 物理信号泄露为何会威胁到隐私保护的效果 隐私保护方案对部署环境有何讲究 不可信执行环境下如何设计隐私保护方案 这里 我们将继续安全模型的分析 由隐私保护技术方案中理论层面
  • JMeter 测试脚本编写技巧

    是一款开源软件 用于进行负载测试 性能测试及功能测试 测试人员可以使用 JMeter 编写测试脚本 模拟多种不同的负载情况 从而评估系统的性能和稳定性 以下是编写 JMeter 测试脚本的步骤 第 1 步 创建测试计划 在JMeter中 测
  • java 下mp3 转 pcm、wav

    mp3 转 pcm wav 由于MP3直接转为wav 容易出现文件大小为0k 时间缩短等问题 这里是通过先将mp3转成pcm 然后在通过pcm转成wav 下面直接上代码 先引入所需要的jar包
  • CentOS系统安装libssl-dev时No package libssl-dev availab

    libssl dev是ubuntu系统的库 而centos系统对应的是openssl devel centos中运行yum install openssl devel ubuntu系统运行apt get install libssl dev
  • 7.2 IDEA 没有Java EE

    方法二 第一步 正常创建一个新的New Project 创建完成后 选择项目包 gt 点击右键 gt 点击Add Framework Support 然后勾选Web Application 4 之后点击OK确认即可 完美的创建了JavaEE
  • C#断点续传的实现示例

    断点续传是一种可以在文件传输过程中出现断电 网络故障等情况时 能够保证传输内容不会全部丢失 而是可以从已传输的位置继续传输的机制 在文件传输较大 较复杂的情况下 使用断点续传可以提高传输质量 稳定性和效率 在C 中 可以使用HTTP协议的R
  • 蓝桥杯2021年第十二届真题第二场-国际象棋

    题目 题目描述 众所周知 八皇后 问题是求解在国际象棋棋盘上摆放 8 8 8 个皇后 使得两两之间互不攻击的方案数 已经学习了很多算法的小蓝觉得 八皇后 问题太简单了 意犹未尽 作为一个国际象棋迷 他想研究在 N M
  • DCGAN生成动漫头像(附代码)

    DCGAN 顾名思义 就是深度卷积生成对抗神经网络 也就是引入了卷积的 但是它用的是反卷积 就是卷积的反操作 我们看看DCGAN的图 生成器开始输入的是噪声数据 然后经过一个全连接层 再把全连接层的输出reshape 然后经过反卷积 判别器