Python的傳遞引用

  在研究神經網絡的反向傳播的時候,不解一點,就是修改的是神經網絡的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

相關文章
相關標籤/搜索