机器学习中的DCGAN-Tensorflow:用于更稳定的训练

article/2025/8/26 22:21:34

https://www.toutiao.com/a6666031263536644621/

 

自从Ian Goodfellow的论文以来,GAN已应用于许多领域,但其不稳定性一直存在问题。GAN必须解决极小极大(鞍点)问题,因此这个问题是固有的。

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

马鞍点的滑稽表示

许多研究人员试图通过各种方法解决GAN的这些困境。其中DCGAN已经取得了显著的成果。DCGAN提出了稳定的GAN网络结构。如果您根据本文的指导设计模型,可以看出模型训练是稳定的。

稳定的深度卷积GANs的体系结构指南

•用 strided convolutions(判别器)和 fractional-strided convolutions (生成器)替换任何池化层 。

• 在生成器和判别器中使用 batchnorm

• 删除完全连接的隐藏层以获得更深层次的架构。

• 除了使用Tanh之外, 对生成器中的所有层使用ReLU激活 。

• 在判别器中对所有层使用LeakyReLU激活 

生成器

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

DCGAN生成器的结构

首先,生成器项目和重塑噪声分布(100-dim阵列)到4x4x1024特征映射。我们使用matmulreshape函数来实现它。然后,我们使用一系列四个fractionally-strided函数卷积(conv2d_transpose)来逐步创建64x64图像。如上所述,batchnorm放置在每层的末尾,并且除输出之外,relu作为激活函数。我们使用tanh作为输出,所以输出的像素范围是[-1,1]。

def generator(self, input, reuse = False):with tf.variable_scope("generator") as scope:if reuse:scope.reuse_variables()G_FW1 = tf.get_variable('G_FW1', [self.n_noise, self.n_hidden], initializer = tf.random_normal_initializer(stddev=0.01))G_Fb1 = tf.get_variable('G_Fb1', [self.n_hidden], initializer = tf.constant_initializer(0))G_W1 = tf.get_variable('G_W1', [5,5,self.n_W2, self.n_W1], initializer = tf.truncated_normal_initializer(stddev=0.02))G_W2 = tf.get_variable('G_W2', [5,5,self.n_W3, self.n_W2], initializer = tf.truncated_normal_initializer(stddev=0.02))G_W3 = tf.get_variable('G_W3', [5,5,self.n_W4, self.n_W3], initializer = tf.truncated_normal_initializer(stddev=0.02))G_W4 = tf.get_variable('G_W4', [5,5,self.image_channels, self.n_W4], initializer = tf.truncated_normal_initializer(stddev=0.02))hidden = tf.nn.relu(tf.matmul(input, G_FW1) + G_Fb1)hidden = tf.reshape(hidden, [self.batch_size, 4,4,self.n_W1]) dconv1 = tf.nn.conv2d_transpose(hidden, G_W1, [self.batch_size, 8, 8, self.n_W2], [1, 2, 2, 1])dconv1 = tf.nn.relu(tf.contrib.layers.batch_norm(dconv1,decay=0.9, epsilon=1e-5))dconv2 = tf.nn.conv2d_transpose(dconv1, G_W2, [self.batch_size, 16, 16, self.n_W3], [1, 2, 2, 1])dconv2 = tf.nn.relu(tf.contrib.layers.batch_norm(dconv2,decay=0.9, epsilon=1e-5))dconv3 = tf.nn.conv2d_transpose(dconv2, G_W3, [self.batch_size, 32, 32, self.n_W4], [1, 2, 2, 1])dconv3 = tf.nn.relu(tf.contrib.layers.batch_norm(dconv3,decay=0.9, epsilon=1e-5))dconv4 = tf.nn.conv2d_transpose(dconv3, G_W4, [self.batch_size, 64, 64, self.image_channels], [1, 2, 2, 1])#dconv4 = tf.nn.relu(tf.layers.batch_normalization(dconv3, training = 'True'))output = tf.nn.tanh(dconv4)return output

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

 

判别器

本文中使用的判别器与生成器具有对称结构。与生成器相反,它通过减小图像大小来训练特征映像。所以我们使用了步幅大小为2的conv2d。与生成器相同,batchnorm放置在每层的末尾。但是leaky relu被用作激活函数。

 def discriminator(self, input, reuse = False):with tf.variable_scope("discriminator") as scope:if reuse:scope.reuse_variables()D_W1 = tf.get_variable('D_W1', [5,5,self.image_channels, self.n_W5], initializer = tf.truncated_normal_initializer(stddev=0.02))D_W2 = tf.get_variable('D_W2', [5,5,self.n_W5, self.n_W4], initializer = tf.truncated_normal_initializer(stddev=0.02))D_W3 = tf.get_variable('D_W3', [5,5,self.n_W4, self.n_W3], initializer = tf.truncated_normal_initializer(stddev=0.02))D_W4 = tf.get_variable('D_W4', [5,5,self.n_W3, self.n_W2], initializer = tf.truncated_normal_initializer(stddev=0.02)) D_FW1 = tf.get_variable('D_FW1', [4*4*self.n_W2, 1], initializer = tf.random_normal_initializer(stddev=0.01))D_Fb1 = tf.get_variable('D_Fb1', [1], initializer = tf.constant_initializer(0))conv1 = tf.nn.conv2d(input, D_W1, strides = [1, 2, 2, 1], padding='SAME')conv1 = tf.nn.leaky_relu(conv1, alpha = 0.2)conv2 = tf.nn.conv2d(conv1, D_W2, strides = [1, 2, 2, 1], padding='SAME')conv2 = tf.nn.leaky_relu(tf.contrib.layers.batch_norm(conv2, decay=0.9, epsilon=1e-5), alpha = 0.2)conv3 = tf.nn.conv2d(conv2, D_W3, strides = [1, 2, 2, 1], padding='SAME')conv3 = tf.nn.leaky_relu(tf.contrib.layers.batch_norm(conv3, decay=0.9, epsilon=1e-5), alpha = 0.2)conv4 = tf.nn.conv2d(conv3, D_W4, strides = [1, 2, 2, 1], padding='SAME')conv4 = tf.nn.leaky_relu(tf.contrib.layers.batch_norm(conv4, decay=0.9, epsilon=1e-5), alpha = 0.2)hidden = tf.reshape(conv4, [self.batch_size, 4*4*self.n_W2]) output = tf.nn.sigmoid(tf.matmul(hidden, D_FW1) + D_Fb1)return output

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

 

损失函数和优化器

损失函数和优化器与基本GAN相同。然而,根据该DCGAN论文的(对抗性训练的细节)中,我们设置优化器的学习率0.0002bata1为0.5

def loss(self, X, Z):g_out = self.generator(Z)d_fake = self.discriminator(g_out, reuse = False)d_real = self.discriminator(X, reuse = True)d_loss = tf.reduce_mean(tf.log(d_real) + tf.log(1 - d_fake))g_loss = tf.reduce_mean(tf.log(d_fake))return d_loss, g_lossdef optimizer(self, d_loss, g_loss, learning_rate):d_var_list = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='discriminator')g_var_list = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope='generator')#print('G_var_list:', len(G_var_list))#print('D_var_list:', len(D_var_list))d_opt = tf.train.AdamOptimizer(learning_rate, beta1 = 0.5).minimize(-d_loss,var_list=d_var_list)g_opt = tf.train.AdamOptimizer(learning_rate, beta1 = 0.5).minimize(-g_loss,var_list=g_var_list)return d_opt, g_opt

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

 

结果

数据集是从kaggle下载的。数据集下载地址(https://www.kaggle.com/scolianni/mnistasjpg)

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

DCGAN

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

BasicGAN

使用mnist数据集训练了DCGAN和basicGAN模型。DCGAN生成比basicGAN更干净的图像。当然,上述结果似乎是合理的,因为DCGAN具有比BasicGAN更复杂的结构并且具有更多参数。但是DCGAN中引入的方法甚至可以稳定地学习复杂的模型。这是DCGAN的贡献。

此外,我还使用Celeb_A数据集训练了两个模型,其中有大约200k肖像照片。数据集下载地址(https://www.kaggle.com/jessicali9530/celeba-dataset)

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

DCGAN

机器学习中的DCGAN-Tensorflow:用于更稳定的训练

BasicGAN

我们为DCGAN和BasicGAN模型训练了9个周期。DCGAN不仅可以产生清晰的图像,还可以表现出各种特征,如眼镜,妆容和胡须。但它仍然看起来不自然。

这就是利用深度学习来实现人脸的创造。其他深度学习模型(如变分自编码器自回归模型)也是生成模型的好示例。


http://chatgpt.dhexx.cn/article/WlrUUqLj.shtml

相关文章

DCGAN 源码解析

为什么写Blog现在还没找到理由。不过用心看下去你会觉得更有意义。 我们以生成图片为例子: G就是一个生成图片的网络,它接受一个随机的噪声z,然后通过这个噪声生成图片,生成的数据记做G(z)。D是一个判别网络,判别一张图片是不是…

pytorch搭建DCGAN

我们知道gan的过程是对生成分布拟合真实分布的一个过程,理想目标是让判别器无法识别输入数据到底是来源于生成器生成的数据还是真实的数据。 当然这是一个博弈的过程并且相互促进的过程,其真实的过程在于首先判别器会先拟合真实数据的分布,然…

tensorflow实现DCGAN

1、DCGAN的简单总结 【Paper】 : http://arxiv.org/abs/1511.06434 【github】 : https://github.com/Newmu/dcgan_code theano https://github.com/carpedm20/DCGAN-tensorflow tensorflow https://github.com/jacobgil/keras-dcgan keras https://github.c…

DCGAN TUTORIAL

Introduction 本教程将通过一个示例对DCGAN进行介绍。在向其展示许多真实名人的照片之后,我们将训练一个生成对抗网络(GAN)来产生新名人。此处的大多数代码来自pytorch / examples中的dcgan实现 ,并且本文档将对该实现进行详尽的…

DCGAN原文讲解

DCGAN的全称是Deep Convolution Generative Adversarial Networks(深度卷积生成对抗网络)。是2014年Ian J.Goodfellow 的那篇开创性的GAN论文之后一个新的提出将GAN和卷积网络结合起来,以解决GAN训练不稳定的问题的一篇paper. 关于基本的GAN的原理,可以…

DCGAN

转自:https://blog.csdn.net/liuxiao214/article/details/74502975 首先是各种参考博客、链接等,表示感谢。 1、参考博客1:地址 ——以下,开始正文。 2017/12/12 更新 解决训练不收敛的问题。 更新在最后面部分。 1、DCGAN的…

深度学习之DCGAN

这一此的博客我给大家介绍一下DCGAN的原理以及DCGAN的实战代码,今天我用最简单的语言给大家介绍DCGAN。 相信大家现在对深度学习有了一定的了解,对GAN也有了认识,如果不知道什么是GAN的可以去看我以前的博客,接下来我给大家介绍一下DCGAN的原理。 DCGAN DCGAN的全称是Deep Conv…

对抗神经网络(二)——DCGAN

一、DCGAN介绍 DCGAN即使用卷积网络的对抗网络,其原理和GAN一样,只是把CNN卷积技术用于GAN模式的网络里,G(生成器)网在生成数据时,使用反卷积的重构技术来重构原始图片。D(判别器)网…

对抗生成网络GAN系列——DCGAN简介及人脸图像生成案例

🍊作者简介:秃头小苏,致力于用最通俗的语言描述问题 🍊往期回顾:对抗生成网络GAN系列——GAN原理及手写数字生成小案例 🍊近期目标:写好专栏的每一篇文章 🍊支持小苏:点赞…

DCGAN理论讲解及代码实现

目录 DCGAN理论讲解 DCGAN的改进: DCGAN的设计技巧 DCGAN纯代码实现 导入库 导入数据和归一化 定义生成器 定义鉴别器 初始化和 模型训练 运行结果 DCGAN理论讲解 DCGAN也叫深度卷积生成对抗网络,DCGAN就是将CNN与GAN结合在一起,生…

torch学习 (三十七):DCGAN详解

文章目录 引入1 生成器2 鉴别器3 模型训练:生成器与鉴别器的交互4 参数设置5 数据载入6 完整代码7 部分输出图像示意7.1 真实图像7.2 训练200个批次7.2 训练400个批次7.2 训练600个批次 引入 论文详解:Unsupervised representation learning with deep c…

GANs系列:DCGAN原理简介与基础GAN的区别对比

本文长期不定时更新最新知识,防止迷路记得收藏哦! 还未了解基础GAN的,可以先看下面两篇文章: GNA笔记--GAN生成式对抗网络原理以及数学表达式解剖 入门GAN实战---生成MNIST手写数据集代码实现pytorch 背景介绍 2016年&#…

Pix2Pix和CycleGAN

GAN的局限性 即便如此,传统的GAN也不是万能的,它有下面两个不足: 1. 没有**用户控制(user control)**能力 在传统的GAN里,输入一个随机噪声,就会输出一幅随机图像。 但用户是有想法滴&#xff…

PyTorch 实现Image to Image (pix2pix)

目录 一、前言 二、数据集 三、网络结构 四、代码 (一)net (二)dataset (三)train (四)test 五、结果 (一)128*128 (二)256*256 …

pix2pix、pix2pixHD 通过损失日志进行训练可视化

目录 背景 代码 结果 总结 背景 pix2pix(HD)代码在训练时会自动保存一个损失变化的txt文件,通过该文件能够对训练过程进行一个简单的可视化,代码如下。 训练的损失文件如图,对其进行可视化。 代码 #coding:utf-8 ## #author: QQ&#x…

Pix2Pix代码解析

参考链接:https://github.com/yenchenlin/pix2pix-tensorflow https://blog.csdn.net/stdcoutzyx/article/details/78820728 utils.py from __future__ import division import math import json import random import pprint import scipy.misc import numpy as…

pix2pix 与 pix2pixHD的大致分析

目录 pix2pix与pix2pixHD的生成器 判别器 PatchGAN(马尔科夫判别器) 1、pix2pix 简单粗暴的办法 如何解决模糊呢? 其他tricks 2、pix2pixHD 高分辨率图像生成 模型结构 Loss设计 使用Instance-map的图像进行训练 语义编辑 总结 …

Tensorflow2.0之Pix2pix

文章目录 Pix2pix介绍Pix2pix应用Pix2pix生成器及判别器网络结构代码实现1、导入需要的库2、下载数据包3、加载并展示数据包中的图片4、处理图片4.1 将图像调整为更大的高度和宽度4.2 随机裁剪到目标尺寸4.3 随机将图像做水平镜像处理4.4 图像归一化4.5 处理训练集图片4.6 处理…

pix2pix算法笔记

论文:Image-to-Image Translation with Conditional Adversarial Networks 论文链接:https://arxiv.org/abs/1611.07004 代码链接:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 这篇论文发表在CVPR2017,简称pix2pix,是将GAN应用于有监督的图像到图像翻译的经…

Pix2Pix原理解析以及代码流程

文章目录 1、网络搭建2、反向传播过程3、PatchGAN4.与CGAN的不同之处 1、网络搭建 class UnetGenerator(nn.Module):"""Create a Unet-based generator"""def __init__(self, input_nc, output_nc, num_downs, ngf64, norm_layernn.BatchNorm2d…