定义 Layer 类
切换视频源:

定义 Layer 类

作者: C.Cui 编辑: 莫烦 发布于: 2016-01-01

学习资料:

在学习了如何利用Theano定义神经网络的激活函数后,我们用一个class类来规划神经网络层的信息,这样会比较方便的我们之后的编程应用.

要点

首先,和之前所有的练习一样,我们引入需要程序需要使用的Python包:

接下来我们来设计神经网络的Layer类。 对于神经网络的每个Layer,我们首先需要明确几个基本特征。 我们可以把每一层神经网络想象成一个函数,它具有输入是数据来源input, 输入神经元维度in_size,输出神经元纬度out_size,和指定的神经元激活函数activation_function

例如,以下的两行代码,就表示了一个具有两层神经元的神经网络:

其中,第一层网络我们命名为l1, 输入变量为inputs, 输入为1维,输出为10维,也就是说l, 含有10个神经元或节点; 激活函数为theano.tensor.nnet.relu函数, 当然我们也可以针对不同的问题选用别的函数, 例如theano.tensor.nnet.nnet.sigmoid, 详情请见Theano官方文档

第二层网络的输入是第一层网络的输出l1.outputs, 所以输入的维度是10,输出是1维,激活函数我们采用one,也就是说我们采用默认的线形激活函数, l2层含有1个神经元,也就是网络的输出神经元。

以上的代码,描述并构建了一个1-10-1的神经网络(inputs-l1-l2)。

定义层结构

接下来我们来具体的实现Layer类的代码:

细节说明

这段代码中,我们最关心的就是这个类的构造函数

和之前的例子一致,我们采用了相同的输入变量名。

接着,我们定义了W,b来代表该神经网络层的输入权值和偏置值,我们把W初始化为 由符合均值为0, 方差为1高斯分布的随机变量值组成的in_size-by-out_size的矩阵; b初始化为值为0.1的out_put-by-1的向量。 (当然,我们也可以采用不同的初始化方法,这里我们暂时不讨论初始化权值对最终神经网络训练的影响)。

首先我们要计算所有神经元的输入矩阵, 也就是输入inputs与输入权值W的点乘(dot product)在加上偏置值b

然后,我们需要根据我们构造神经层指定的激活函数类型activation_function,来计算神经层的输出向量。 这里我们假设如果activation_functionNone, 那就是该层神经元采用线形输出;如果是其他Theano的激活函数,就把Wx_plus_b作为该层激活函数的输入,同时函数的输出即为神经层的输出:

我们就成功的定义了神经网络的最最重要的结构--神经层Layer。 在下一节内容中我们将学习如何利用本节的内容,来用神经网络解决一个 regression 回归例子。


降低知识传递的门槛

莫烦经常从互联网上学习知识,开源分享的人是我学习的榜样。 他们的行为也改变了我对教育的态度: 降低知识传递的门槛免费 奉献我的所学正是受这种态度的影响。 【支持莫烦】 能让我感到认同,我也更有理由坚持下去。

我组建了微信群,欢迎大家加入,交流经验,提出问题,互相帮持。 扫码后,请一定备注"莫烦",否则我不会同意你的入群申请。

wechat