从零教你写一个完整的GAN(如何写个)
ztj100 2024-10-28 21:15 15 浏览 0 评论
导言
啦啦啦,现今 GAN 算法可以算作 ML 领域下比较热门的一个方向。事实上,GAN 已经作为一种思想来渗透在 ML 的其余领域,从而做出了很多很 Amazing 的东西。比如结合卷积神经网络,可以用于生成图片。或者结合 NLP,可以生成特定风格的短句子。(比如川普风格的 twitter......)
可惜的是,网络上很多老司机开 GAN 的车最后都翻了,大多只是翻译了一篇论文,一旦涉及算法实现部分就直接放开源的实现地址,而那些开源的东东,缺少了必要的引导,实在对于新手来说很是懵逼。所以兔子哥哥带着开好车,开稳车的心态,特定来带一下各位想入门 GAN 的其他小兔兔们来飞一会。
GAN 的介绍与训练
先来阐述一下 GAN 的基本做法,这里不摆公式,因为你听完后,该怎么搭建和怎么训练你心里应该有数了。
首先,GAN 全称为 GEnerative Adversarial Nets(生成对抗网络), 其构成分为两部份:
Generator(生成器),下文简称 G
DIScriminator(辨别器), 下文简称 D。
在本文,为了方便小兔兔理解,使用一个较为简单,也是 GAN 论文提及到的例子,训练 G 生成符合指定均值和标准差的数据,在这里,我们指定MEAN=4,STD=1.5的高斯分布(正态分布)。
这货的样子大概长这样
下面是数据生成的代码:
def sample_data(size, length=100):
""" 随机mean=4 std=1.5的数据 :param size: :param length: :return: """
data =
for _ in range(size):
data.aPPend(sorted(np.random.normal(4, 1.5, length)))
return np.array(data)
在生成高斯分布的数据后,我们还对数据进行了排序,这时因为排序后的训练会相对平滑。具体原因看这个 [Generative Adversarial Nets in TensorFlow (Part I)]
这一段是生成噪音的代码,既然是噪音,那么我们只需要随机产生 0~1 的数据就好。
def random_data(size, length=100):
""" 随机生成数据 :param size: :param length: :return: """
x = np.random.random(length)
data.append(x)
return np.array(data)
随机分布的数据长这样
接下来就是开撸 GAN 了。
首先的一点就是,我们需要确定 G, 和 D 的具体结构,这里因为本文的例子太过于入门级,并不需要使用到复杂的神经网络结构,比如卷积层和递归层,这里 G 和 D 只需全连接的神经网络就好。全连接层的神经网络本质就是矩阵的花式相乘。为神马说是花式相乘呢,因为大多数时候,我们在矩阵相乘的结果后面会添加不同的激活函数。
G 和 D 分别为三层的全链接的神经网络,其中 G 的激活函数分别为,relu,sigmoid,liner,这里前两层只是因为考虑到数据的非线性转换,并没有什么特别选择这两个激活函数的原因。其次 D 的三层分别为 relu,sigmoid,sigmoid。
接下来就引出 GAN 的训练问题。GAN 的思想源于博弈论,直白一点就是套路与反套路。
先从 D 开始分析,D 作为辨别器,它的职责就是区分于真实的高斯分布和 G 生成的” 假” 高斯分布。所以很显然,针对 D 来说,其需要解决的就是传统的二分类问题。
在二分类问题中,我们习惯用交叉熵来衡量分类效果。
从公式中不难看出,在全部分类正确时,交叉熵会接近于 0,因此,我们的目标就是通过拟合 D 的参数来最小化交叉熵的值。
D 既然是传统的二分类问题,那么 D 的训练过程也很容易得出了
即先把真实数据标识为‘1’(真实分布),由生成器生成的数据标识为’0‘(生成分布),反复迭代训练 D ------------ (1)
说 G 的训练之前先来打个比方,假如一男一女在一起了,现在两人性格出现矛盾了,女生并不愿意改变,但两个人都想继续在一起,这时,唯一的方法就是男生改变了。先忽略现实生活的问题,但从举例的角度说,显然久而久之男生就会变得更加 fit 这个女生。
G 的训练也是如此:
先将 G 拼接在 D 的上方,即 G 的输出作为 D 的输入(男生女生在一起),而同时固定 D 的参数(女生不愿意改变),并将进入 G 的噪音样本标签全部改成'1'(目标是两个人继续在一起,没有其他选择),为了最小化损失函数,此时就只能改变 G 的每一层权重,反复迭代后 G 的生成能力因此得以改进。(男生更适合女生) ------------ (2)
反复迭代(1)(2),最终 G 就会得到较好的生成能力。
补充一点,在训练 D 的时候,我曾把数据直接放进去,这样的后果是最后生成的数据,能学习到高斯分布的轮廓,但标准差和均值则和真实样本相差很大。因此,这里我建议直接使用平均值和标准差作为 D 的输入。
这使得 D 在训练前需要对数据进行预处理。
def preprocess_data(x):
""" 计算每一组数据平均值和方差 :param x: :return: """
return [[np.mean(data), np.std(data)] for data in x]
G 和 D 的连接之间也需要做出处理。
# 先求出G_output3的各行平均值和方差
MEAN = tf.reduce_mean(G_output3, 1) # 平均值,但是是1D向量
MEAN_T = tf.transpose(tf.expand_dims(MEAN, 0)) # 转置
STD = tf.sqrt(tf.reduce_mean(tf.square(G_output3 - MEAN_T), 1))
DATA = tf.conCAT(1, [MEAN_T,
tf.transpose(tf.expand_dims(STD, 0))] # 拼接起来
以下是损失函数变化图:
蓝色是 D 单独作二分类问题处理时的变化
绿色是拼接 G 在 D 的上方后损失函数的变化
不难看出,两者在经历反复震荡 (互相博弈而导致),最后稳定于 0.5 附近,这时我们可以认为,G 的生成能力已经达到以假乱真,D 再也不能分出真假。
接下来的这个就是 D-G 博弈 200 次后的结果:
绿色是真实分布
蓝色是噪音原本的分布
红色是生成分布
后话
兔子哥哥的车这次就开到这里了。作为一个大三且数学能力较为一般的学生, 从比较感性的角度来描述了一次 GAN 的基本过程,有说得不对地方请各位见谅和指点。
如果各位读者需要更严格的数学公式和证明,可以阅读 GAN 的开山之作([1406.2661] Generative Adversarial Networks) , 另外本文提及的代码都可在这里找到(MashiMaroLjc/learn-GAN),有需要的童鞋也可以私信交流。
这就是全部内容了,下次心情好的话怼 DCGAN,看看能不能生成点好玩的图片,嗯~ 睡觉去~
雷锋网(公众号:雷锋网)按:本文原作者兔子老大,原文来自他的知乎专栏。
雷锋网版权文章,未经授权禁止转载。详情见转载须知。
相关推荐
- 从IDEA开始,迈进GO语言之门(idea got)
-
前言笔者在学习GO语言编程的时候,GO语言在国内还没有像JAVA/Php/Python那样普及,绕了不少的弯路,要开始入门学习一门编程语言,最好就先从选择一个好的编程语言的开发环境开始,有了这个开发环...
- 基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于SpringBoot...
- 基于springboot的个人服装管理系统java网上商城jsp源代码mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...
- 基于springboot的美食网站Java食品销售jsp源代码Mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍基于springboot...
- 贸易管理进销存springboot云管货管账分析java jsp源代码mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目描述贸易管理进销存spring...
- SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql
-
本项目为前几天收费帮学妹做的一个项目,JavaEEJSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。一、项目介绍SpringBoot+V...
- 目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗
-
帮粉丝找了一个基于SpringBoot的天猫商城项目,快速部署运行,所用技术:MySQL,Druid,Log4j2,Maven,Echarts,Bootstrap...免费给大家分享出来前台演示...
- SpringBoot+Mysql实现的手机商城附带源码演示导入视频
-
今天为大家带来的是基于SpringBoot+JPA+Thymeleaf框架的手机商城管理系统,商城系统分为前台和后台、前台用的是Bootstrap框架后台用的是SpringBoot+JPA都是现在主...
- 全网首发!马士兵内部共享—1658页《Java面试突击核心讲》
-
又是一年一度的“金九银十”秋招大热门,为助力广大程序员朋友“面试造火箭”,小编今天给大家分享的便是这份马士兵内部的面试神技——1658页《Java面试突击核心讲》!...
- SpringBoot数据库操作的应用(springboot与数据库交互)
-
1.JDBC+HikariDataSource...
- SpringBoot 整合 Flink 实时同步 MySQL
-
1、需求在Flink发布SpringBoot打包的jar包能够实时同步MySQL表,做到原表进行新增、修改、删除的时候目标表都能对应同步。...
- SpringBoot + Mybatis + Shiro + mysql + redis智能平台源码分享
-
后端技术栈基于SpringBoot+Mybatis+Shiro+mysql+redis构建的智慧云智能教育平台基于数据驱动视图的理念封装element-ui,即使没有vue的使...
- Springboot+Mysql舞蹈课程在线预约系统源码附带视频运行教程
-
今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的Springboot+Mysql舞蹈课程在线预约系统,系统项目源代码在【猿来入此】获取!https://www.yuan...
- SpringBoot+Mysql在线众筹系统源码+讲解视频+开发文档(参考论文
-
今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的在线众筹管理系统,主要实现了普通用户在线参与众筹基本操作流程的全部功能,系统分普通用户、超级管理员等角色,除基础脚手架外...
- Docker一键部署 SpringBoot 应用的方法,贼快贼好用
-
这两天发现个Gradle插件,支持一键打包、推送Docker镜像。今天我们来讲讲这个插件,希望对大家有所帮助!GradleDockerPlugin简介...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 从IDEA开始,迈进GO语言之门(idea got)
- 基于SpringBoot+MyBatis的私人影院java网上购票jsp源代码Mysql
- 基于springboot的个人服装管理系统java网上商城jsp源代码mysql
- 基于springboot的美食网站Java食品销售jsp源代码Mysql
- 贸易管理进销存springboot云管货管账分析java jsp源代码mysql
- SpringBoot+VUE员工信息管理系统Java人员管理jsp源代码Mysql
- 目前见过最牛的一个SpringBoot商城项目(附源码)还有人没用过吗
- SpringBoot+Mysql实现的手机商城附带源码演示导入视频
- 全网首发!马士兵内部共享—1658页《Java面试突击核心讲》
- SpringBoot数据库操作的应用(springboot与数据库交互)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- node卸载 (33)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- exceptionininitializererror (33)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)