理解代码之前,至少把标题这本书第一章第二章看完
Network类
__init__函数中,初始化偏移值和权重
self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
self.weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])]
由于我python语法都没看完,看到上面这个式子有点疑惑,(参考https://www.codelast.com/原创-《neural-networks-and-deep-learning》读书笔记%ef%bc%9a最简单的识别mnist的神/)要理解上面的式子,需要知道一种赋值list的方法,如下
a = [i for i in range(3)]
print(a)
会输出结果:
[0, 1, 2]
那么偏移值biases就是np.random.randn(y, 1 ) y取后面各种情况时得到返回值,组成的list。教程里初始化sizes是[784, 30, 10],那么y就是取30和10,而np.random.randn(a,b)的功能是生成a*b的随机矩阵,意味着biases包含一个30*1的矩阵和一个10*1的矩阵,及对应着三层神经网络中间层的30个神经元的偏移值及第三层输出层的10个偏移值
再来看看权重weights,首先得知道zip的作用,通过以下例子即可理解:
zip([3, 4], [5, 9])
它的输出是:
[(3, 5), (4, 9)]
可见,它把第一个列向量的第一个值与第二个列向量的第一个值组合在一起变成一个tuple,第二个值同理。
那么代码的意思即为:zip( [784,30],[30,10] ) 生成[ (784,30),(30,10) ] ,随后np.random.randn(30,784) np.random.randn(10,30) 生成相应矩阵组成weights
这里特别说一下为什么biases第二层是30*1,而weights第二次是30*784呢?30不用多说,30行代表有30个神经元,每个神经元里有784个权重值,对应第一层784个输出,而偏移值其实就是阈值,与第一层的输入个数无关,一个神经元只需要一个阈值,所以自然是一个,第三层也类似。或者从w·x+b这个式子理解也行,w和x均为向量,要相乘必须得列数等于行数,x为784*1的话,w就必须为30*784。
再来看看feedforward(self, a)这个函数:具体不分析了,就是计算神经网络输出的函数
的具体实现,每次循环算出一层的输出,最后返回的a就是神经网络的输出,待续