1. 程式人生 > >手寫數字識別(一)

手寫數字識別(一)

在學習識別手寫輸入數字時,初始化矩陣那裡,有點不理解。原始碼是這樣的:

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)

希望有志同道合的小夥伴關注我的公眾平臺,歡迎您的批評指正,共同交流進步。