蝌蚪,深度神经网络是怎么成为图画大师的?,京东快递

频道:科研发现 日期: 浏览:212

深度学习为何如此有用仍是个谜。

在本文中,咱们将测验用神经网络为咱们制作笼统的图画,然后对这些图画进行解说,以便对奥秘面纱下发作的工作有更好的了解。

看完蝌蚪,深度神经网络是怎样成为图画大师的?,京东快递这篇文章,你将学会生成一些图画,如下所示。

(一切内容都少于100行PyTor男女结合ch 代码。随附的Jupyter notebook:https://github.com/paraschopra/abstract-art-neural-network)





这幅图画是怎样生成的?


这张图片是由一个简略的架构—复合形式生成网络(CPPN)生成的。

(你能够经过http://blog.otoro.net/2015/06/19/neural-network-蝌蚪,深度神经网络是怎样成为图画大师的?,京东快递generative-art/这篇文章来了解。)


文章中,作者经过用JavaScript编写的神经网络生成笼统图画。而本文用PyTorch完成了它们。

经过神经网络生成图画的一种办法是让它们一次性输出完好的图画,比方说,下面的被称为“生成器”的神经网络将随机噪声作为输入,并60秒在输出层中生成整个图画(以及宽度*高度)。




与输出整个图画不同,CPPN在给定方位(作为输入)输出像素的色彩。




疏忽上面图画中的z和r,留意网络正在获取像素的x,y坐标,并输出该像素应该是什么色彩(用c表明)。这种网络的PyTorch模型如下所示:

class NN(nn.Module):

def __init__(self):

super(NN, self).__init__()

self.layers = nn.Sequential(nn.Linear(2, 16, bias=True),

nn.Tanh(),

nn.Linear(康美心语蝌蚪,深度神经网络是怎样成为图画大师的?,京东快递16, 16, bias=False),

nn.Tanh(),

nn.Linear(16, 16,蝌蚪,深度神经网络是怎样成为图画大师的?,京东快递 bias=False),

nn.Tanh(),

nn.Linear(16, 16, bias=False),

nn.Tanh(),

nn.Linear(16, 16, bias=False),

nn.T蝌蚪,深度神经网络是怎样成为图画大师的?,京东快递anh(),

nn.Linear(16, 16, bias=False),

nn.Tanh(),

nn.Linear(16, 16, bias=False),

nn.Tanh(),

nn.Linear(16, 16, bias=False),

nn.Tanh(),

nn.Linear(16, 16, bias=False),

nn.Tanh(),

nn.何亚兵Linear(16, 3, bias=False),

nn.Sigmoid())

d巫夷人家ef forward(self, x):

retur艾希n self.layers(x)


请留意,它承受2个输入,并有3个输出(像素的RGB值)。生成整个图画的办法是输入所需图画(特定巨细)的一切X、Y方位,并将这些X、Y方位的色彩设置为网络输出的色彩。


神经网络试验


或许,当你测验运转上面的神经网络时,你会生成下面的图画:




或许你会充溢疑问:为什么不论你供给的是什么x,y方位,网络输出的都是灰色?抱负情况下,这不应该发作,因为这个网络如此的深。更改输入值就应更改输出值。

每次神经网络初始化时,因为参数(权重和误差)的随机初始化,它都有或许生成一个全新的图画。但往往即便经过几回测验,你从神经网络中得到的都是这种一片灰色。为什么?

有人或许会说,是所用的特定激活函数-tanh 的问题。或许后续层中的多个tanh序列在输出层(代表灰色)将一切输入数字压缩到挨近0.5。可是,本文最开端引荐的那篇文章中也使用了tanh。咱们所做的仅仅将博客顶用JavaScript编写的神经网络转换成PyTorch而没有做任何更改。

本源问题在哪里?

当一个新的神经网络被初始化时,PyTorch是怎样初始化权重的?依据用户论坛,他们用从-1/sqrt(N)到+1/sqrt(N)随机抽取的数字初始化权重。其间n是一个层中传入衔接的数量。因而,假如关于躲藏层N=16,权重将会被初始化为-1/4 到 +1/4之间。所以,咱们能够做如下猜想:假定发作一片灰色的原因是因为权重的规模很小,而且改变不大。

假如网络中的一切权重都在-1/4到+1/4之间,当乘以任何输入并加在一起时,或许会发作类似中心极限定理的作用。

中心极限定理(CLT)证明:在某些情况下,添加独立随机变量,即便原始变量自身不是正态分布,它们恰当归一化的和也趋向于正态分布(非正式地称为“钟形曲线”)。

回想怎样核算后续层上的值。



在咱们的比方中,第一个输入层有2个值(x,y),第二个躲藏层有16个神经元。所以,第二层上的每个神经元得到2个值乘以权重,这些权重值在-1/4 到 蝌蚪,深度神经网络是怎样成为图画大师的?,京东快递+1/4之间。新浪轿车这些值被求和,然后在它从激活函数tanh开端后,成为要传递到第三层的新值。

现在,从第二层开端,有16个输入要传递到第三层的16个神经元中的每一个。假定这些值中的每一个都用z表明,那么第三层中每个神经元的值是:




这是咱们的另一个猜想。因为权重的方差较小(-1/4到+1/4),z的值(即输入x,y乘以权重,然后经过tanh函数)也不会改变太多(因而会类似)。所以这个方程能够看作:




关于每个神经元,从-0.25到+0.25的16个权重之和的最或许值是零。即便在第一层,和不挨近零,网络的八层给了上述方程满足的机会使终究发作挨近零的值。因而,不论输入值(x,y)怎样,进入激活函数的总值(权重乘以输入的归纳)总是挨近零值,tanh映射为零(因而,一切后续层中的值坚持为零)。



x轴是tanh的输入,y轴是输出。请留意,0映射到0。

灰色的原因是什么?这是因为s形函数(最终一层的激活功用)将这个输入值取零,并映射到0.5(表明灰色,0表明黑色,1表明白色)。




留意s形函数怎样将输入值0映射到0.5。


怎样修正一片灰色?


因为本源是权重的细小改变,咱们下一步要做的便是添加它。更改默许的初始化函极品小姨小说数,将权重从-100分配到+100(而不是-1/4到+1/4)。现在运转神经网络,咱们能够得到:




哇!一片灰色现在是一些色彩的斑驳。

现在有了一些发展。咱们的假定是正确的。可是生成的图画依然没有太多的结构。这太简略了。

这个神经网络在外表下所做的便是将输入与权重相乘,推进它们经过tanh,最终经过s形函数输出色彩。已然咱们固定了权重,那么能够修正输入以使输出图画更风趣吗?当然。

请留意,上面的图画是在输入x,y作为原始像素坐标时生成的,这些坐标从0,0开端到128,128完毕(这是图画的巨细)。这意味着咱们的网络从来没有一个负数作为输入,而且因为这些数字很大(比方sketchupx,y能够是100,100),tanh函数要么得到一个很大的数字(它被压缩到+1),要么得到一个很小的数字(它被压扁到-1)。这便是咱们看到原色的简略组合的原因(例如,0,1,蝌蚪,深度神经网络是怎样成为图画大师的?,京东快递1的合丰刘海龙R,G,B输出代表你在上图中看到的青色)。


怎样使图画变得风趣?


就像在文章最开端说到的那篇文章中一样,咱们将x和y标准化。因而,咱们不输入x,而是输入(x/image_size)-0.5。这意味着x和y的值规模为-0.5到+0.5(不考虑图画巨细)。这样就得到了以下图画:




仍是有一些发展的!

风趣的是,在前一幅图画中,线条一向向右下角添加(因为x,y值在添加)。这儿,因为x,y值是标准化的而且现在包括负数,所以这些线向外均匀地添加。

可是,图画依然不行美丽。


怎样使图画更风趣一些?


假如你仔细观察,你会发现在图画的中心,好像有比边际更多的结构。这是数学之神给咱们的暗示,咱们应该扩大那里去寻觅美。

有三种扩大图画中心的办法:

生成一幅大图画。因为像素坐标是标准化的,咱们能够简略地运转神经网水门事件络来生成更大的图画。然后,咱们能够经过图画编辑东西扩大中心部分,看看咱们发现了什么。

将x和y输入乘以少数(缩放因子),这将有用地完成与前一种办法相同的成果(并防止咱们在其他无趣区域进行糟蹋的核算)。

因为输出是由输入乘以权重决议的,因而咱们小洞洞也能够经过将权重值从-100、+100削减到+3、-3等其他值来进行缩放而不是削减输入值(一起记住不要过度削减。还记得假如权重在-0.25到+0.25规模内就会呈现一片灰色吗?)。

当咱们选用第二种办法将x和y乘以0.01时,得到了:




当选用第三种办法并将权重初始化为介于-3和+3之间时,这是咱们得到的图画烤红薯:




你水蛭的思想翻开了吗?


更多的试验


将权重初始化更改为正态分布(平均值为0,标准差为1),并生成多个图画(下图是从随机初始化开端的)。










当移除一切躲藏层(仅输入到输出映射)时:



0个躲藏层


当仅保存一个躲藏层(而不是默许的8个躲藏层)时:



1个躲藏层

当把躲藏层的数量加倍到16层时:



16个躲藏层,每层有16个神经元

正如你所能幻想的,跟着添加躲藏层的数量,图画变得越来越杂乱。假如不是将层加倍,而是将层的数量坚持不变(8),可是将每层神经元的数量加倍(从16到32),会发作什么?咱们得武夷山天气预报到的是:



8个躲藏层,每层32个神经元

请留意,尽yy4480首播影院管在上述两种情况下,网络中的权重总数是类似的,但具有两个层魏厉宁的网络比每层双倍神经元的网络更像素化。像素表明,在这些区域中,函数改变剧烈,因而假如咱们进一步缩放,会发现更多的结构。而关于层数不变但每层神经元数量加倍的网络,其功用适当滑润,因而“可缩放性”较小。

当然,一切这些都是深度使神经网络更具捯饬表现力的另一种说法。

核算函数的杂乱度随深度呈指数添加。

这正是咱们所看到的。一般的迫临定理以为,理论上,一个满足大的神经网络,即便有一个躲藏层,也能够表明任何函数。但在实践中,网络越深,输入到输出映射就越杂乱。


毫无意义但很风趣的试验


假如咱们把每层神经元的数量从8个添加到128个(数量级的添加)。




神经-波洛克!

假如咱们从每一个躲藏层128个神经元开端,然后像下面这样逐渐地在后续层将它们折半。

self.layers = nn.Sequential(nn.Linear(2, hidden_n, bias=True),

nn.驴打滚Tanh(),

nn.Linear(128, 64, bias=False),

nn.Tanh(),

nn.Linear(64, 32, bias=False),

nn.Tanh(),

nn.Linear(32, 16, bias=False),

nn.Tanh(),

nn.Linear(16, 8, bias=False),

nn.Tanh(),

nn.Linear(8, 4, bias=False),

nn.Tanh(),

nn.Linear(4, 3, bias=False),

nn.Sigmoid())


咱们得到的是:




这个看起来比其他的更“天然”。

有许多试验能够做而且得到风趣的图画,你能够测验更多的架构、激活和层次。

热门
最新
推荐
标签

(文章来历:

不惑之年,甲醇:偏强震动,风和日丽