Python神经网络代码识别手写字具体流程(二):矩阵的前向传播

来源:互联网 发布:java 将字符串格式化 编辑:程序博客网 时间:2024/05/11 03:30

在上一篇神经网络代码实现流程中,加载数据返回了三组数据:训练集,测试集,验证集.加载数据后,需要对神经网络代码的类进行实例化。
以下讲解,神经网络代码类的实现:
在类中,首先,在Network类的构造函数中,由实例化时传入的参数定义了神经网络的层数,每层的神经元个数,并利用随机函数对每层的神经元权重以及偏置进行初始化。

 def __init__(self, sizes):        self.num_layers = len(sizes)  #神经网络的层数,循环的时候会应用到        self.sizes = sizes   #传入的神经网络的列表        self.biases = [np.random.randn(y, 1) for y in sizes[1:]]  #生成的偏置的矩阵,形成到为一个列表,列表中的每一项都是一个矩阵。矩阵的维度与y相同        self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])] #形成的权重的列表,(如果输入层为第0层的话,列表中的第i个矩阵的维度为:(第i层的神经元个数)*(i—1层神经元个数))。其中,随机化生成的矩阵符合标准正态分布。

在构造函数中,相当于形成了神经网络的骨架,在实例化神经网络的类时,传入的参数是神经网络的结构,所以所有的权重,偏置,神经元都已经被定义好了。在上一节中,数据已经被加载成了标准的格式,到现在,我们可以把训练集输入进去,得到了一个输出的矩阵,当然,这个输出的矩阵并没有什么用。但是理解这个矩阵却能够理解前向传导的含义。
前向传播网络代码如下:

def feedforward(self, a):    for b, w in zip(self.biases, self.weights):        a = sigmoid(np.dot(w, a)+b)    return a

在以上的代码中,a为输入,在上一节中我们知道输入为(784*50000),经过以上的循环:经过第一个隐藏层,输出的a为(30*50000),在经过第二个隐藏层,得到的a为(10*50000)。当然,我们肯定不会这样使用神经网络将所有的数据一次向传入进去,只是用此说明一下前向网络的流程。

原创粉丝点击