GAN生成式对抗网络(二)——tensorflow代码示例
代码实现
当初学习时,主要学习的这个博客 https://xyang35.github.io/2017/08/22/GAN-1/ ,写的挺好的。
本文目的,用GAN实现最简单的例子,帮助认识GAN算法。
import numpy as np
from matplotlib import pyplot as plt
batch_size = 4
2. 真实数据集,我们要通过GAN学习这个数据集,然后生成和他分布规则一样的数据集
X = np.random.normal(size=(1000, 2))
A = np.array([[1, 2], [-0.1, 0.5]])
b = np.array([1, 2])
X = np.dot(X, A) + b
plt.scatter(X[:, 0], X[:, 1])
plt.show()
# 等会通过这个函数,不断从中取x值,取值数量为batch_size
def iterate_minibatch(x, batch_size, shuffle=True):
indices = np.arange(x.shape[0])
if shuffle:
np.random.shuffle(indices)
for i in range(0, x.shape[0], batch_size):
yield x[indices[i:i + batch_size], :]

3.封装GAN对象
包含生成器,判别器
class GAN(object):
def __init__(self):
#初始函数,在这里对初始化模型
def netG(self, z):
#生成器模型
def netD(self, x, reuse=False):
#判别器模型
4.生成器netG
随意输入的z,通过z*w+b的矩阵运算(全连接运算),返回结果
def netG(self, z):
"""1-layer fully connected network"""
with tf.variable_scope("generator") as scope:
W = tf.get_variable(name="g_W", shape=[2, 2],
initializer=tf.contrib.layers.xavier_initializer(),
trainable=True)
b = tf.get_variable(name="g_b", shape=[2],
initializer=tf.zeros_initializer(),
trainable=True)
return tf.matmul(z, W) + b
5.判别器nefD
判别器为三层全连接网络。隐层部分使用tanh激活函数。输出部分没有激活函数
def netD(self, x, reuse=False):
"""3-layer fully connected network"""
with tf.variable_scope("discriminator") as scope:
if reuse:
scope.reuse_variables()
W1 = tf.get_variable(name="d_W1", shape=[2, 5],
initializer=tf.contrib.layers.xavier_initializer(),
trainable=True)
b1 = tf.get_variable(name="d_b1", shape=[5],
initializer=tf.zeros_initializer(),
trainable=True)
W2 = tf.get_variable(name="d_W2", shape=[5, 3],
initializer=tf.contrib.layers.xavier_initializer(),
trainable=True)
b2 = tf.get_variable(name="d_b2", shape=[3],
initializer=tf.zeros_initializer(),
trainable=True)
W3 = tf.get_variable(name="d_W3", shape=[3, 1],
initializer=tf.contrib.layers.xavier_initializer(),
trainable=True)
b3 = tf.get_variable(name="d_b3", shape=[1],
initializer=tf.zeros_initializer(),
trainable=True)
layer1 = tf.nn.tanh(tf.matmul(x, W1) + b1)
layer2 = tf.nn.tanh(tf.matmul(layer1, W2) + b2)
return tf.matmul(layer2, W3) + b3
6.初始化__init__函数
def __init__(self):
# input, output
#占位变量,等会用来保存随机产生的数,
self.z = tf.placeholder(tf.float32, shape=[None, 2], name='z')
#占位变量,真实数据的
self.x = tf.placeholder(tf.float32, shape=[None, 2], name='real_x')
# define the network
#生成器,对随机变量进行加工,产生伪造的数据
self.fake_x = self.netG(self.z)
#判别器对真实数据进行判别,返回判别结果
#reuse=false,表示不是共享变量,需要tensorflow开辟变量地址
self.real_logits = self.netD(self.x, reuse=False)
#判别器对伪造数据进行判别,返回判别结果
#reuse=true,表示是共享变量,复用netD中已有的变量
self.fake_logits = self.netD(self.fake_x, reuse=True)
# define losses
#判定器的损失值,将真实数据的判定为真实数据,将伪造数据的判断为伪造数据的得分情况
self.loss_D = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=self.real_logits,
labels=tf.ones_like(self.real_logits))) + \
tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=self.fake_logits,
labels=tf.zeros_like(self.real_logits)))
#生成器的生成分数。伪造的数据,别判断器判定为真实数据的得分情况
self.loss_G = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=self.fake_logits,
labels=tf.ones_like(self.real_logits)))
# collect variables
t_vars = tf.trainable_variables()
#存放判别器中用到的变量
self.d_vars = [var for var in t_vars if 'd_' in var.name]
#存放生成器中用到的变量
self.g_vars = [var for var in t_vars if 'g_' in var.name]
7.开始训练
gan = GAN()
#使用随机梯度下降
d_optim = tf.train.AdamOptimizer(learning_rate=0.05).minimize(gan.loss_D, var_list=gan.d_vars)
g_optim = tf.train.AdamOptimizer(learning_rate=0.01).minimize(gan.loss_G, var_list=gan.g_vars)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
#将数据循环10次
for epoch in range(10):
avg_loss = 0.
count = 0
#从真实数据集当中,随机抓取batch_size数量个值
for x_batch in iterate_minibatch(X, batch_size=batch_size):
# generate noise z
#随机变量,数量为batch_size
z_batch = np.random.normal(size=(4, 2))
# update D network
#将拿到的真实数据值和随机生成的数值,喂养给sess,并bp优化一次
loss_D, _ = sess.run([gan.loss_D, d_optim],
feed_dict={
gan.z: z_batch,
gan.x: x_batch,
})
# update G network
loss_G, _ = sess.run([gan.loss_G, g_optim],
feed_dict={
gan.z: z_batch,
gan.x: np.zeros(z_batch.shape), # dummy input
})
avg_loss += loss_D
count += 1
avg_loss /= count
#每一个epoch都展示一次生成效果
z = np.random.normal(size=(100, 2))
# 随机生成100个数值,0到1000---用来从真实值里面取数据
excerpt = np.random.randint(1000, size=1000)
fake_x, real_logits, fake_logits = sess.run([gan.fake_x, gan.real_logits, gan.fake_logits],
feed_dict={gan.z: z, gan.x: X[excerpt, :]})
accuracy = 0.5 * (np.sum(real_logits > 0.5) / 100. + np.sum(fake_logits < 0.5) / 100.)
print('\ndiscriminator loss at epoch %d: %f' % (epoch, avg_loss))
print('\ndiscriminator accuracy at epoch %d: %f' % (epoch, accuracy))
plt.scatter(X[:, 0], X[:, 1])
plt.scatter(fake_x[:, 0], fake_x[:, 1])
plt.show()
效果



欢迎转载,转载请注明出处。欢迎沟通交流: panfengqqs@qq.com)
GAN生成式对抗网络(二)——tensorflow代码示例的更多相关文章
- GAN生成式对抗网络(四)——SRGAN超高分辨率图片重构
论文pdf 地址:https://arxiv.org/pdf/1609.04802v1.pdf 我的实际效果 清晰度距离我的期待有距离. 颜色上面存在差距. 解决想法 增加一个颜色判别器.将颜色值反馈 ...
- GAN生成式对抗网络(三)——mnist数据生成
通过GAN生成式对抗网络,产生mnist数据 引入包,数据约定等 import numpy as np import matplotlib.pyplot as plt import input_dat ...
- GAN生成式对抗网络(一)——原理
生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型 GAN包括两个核心模块. 1.生成器模块 --generator 2.判别器模块--de ...
- 不要怂,就是GAN (生成式对抗网络) (一)
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- 不要怂,就是GAN (生成式对抗网络) (一): GAN 简介
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- 不要怂,就是GAN (生成式对抗网络) (六):Wasserstein GAN(WGAN) TensorFlow 代码
先来梳理一下我们之前所写的代码,原始的生成对抗网络,所要优化的目标函数为: 此目标函数可以分为两部分来看: ①固定生成器 G,优化判别器 D, 则上式可以写成如下形式: 可以转化为最小化形式: 我们编 ...
- 不要怂,就是GAN (生成式对抗网络) (五):无约束条件的 GAN 代码与网络的 Graph
GAN 这个领域发展太快,日新月异,各种 GAN 层出不穷,前几天看到一篇关于 Wasserstein GAN 的文章,讲的很好,在此把它分享出来一起学习:https://zhuanlan.zhihu ...
- 不要怂,就是GAN (生成式对抗网络) (二)
前面我们了解了 GAN 的原理,下面我们就来用 TensorFlow 搭建 GAN(严格说来是 DCGAN,如无特别说明,本系列文章所说的 GAN 均指 DCGAN),如前面所说,GAN 分为有约束条 ...
- 不要怂,就是GAN (生成式对抗网络) (二):数据读取和操作
前面我们了解了 GAN 的原理,下面我们就来用 TensorFlow 搭建 GAN(严格说来是 DCGAN,如无特别说明,本系列文章所说的 GAN 均指 DCGAN),如前面所说,GAN 分为有约束条 ...
随机推荐
- SAS学习笔记37 宏程序中parmbuff选项
该选项用于指定宏可以接受可变参数列表,而且参数值保存在SYSPBUFF宏变量中.parmbuff的参数价值,其实就是每次执行宏程序时,可以指定不同数量的参数值,这些宏参数被保存在&syspbu ...
- 数据校验-hibernate-validator
数据校验 在web开发时,对于请求参数,一般上都需要进行参数合法性校验的,原先的写法时一个个字段一个个去判断,这种方式太不通用了,所以java的JSR 303: Bean Validation规范就是 ...
- Codeforces 1245 D. Shichikuji and Power Grid
传送门 经典的最小生成树模型 建一个点 $0$ ,向所有其他点 $x$ 连一条边权为 $c[x]$ 的边,其他任意两点之间连边,边权为 $(k_i+k_j)(\left | x_i-x_j\right ...
- Bitbucket入门手册
老大要我去调研一下有什么好用的免费软件版本管理工具,有利于小团队开发的.我第一个想到的就是git,经常在git下东西,听说它的代码仓库好用,于是就注册了一个github的账号,创建仓库的时候才发现只能 ...
- .NetCore如何使用ImageSharp进行图片的生成
ImageSharp是对NetCore平台扩展的一个图像处理方案,以往网上的案例多以生成文字及画出简单图形.验证码等方式进行探讨和实践. 今天我分享一下所在公司项目的实际应用案例,导出微信二维码图片, ...
- 组装技术的新进展 New advances in sequence assembly.
组装技术的新进展 1.测序和组装 很难想象今天距离提出测序和组装已经有40年啦.我们回头来看一下这个问题. “With modern fast sequencing techniques and su ...
- 什么是实体关系图(ERD)? 转
https://www.visual-paradigm.com/cn/guide/data-modeling/what-is-entity-relationship-diagram/#erd-data ...
- Unity使用Resources读取Resources路径下的二进制文件(Binary Data)必须使用 .bytes扩展名
将某二进制文件放在Resources目录下,希望用Resources.Load<TextAsset>的方式读取,发现TextAsset是null 查阅Unity文档得知,使用Resourc ...
- svg-sprite-loader ( svg-icon) 使用
svg-sprite-loader 可以多个svg图标合并. 使用时只需根据合并的symbol的id即可. <svg class="svg-icon" aria-hidde ...
- 2.TCP/IP的三次握手与四次挥手
参考文章:http://357742954.blog.51cto.com/368705/1317226 TCP(Transmission Control Protocol) 传输控制协议,是一个面向连 ...