仅用Numpy实现CNN卷积神经网络的推导和训练(3)
仅用Numpy实现CNN卷积神经网络的推导和训练(3)

仅用Numpy实现CNN卷积神经网络的推导和训练(3)


作者:Harkerbest

声明:本文章为原创文章,本文章永久链接:https://www.harkerbest.cn/p/890 转载请注明原文地址,盗版必究!!!


全系列文章目录请参见

简单全连接层的实现

  本节将会构建一个三层的神经网络,并演示如何用矩阵运算表示神经网络间的信号传递。神经网络的结构如下图所示,前三层最上方为偏置神经元。

%title插图%num

Numpy实现矩阵内积运算

  Numpy自带矩阵内积计算功能,下面是计算矩阵A和B的内积的语法演示:

import numpy as np

A = np.array([[1,2], [3,4]]) # 定义矩阵A
B = np.array([[5,6], [7,8]]) # 定义矩阵B

C = np.dot(A, B) # 计算矩阵A和B的内积并赋值给C
print(C)
# 输出: array([[19,22], [43,50]])

神经网络的矩阵表示和信号传递

  神经网络每一层的传入参数、权重和偏置可以用矩阵储存,神经网络层间信号传递可以用矩阵运算表示。根据神经网络的定义,假设上一层传入的数值为矩阵X,上一层到本层的权重为矩阵W,偏置为矩阵B,那么传输到本层的信号数值为(用矩阵A表示):

A = XW + B

  得到矩阵A后,经过激活函数转换便能得到传往下一层的信号数值(用Z矩阵表示),下面是代码实现(sigmoid已在上一节中定义):

A = np.dot(X, W) + B
Z = sigmoid(A)

三层神经网络的信号传递

  上面已经定义了层间神经网络的信号传播方法,只需要重复上述传播的步骤,即可实现三层神经网络的传输,下面是实现三层神经网络传输的代码(定义an zn bn wn分别为第n层的传入信号、传出信号、偏置、权重,x为传入层传入的初始信号值):

def init_network(): # 初始化神经网络的各项参数,返回一个储存各项参数的字典
    network = {}
    network['w1'] = np.array(...)
    network['b1'] = np.array(...)
    network['w2'] = np.array(...)
    network['b2'] = np.array(...)
    network['w3'] = np.array(...)
    network['b3'] = np.array(...)

    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
    z3 = sigmoid(a3)

    y = identity_function(a3) # 恒等函数,与y=a3等价,这里后续会替换为输出层的激活函数softmax
    return y

network = init_network() # 初始化神经网络各项参数
x = np.array(...) # 定义传入参数
y = forward(network, x) # 完成正向推导得到输出层输出参数y
print(y)

小结

  至此,我们已经实现了简单神经网络的正向传播,后续会讲解输出层的实现。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

CAPTCHAis initialing...