本篇文章2634字,读完约7分钟

介绍

啦啦啦,目前gan算法可视为ml领域的一个热门方向。事实上,gan作为一个想法已经渗透到了ml的其他领域,因此做了很多令人惊奇的事情。例如,结合卷积神经网络,它可以用来生成图片。或者结合自然语言处理,可以生成具有特定风格的短句。(例如,特朗普风格的推特...(

不幸的是,互联网上的许多老司机最终都把自己的车翻了,而且大多数人只是翻译了一篇论文。一旦涉及到算法实现部分,他们就直接把开源实现地址放进去。然而,那些开源的东西缺乏必要的指导,这真的让初学者很难。因此,兔子兄弟带着开好车、开稳定车的心态,特地来带其他想开始干的兔子飞一段时间。

甘的介绍和培训

首先,解释甘的基本做法。这里没有公式,因为听完之后,你应该知道如何建造和训练。

起初,gan被称为生成性对抗网络,其组成分为两个部分:

发电机,以下简称g。

鉴别器,以下简称d。

在本文中,为了便于Bunny的理解,本文中提到的一个简单示例用于训练G生成符合指定均值和标准偏差的数据。这里,我们指定高斯分布(正态分布),均值=4,标准差=1.5。

这个产品看起来像这样

以下是数据生成的代码:

def sample_data(大小,长度=100):

" ""随机平均值=4 std=1.5的数据:参数大小::参数长度::返回:" "

数据= []

对于范围(大小)中的(_ I):

data.append(已排序(np.random.normal(4,1.5,长度))

返回np.array(数据)

在生成高斯分布数据后,我们还对数据进行了排序,因为排序后的训练将会相对平滑。出于特定的原因来看这个[张量流中的生成对抗网络(第一部分)]

这一段是产生噪音的代码。由于是噪声,我们只需要随机生成0~1个数据。

def random_data(大小,长度=100):

" ""随机生成数据:参数大小::参数长度::返回:" "

数据= []

对于范围(大小)中的(_ I):

x = np.random.random(长度)

data.append(x)

返回np.array(数据)

随机分布的数据看起来像这样

下一步是打开甘。

首先,我们需要确定G,d的具体结构。由于本文中的例子过于入门级,不需要复杂的神经网络结构,如卷积层和递归层。g和D只需要完全连接的神经网络。全连接层神经网络的本质是矩阵的奇异乘法。为什么是奇特的乘法,因为大多数时候,我们在矩阵乘法的结果之后添加不同的激活函数。

g和d是三层完全连接的神经网络,其中g的激活函数分别是relu、sigmoid和liner。这里,前两层只考虑数据的非线性变换,没有选择这两个激活函数的特殊原因。第二,d的三层是relu、sigmoid和sigmoid。

接下来,它导致了甘的训练。甘的思想来源于博弈论,博弈论简单明了:常规与反常规。

从作为鉴别器的D开始,它的任务是区分真实的高斯分布和g产生的“假”高斯分布。因此很明显,对于D,它需要解决的是传统的二进制分类问题。

在二元分类问题中,我们习惯用交叉熵来衡量分类效果。

从公式中不难看出,当所有分类都正确时,交叉熵将接近于0。因此,我们的目标是通过拟合d的参数来最小化交叉熵

由于D是一个传统的二分法问题,D的训练过程很容易得到

也就是说,首先将真实数据标记为“1”(真实分布),将生成器生成的数据标记为“0”(生成的分布),并迭代训练d (1)

让我们在重力训练前打个比方。如果一个男人和一个女人在一起,现在他们的性格有矛盾,女孩们不愿意改变,但他们都想继续在一起。在这个时候,唯一的办法就是让男孩们改变。首先,忽略现实生活中的问题,但是从一个例子来看,很明显,随着时间的推移,男孩会变得更适合女孩。

g的训练是一样的:

首先,g在d之上拼接,即g的输出作为d的输入(男孩和女孩在一起),而d的参数是固定的(女孩不愿意改变),进入g的噪声样本的标签都改为1(目标是两个人在一起,没有其他选择)。为了最小化损失函数,g的每一层的权重只能在此时改变,因此g的生成能力可以在重复迭代之后得到提高。(男孩更适合女孩)-(2)

重复(1)和(2),最后G将获得更好的生成能力。

还有一件事,当我训练D的时候,我直接把数据放进去。结果是最终数据可以学习高斯分布的轮廓,但标准差和均值与实际样本有很大的不同。因此,我建议直接使用均值和标准差作为d的输入。

这使得D需要在训练前对数据进行预处理。

def预处理_数据(x):

" ""计算每组数据的均值和方差:参数x::返回:" "

返回[[np.mean(数据),np.std(数据)](x中的数据)

还需要处理g和d之间的联系。

#首先找出g_output3每一行的平均值和方差

平均值= TF。reduce _ mean (g _ output3,1) #平均值,但它是一维向量

均值_ t = tf .转置(tf.expand _ dim(均值,0)) #转置

STD = TF . sqrt(TF . reduce _ mean(TF . square(g _ output 3-mean _ t),1))

data = tf.concat(1,[mean_t,

Tf。转置。展开尺寸(标准,0))] #拼接在一起

以下是损失函数的变化图:

蓝色是单独处理二元分类问题时D的变化

绿色是在d上面拼接G后损失函数的变化

不难看出,两者经历了反复冲击(由相互博弈引起),最终稳定在0.5左右。这时,我们可以认为G的生成能力已经达到了真的水平,而D已经不能分辨真假了。

下一个是d-g游戏200次后的结果:

绿色是真正的分布

蓝色是噪音的原始分布

红色是世代分布

SOA无政府状态后记

兔子兄弟的车这次开到了这里。作为一个数学能力一般的大三学生,我从感性的角度描述了甘的基本过程。如果有什么不对的地方,请原谅我并给出指示。

如果读者需要更严格的数学公式和证明,他们可以阅读甘的开创性工作([1406.2661]生殖对抗网络),本文提到的代码可以在这里找到(mashmarolljc/learn-gan),有需要的童鞋也可以私下交流。

仅此而已。如果你下次心情好的话,让我们看看你是否能生成一些有趣的图片,嗯~去睡觉吧~

雷锋。(公开号码:雷锋。新闻:这篇文章的原作者是兔子老板,原文来自他的智虎专栏。

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

来源:搜狐微门户

标题:从零教你写一个完整的GAN

地址:http://www.shwmhw.com/shxw/60437.html