nn.Model中的forward()前向傳播不調用


前言:

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()前向傳播不調用 解釋

參考2:Python __call__詳解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM