定义 Layer 类
学习资料:
在学习了如何利用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_function
是None
, 那就是该层神经元采用线形输出;如果是其他Theano
的激活函数,就把Wx_plus_b
作为该层激活函数的输入,同时函数的输出即为神经层的输出:
我们就成功的定义了神经网络的最最重要的结构--神经层Layer
。 在下一节内容中我们将学习如何利用本节的内容,来用神经网络解决一个 regression 回归例子。