手寫數字識別(一)
阿新 • • 發佈:2019-01-27
在學習識別手寫輸入數字時,初始化矩陣那裡,有點不理解。原始碼是這樣的:
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)
希望有志同道合的小夥伴關注我的公眾平臺,歡迎您的批評指正,共同交流進步。