在学习识别手写输入数字时,初始化矩阵那里,有点不理解。源代码是这样的:
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:])]
'''创建一个权重偏差矩阵'''
先说明,这里sizes[1:]代表的是[3,1],sizes[:-1]代表的是[2,3]。
第一个创建生成的是两个数组。一个是3*1的,一个是1*1的。
第一个创建生成的是两个数组。一个是3*2的,一个是3*1的。为什么呢?
我们先看一下,randn函数是什么意思。
numpy.random.randn(d0, d1, ..., dn):生成一个浮点数或N维浮点数组,取数范围:正态分布的随机样本数。这里面的d0,d1....等于几,生成的就是d0*d1*d2*........的数组。示例代码如下:
>>> import numpy
>>> import random
>>> [numpy.random.randn(3,1)]
[array([[-0.10151443],
[ 0.5825159 ],
[-1.38996558]])]
>>> [numpy.random.randn(3,2)]
[array([[ 0.04849258, 0.57504998],
[-0.52346663, 0.25426669],
[-1.44160756, 0.31060458]])]
这里,我们生成了一个3*1数组和3*2数组。
这样再看代码就不难理解了。
self.biases=[np.random.randn(y,1) for y in sizes[1:]]#[3,1]
这里,执行了两次randn,一次是randn(3,1),然后是randn(1,1)。
再看,
self.weights=[np.random.randn(y,x) for x,y in zip(sizes[:-1],sizes[1:])]#[2,3],[3,1]
这里用了zip函数,这个函数,是将两个列表位置对应的元素组成一个元组,然后再将元组组合成一个列表输出。所以,最后输出[(2,3),(3,1)],然后用for循环取出x,y。两次赋给randn,randn(3,2)和randn(1,3)
希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正,共同交流进步。