对抗神经网络学习和实现(GAN)

一,GAN的原理介绍

\quad GAN的基本原理其实非常简单,这里以生成图片为例进行说明。假设我们有两个网络,G(Generator)和D(Discriminator)。正如它的名字所暗示的那样,它们的功能分别是:
∙ \bullet G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。
∙ \bullet D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。
\quad 在训练过程中**,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来**。这样,G和D构成了一个动态的“博弈过程”。
\quad 最后博弈的结果是什么?在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。
\quad 这样我们的目的就达成了:我们得到了一个生成式的模型G,它可以用来生成图片。
\quad 以上只是大致说了一下GAN的核心原理,如何用数学语言描述呢?这里直接摘录论文里的公式:
在这里插入图片描述

简单分析一下这个公式:
∙ \bullet 整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
∙ \bullet D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片的是否真实的概率
∙ \bullet G的目的:上面提到过,D(G(z))是D网络判断G生成的图片是否真实的概率,G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))尽可能得大,这时V(D, G)会变小。因此我们看到式子的最前面的记号是min_G
∙ \bullet D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大(max_D)

下面这幅图片很好地描述了这个过程:
在这里插入图片描述
那么如何用随机梯度下降法训练D和G?论文中也给出了算法:
在这里插入图片描述
这里红框圈出的部分是我们要额外注意的。第一步我们训练D,D是希望V(G,`D)越大越好,所以是加上梯度(ascending)。第二步训练G时,V(G, D)越小越好,所以是减去梯度(descending)。整个训练过程交替进行。
\quad 这个直接看代码就有很好的体现了。

二,DCGAN的原理介绍

\quad 我们知道深度学习中对图像处理应用最好的模型是CNN,那么如何把CNN与GAN结合?DCGAN是这方面最好的尝试之一,文章最后会附上论文地址:
\quad DCGAN的原理和GAN是一样的,这里就不在赘述。它只是把上述的G和D换成了两个卷积神经网络(CNN)。但不是直接换就可以了,DCGAN对卷积神经网络的结构做了一些改变,以提高样本的质量和收敛的速度,这些改变有:
∙ \bullet 取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling。
∙ \bullet 在D和G中均使用batch normalization
∙ \bullet 去掉FC层,使网络变为全卷积网络
∙ \bullet G网络中使用ReLU作为激活函数,最后一层使用tanh
∙ \bullet D网络中使用LeakyReLU作为激活函数
\quad DCGAN中的G网络示意:
在这里插入图片描述
\quad 直接利用1个全连接层实现的GAN如下,补充:一开始的时候生成出来的图像中含有负数以至于无法显示,解决方案是在generate的输出激活函数中不要使用tanh,改为使用sigmoid即可。

\quad 训练的过程如下:
这里写图片描述
训练完成之后生成了20张随机产生的图片,是不是足够以假乱真啦。

#coding=utf-8
import tensorflow as tf
import tflearn
import tflearn.datasets.mnist as mnist
import matplotlib.pyplot as plt
import numpy as np
X, Y, X_test, Y_test = mnist.load_data()
img_dim = 784
z_dim = 200
total_sample = len(X)#构建生成器和判别器
def generate(x, reuse=tf.AUTO_REUSE):with tf.variable_scope('Generate', reuse=reuse):x = tflearn.fully_connected(x,256,activation='relu')x = tflearn.fully_connected(x,img_dim,activation='sigmoid')return x
def discriminator(x, reuse=tf.AUTO_REUSE):with tf.variable_scope('Discriminator', reuse=reuse):x = tflearn.fully_connected(x, 256, activation='relu')x = tflearn.fully_connected(x, 1, activation='sigmoid')return x#构建网络gen_input = tflearn.input_data(shape=[None,z_dim], name='input_noise')
disc_input = tflearn.input_data(shape=[None,784], name='disc_input')#生成器,判别器
gen_sample = generate(gen_input)
disc_real = discriminator(disc_input) #判别网络
disc_fake = discriminator(gen_sample) #欺骗网络Ddisc_loss = -tf.reduce_mean(tf.log(disc_real)+tf.log(1. -disc_fake))
gen_loss = -tf.reduce_mean(tf.log(disc_fake))gen_vars = tflearn.get_layer_variables_by_scope('Generate')
gen_model = tflearn.regression(gen_sample, placeholder=None, optimizer='adam', loss=gen_loss, trainable_vars=gen_vars,batch_size=64,name='target_gen',op_name='GEN')disc_vars = tflearn.get_layer_variables_by_scope('Discriminator')
disc_model = tflearn.regression(disc_real,placeholder=None,optimizer='adam',loss=disc_loss,trainable_vars=disc_vars,batch_size=64,name='target_disc',op_name='DISC')gan = tflearn.DNN(gen_model)#训练并绘制图像
z = np.random.uniform(-1.,1.,[total_sample,z_dim])
gan.fit(X_inputs={gen_input: z,disc_input: X},Y_targets=None,n_epoch=200)f, a = plt.subplots(2,10,figsize=(10,4))
for i in range(10):for j in range(2):#Noise inputz = np.random.uniform(-1.,1.,size=[1,z_dim])#Generate image from noise. Extend to 3 channels for matplot figure.temp = [[temp,temp,temp] for temp in list(gan.predict([z])[0])]print(temp)a[j][i].imshow(np.reshape(temp,(28,28,3)))
f.show()
plt.show()

代码2:https://github.com/wiseodd/generative-models

GAN的TF实现

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import osdef xavier_init(size):in_dim = size[0]xavier_stddev = 1. / tf.sqrt(in_dim / 2.)return tf.random_normal(shape=size, stddev=xavier_stddev)X = tf.placeholder(tf.float32, shape=[None, 784])D_W1 = tf.Variable(xavier_init([784, 128]))
D_b1 = tf.Variable(tf.zeros(shape=[128]))D_W2 = tf.Variable(xavier_init([128, 1]))
D_b2 = tf.Variable(tf.zeros(shape=[1]))theta_D = [D_W1, D_W2, D_b1, D_b2]Z = tf.placeholder(tf.float32, shape=[None, 100])G_W1 = tf.Variable(xavier_init([100, 128]))
G_b1 = tf.Variable(tf.zeros(shape=[128]))G_W2 = tf.Variable(xavier_init([128, 784]))
G_b2 = tf.Variable(tf.zeros(shape=[784]))theta_G = [G_W1, G_W2, G_b1, G_b2]def sample_Z(m, n):return np.random.uniform(-1., 1., size=[m, n])def generator(z):G_h1 = tf.nn.relu(tf.matmul(z, G_W1) + G_b1)G_log_prob = tf.matmul(G_h1, G_W2) + G_b2G_prob = tf.nn.sigmoid(G_log_prob)return G_probdef discriminator(x):D_h1 = tf.nn.relu(tf.matmul(x, D_W1) + D_b1)D_logit = tf.matmul(D_h1, D_W2) + D_b2D_prob = tf.nn.sigmoid(D_logit)return D_prob, D_logitdef plot(samples):fig = plt.figure(figsize=(4, 4))gs = gridspec.GridSpec(4, 4)gs.update(wspace=0.05, hspace=0.05)for i, sample in enumerate(samples):ax = plt.subplot(gs[i])plt.axis('off')ax.set_xticklabels([])ax.set_yticklabels([])ax.set_aspect('equal')plt.imshow(sample.reshape(28, 28), cmap='Greys_r')return figG_sample = generator(Z)
D_real, D_logit_real = discriminator(X)
D_fake, D_logit_fake = discriminator(G_sample)# D_loss = -tf.reduce_mean(tf.log(D_real) + tf.log(1. - D_fake))
# G_loss = -tf.reduce_mean(tf.log(D_fake))# Alternative losses:
# -------------------
D_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_real, labels=tf.ones_like(D_logit_real)))
D_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.zeros_like(D_logit_fake)))
D_loss = D_loss_real + D_loss_fake
G_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=D_logit_fake, labels=tf.ones_like(D_logit_fake)))D_solver = tf.train.AdamOptimizer().minimize(D_loss, var_list=theta_D)
G_solver = tf.train.AdamOptimizer().minimize(G_loss, var_list=theta_G)mb_size = 128
Z_dim = 100mnist = input_data.read_data_sets('../../MNIST_data', one_hot=True)sess = tf.Session()
sess.run(tf.global_variables_initializer())if not os.path.exists('out/'):os.makedirs('out/')i = 0for it in range(1000000):if it % 1000 == 0:samples = sess.run(G_sample, feed_dict={Z: sample_Z(16, Z_dim)})fig = plot(samples)plt.savefig('out/{}.png'.format(str(i).zfill(3)), bbox_inches='tight')i += 1plt.close(fig)X_mb, _ = mnist.train.next_batch(mb_size)_, D_loss_curr = sess.run([D_solver, D_loss], feed_dict={X: X_mb, Z: sample_Z(mb_size, Z_dim)})_, G_loss_curr = sess.run([G_solver, G_loss], feed_dict={Z: sample_Z(mb_size, Z_dim)})if it % 1000 == 0:print('Iter: {}'.format(it))print('D loss: {:.4}'. format(D_loss_curr))print('G_loss: {:.4}'.format(G_loss_curr))
print()

DCGAN待续:

参考链接:
https://zhuanlan.zhihu.com/p/24767059
http://blog.csdn.net/twt520ly/article/details/79420597
https://zhuanlan.zhihu.com/p/27295635
https://wiseodd.github.io/techblog/2016/09/17/gan-tensorflow/

维护了一个微信公众号,分享论文,算法,比赛,生活,欢迎加入。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/60835.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成对抗网络(GAN)

1 GAN基本概念 1.1 如何通俗理解GAN? ​ 生成对抗网络(GAN, Generative adversarial network)自从2014年被Ian Goodfellow提出以来,掀起来了一股研究热潮。GAN由生成器和判别器组成,生成器负责生成样本,判别器负责判断生成器生成…

基于图神经网络的对抗攻击 Nettack: Adversarial Attacks on Neural Networks for Graph Data

研究意义 随着GNN的应用越来越广,在安全非常重要的应用中应用GNN,存在漏洞可能是非常严重的。 比如说金融系统和风险管理,在信用评分系统中,欺诈者可以伪造与几个高信用客户的联系,以逃避欺诈检测模型;或者…

生成对抗网络(Generative Adversial Network,GAN)原理简介

生成对抗网络(GAN)是深度学习中一类比较大的家族,主要功能是实现图像、音乐或文本等生成(或者说是创作),生成对抗网络的主要思想是:通过生成器(generator)与判别器(discriminator)不断对抗进行训练。最终使得判别器难以分辨生成器生成的数据(…

快讯|莫言用 ChatGPT 写《颁奖辞》;特斯拉人形机器人集体出街!已与FSD算法打通

一分钟速览新闻点 言用 ChatGPT 写《颁奖辞》孙其君研究员团队 Adv. Funct. Mater.:多功能离子凝胶纤维膜用于能量离电皮肤微软CEO反驳马斯克:我们没有控制OpenAI特斯拉人形机器人集体出街!已与FSD算法打通微软CEO称小型公司仍可在人工智能领…

从供应链到价值链:人形机器人产业链深入研究

原创 | 文 BFT机器人 01 人形机器人产业进展:AI赋能,人形机器人迭代有望加速 目前人形机器人产业所处从“0”到“1”的萌芽期,从现在到未来的时间里,人形机器人以其仿人外形、身体构成及其智能大脑,能极大解放生产力、…

人形机器人火出圈!OpenAI领投挪威人形机器人公司“1X”

文|牛逼的AI 编|猫猫咪子 源|AI源起 目前已经实现了对接GPT4技术的机器人Ameca,它拥有逼真的外观和丰富的表情。 随着人形机器人技术的飞速发展,未来可能不再适用阿西莫夫所提出的“机器人三定律”,因为超级…

chatgpt赋能python:Python登录界面制作指南

Python登录界面制作指南 介绍 登录界面是许多应用程序的关键组成部分之一。Python作为一种优秀的编程语言,拥有着强大的界面开发框架,能够帮助开发人员更轻松地创作出完美的登录界面。 在本文中,我们将向您介绍使用Python如何制作一个简单…

The Journal of Neuroscience: 珠心算训练有助于提高儿童的视觉空间工作记忆

《本文同步发布于“脑之说”微信公众号,欢迎搜索关注~~》 珠心算是指个体在熟练进行珠算操作后,可摆脱实际算盘,借助大脑中虚拟算盘进行数字计算的方式(图1)。早期行为学研究表明,珠心算个体的数字计算能力…

php珠心算源码,深度解析珠心算的“开智”功能

编者按:本文来自李绵军校长在廊坊智慧特训营演讲。李绵军校长通过十几年来对珠心算的钻研练习,详细解读了珠心算的开智功能,以及“一门深入”的作用。 珠心算的开智价值是在哪里?大家都说开发智力,我在这讲开发智力不是…

php珠心算源码,NOIP201401珠心算测验

珠心算测验 问题描述】 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方…

雨课堂提交作业步骤 10步帮你弄好

1 2 3 4 5 6 7 中间计数记错了… 8 9 10 弹出对话框,点击确认即可 提交成功的截图:

2022李宏毅作业hw4 - 挫败感十足的一次作业。

系列文章: 2022李宏毅作业hw1—新冠阳性人员数量预测。_亮子李的博客-CSDN博客_李宏毅hw1 hw-2 李宏毅2022年作业2 phoneme识别 单strong-hmm详细解释。_亮子李的博客-CSDN博客_李宏毅hw2 2021李宏毅作业hw3 --食物分类。对比出来的80准确率。_亮子李的博客-CSDN博客…

php老师的一个作业展示

1.在ScanCode.php中 在judgeTrayCodeEnableIntoWarehouse方法中: 2在CommitTrayCodes.php中 访问时,直接访问CommitTrayCodes.php,这个CommitTrayCodes.php是要建在controller下,建议导一下,老师的数据库,以防止命名…

HCIA网络课程第七周作业

(1)请用自己的语言描述基本ACL和高级ACL的区别 (2)AAA支持的认证、授权和计费方式分别有哪几种? AAA支持的认证方式有不认证 本地认证 远端认证AAA支持的授权方式为不授权 本地授权 远端授权AAA支持计费方式为不计费…

如何获取抖音和快手直播间的直播流地址

如下是通过python代码脚本获取的方法: import requests import re def get_real_url(rid): try: if ‘v.douyin.com‘ in rid: room_id re.findall(r‘(\d{19})‘, requests.get(urlrid).url)[0] else: room_id rid room_url ‘https://webcast-hl.amemv.com/…

新手如何做抖音直播带货?新号如何快速获取直播推荐流量?

如果要做抖音直播带货的话,首先需要开通抖音直播带货权限。也就是我们经常说的解锁抖音直播购物车功能。解锁直播购物车后,我们就能在直播中售卖商品。 而在此之前,你要先开通商品橱窗并解锁视频购物车。开通商品橱窗,在完成新手…

抖音直播如何获取推流地址?不到1000粉也能直播啦。还能加热。2020年12月29日

抖音直播自从出了自己的pc客户端(直播伴侣)后,直播推流地址已不再对外暴漏。 正常情况下,粉丝大于1000,才可使用抖音官方的推流工具(直播伴侣)。但对于粉丝数不够1000,也想用第三方推流工具(如…

短视频、直播平台——电商直播源码第三方SDK接入教程

现在网络视频直播行业非常火爆,所以很多公司也希望开发直播平台,一般直播平台需要用户给主播送礼物来实现盈利,所以刷礼物的功能是必备的,另外为了增加视频的美感与炫酷等特效功能,也需要用到美颜与视频滤镜等功能&…

2022-5月如何使用疯狂URL获取抖音推流码地址(抖音无人直播教程)

什么是推流地址?平时我们如果是下载直播,叫拉流。但如果是你自己要直播,属于上传直播流数据,叫推流,即:把直播流数据推送到视频服务器,然后别人才能看到直播画面 推流地址有什么用?…

抖音短视频开通PC电脑上直播技术实现

忽如一夜春风来,直播带货满地开。互联网的江湖,是游戏的,是广告的,是直播的,是短视频的,但是归根结底是卖货的——也就是电商啦。 2020年可以看出短视频带货是未来大方向的趋势,最新抖音直播带货…