手写数字识别(一)

在学习识别手写输入数字时,初始化矩阵那里,有点不理解。源代码是这样的:

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)

希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正,共同交流进步。

手写数字识别(一)_第1张图片


你可能感兴趣的:(机器学习,神经网络与机器学习)