前言:
self.dagmm.train() # self.dagmm = DaGMM(self.gmm_k) enc, dec, z, gamma = self.dagmm(input_data)
在Pytorch中沒用調用模型的forward()前向傳播,只有實例化把參數傳入。
定義一個模型:
1 class Module(nn.Module): 2 def __init__(self): 3 super(Module, self).__init__() 4 # ...... 5 6 def forward(self, x): 7 # ...... 8 return x 9 10 data = ..... #輸入數據 11 # 實例化一個對象 12 module = Module() 13 14 # 前向傳播 直接把輸入傳入實列化 15 module(data) #沒有使用module.forward(data) 16 #實際上module(data) 等價於module.forward(data)
等價的原因是因為 python class 中的__call__可以讓類像函數一樣調用,當執行model(x)的時候,底層自動調用forward方法計算結果:
class A(): def __call__(self): print('i can be called like a function') a = A() a() >>>i can be called like a function
在__call__里可以調用其它函數:
class A(object): def __call__(self, param): print('我在__call__中,傳入參數', param) res = self.forward(param) return res def forward(self, x): print('我在forward函數中,傳入參數類型是值為: ', x) return x a = A() y = a('i') print("傳入的參數是:", y) #我在__call__中,傳入參數 i 我在forward函數中,傳入參數類型是值為: i 傳入的參數是: i
附錄:
附錄1:
可調用的對象:
關於__call__方法,不得不先提一個概念,就是可調用對象(callable),我們平時自定義的函數、內置函數和類都屬於可調用對象,但凡是可以把一對括號()應用到某個對象身上都可稱之為可調用對象,判斷對象是否為可調用對象可以用函數callable。
如果在類中實現了__call__方法,那么實例對象也將成為一個可調用對象。
你也許已經知道,在Python中,方法也是一種高等的對象。這就意味着它們可以被傳遞到方法中,就像其他對象一樣。這是個非常驚人的特征。在Python中,一個特殊的魔術方法可以讓類的實例的行為表現得像函數一樣,你可以調用他們,將一個函數當做一個參數傳到另一個函數中等等。這是一個非常強大的特性,__call__(self, [args...])。
參考:
參考1:Pytorch模型中nn.Model中的forward()前向傳播不調用 解釋