在研究神經網絡的反向傳播的時候,不解一點,就是修改的是神經網絡的paramets,爲何影響內部的神經元(層),好比Affine層;由於除了建立的時候,使用params做爲Affine層的構造函數參數以外,根本沒有再使用。關係以下:python
1 class TwoLayerNet: 2 3 def __init__(self, input_size, hidden_size, output_size, weight_init_std = 0.01): 4 self.params = {} 5 self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size) 6 self.params['b1'] = np.zeros(hidden_size) 7 ... ... 8 9 self.layers = OrderedDict() 10 self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1']) 11 ... ...
後來才發現其實python裏面也是和Java同樣,對於對象類型傳值是傳遞引用。網絡
爲何呢?由於你會發現若是是對於值進行修改,將會體現出來Affine層的變化;可是若是你要是直接對於值進行變化,好比設置爲None,或者設置一個新的值,那麼就不會發生變化:dom
1 network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10) 2 print("before first layer parames: ", network.layers['Affine1'].W[0]) 3 network.params["W1"] = None 4 print("after first layer parames: ", network.layers['Affine1'].W[0])
可是若是你作的是減法,則會發現W值發生了變化:函數
1 for key in ('W1', 'b1', 'W2', 'b2'): 2 network.params[key] -= learning_rate * grad[key] 3 print("grad[key]: ", grad[key]) 4 print("after first layer parames: ", network.layers['Affine2'].W[0])
這個就是由於Affine的W是network的params的引用,若是你設置爲None以後,其實改變的是params的引用,可是本來的引用仍然存在,只不過沒有和params關聯而已。spa