2.3 神经网络的简单实现

深度神经网络由多个层(layer)组成,通常将其称之为 模型(Model)。整个模型接受原始 输入(特征),生成 输出(预测),并包含一些 参数。而在模型内部,每个单独的层都会接受一些输入(由前一层提供),生成输出(到下一层的输入),并包含一组参数;层层向下传递,就可以得到最终的输出值。

神经网络中的参数,就是每一层的权重和偏置。

2.3.1 三层神经网络

我们这里以一个三层神经网络为例,实现从输入到输出的处理计算,这个过程就是 前向传播(forward)。

图片[1]-2.3 神经网络的简单实现-大赛人网
图片[2]-2.3 神经网络的简单实现-大赛人网

2.3.2 各层之间的信号传递

上面只是三层网络的示意图,实际上每层还应该有偏置,各输入信号加权总和还要经过激活函数的处理。接下来逐层进行分析,考察信号在各层之间传递的过程。

  1. 输入层(第0层)→ 第1层
图片[3]-2.3 神经网络的简单实现-大赛人网
图片[4]-2.3 神经网络的简单实现-大赛人网

2)第1层 → 第2层

    第1层到第2层的处理类似,权重参数应该是一个3×2的矩阵。

    图片[5]-2.3 神经网络的简单实现-大赛人网

    3)第2层 → 输出层(第3层)

    图片[6]-2.3 神经网络的简单实现-大赛人网
    1. 代码实现

    我们可以将神经网络的所有参数(每一层的权重w和偏置b),保存在一个字典network中;并定义函数:

    • init_network():对参数进行初始化,每一个权重参数都是一个矩阵(二维),每一个偏置参数则是一个数组(一维);
    • forward():前向传播,将输入信号转换为输出信号的处理操作。

    这里的激活函数,隐藏层用sigmoid,输出层用identity(恒等函数)。

    具体代码如下:

    import numpy as np
    from common.functions import sigmoid, identity_function
    
    def init_network():
        network = {}
        network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
        network['b1'] = np.array([0.1, 0.2, 0.3])
        network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
        network['b2'] = np.array([0.1, 0.2])
        network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
        network['b3'] = np.array([0.1, 0.2])
    
        return network
    
    def forward(network, x):
        w1, w2, w3 = network['W1'], network['W2'], network['W3']
        b1, b2, b3 = network['b1'], network['b2'], network['b3']
    
        a1 = np.dot(x, w1) + b1
        z1 = sigmoid(a1)
        a2 = np.dot(z1, w2) + b2
        z2 = sigmoid(a2)
        a3 = np.dot(z2, w3) + b3
        y = identity_function(a3)
    
        return y
    
    network = init_network()
    x = np.array([1.0, 0.5])
    y = forward(network, x)
    
    print(y)
    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞13 分享
    评论 抢沙发
    头像-大赛人网
    欢迎您留下宝贵的见解!
    提交
    头像-大赛人网

    昵称

    取消
    昵称

      请登录后查看评论内容