切换视频源:

定义 Layer 类

作者: C.Cui 编辑: 莫烦 2016-11-03

学习资料:

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

要点

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

import theano
import theano.tensor as T
import numpy as np

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

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

# to define the layer like this:
l1 = Layer(inputs, 1, 10, T.nnet.relu)
l2 = Layer(l1.outputs, 10, 1, None)

其中,第一层网络我们命名为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类的代码:

class Layer(object):
    def __init__(self, inputs, in_size, out_size, activation_function=None):
        self.W = theano.shared(np.random.normal(0, 1, (in_size, out_size)))
        self.b = theano.shared(np.zeros((out_size, )) + 0.1)
        self.Wx_plus_b = T.dot(inputs, self.W) + self.b
        self.activation_function = activation_function
        if activation_function is None:
            self.outputs = self.Wx_plus_b
        else:
            self.outputs = self.activation_function(self.Wx_plus_b)

细节说明

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

def __init__(self, inputs, in_size, out_size, activation_function=None)

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

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

self.W = theano.shared(np.random.normal(0, 1, (in_size, out_size)))
self.b = theano.shared(np.zeros((out_size, )) + 0.1)

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

self.Wx_plus_b = T.dot(inputs, self.W) + self.b

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

self.activation_function = activation_function
if activation_function is None:
    self.outputs = self.Wx_plus_b
else:
    self.outputs = self.activation_function(self.Wx_plus_b)

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

降低知识传递的门槛

莫烦的对教育的态度是: 降低知识传递的门槛,不希望给"学习"设置金钱障碍。 这是我花大量业余时间贡献 免费 AI分享的原因。 通过 【赞助】 能及时让我看到你对 【莫烦态度】 的认同,我也更有理由坚持下去。

如果你当前目标是找工作或者转行AI,想接受更加丰富的教学资源、培训辅导体验,我想推荐我的朋友 七月在线 给你, 通过这个 【莫烦Python为你提供的注册链接】, 你将可以获得莫烦专门为你协商的课程优惠券。祝你找/换工作顺利~