在模型類定義的時(shí)候初家,定義forward函數(shù)傲醉,其中變量形式(self,x)
在使用Pytorch的時(shí)候,模型訓(xùn)練時(shí)零如,不需要調(diào)用forward函數(shù)浪秘,只需要在實(shí)例化一個(gè)對象中傳入對應(yīng)的參數(shù)就可以自動(dòng)調(diào)用forward函數(shù)。
model(data) & model.forward(data) 等價(jià)埠况,因?yàn)樵赾lass Module中調(diào)用了__call__函數(shù)耸携,forward函數(shù)在call函數(shù)中調(diào)用了,示例(紅色圈起來的是連接的關(guān)鍵點(diǎn)):
說明辕翰,在給類實(shí)例化賦值時(shí)夺衍,'土豪‘變量就是call中的param,也是forward中的input_喜命,也就是在紅色圈內(nèi)沟沙,在call函數(shù)下就將其參數(shù)傳給了forward變量”陂牛【總結(jié)一句話:是在call中調(diào)用了forward函數(shù)】? Student()中的變量對應(yīng)__init__函數(shù)中的變量矛紫。
運(yùn)行結(jié)果如下:( forward函數(shù)返回的是‘input_’參數(shù)變量,所以最終input_param結(jié)果值是input_的賦值結(jié)果)
學(xué)習(xí)Pytorch,一個(gè)前提是知道Python? class中的__call__ (使得類的實(shí)例化對象具有類似函數(shù)的功能)和__init__方法(類的初始化函數(shù)牌里,類似于C++的構(gòu)造函數(shù))颊咬,這里主要介紹__call__函數(shù)务甥。
Python中,凡是可以用()直接應(yīng)用到自身并執(zhí)行喳篇,都稱為可調(diào)用對象敞临,可調(diào)用對象包括自定義的函數(shù),Python內(nèi)置函數(shù)以及類實(shí)例對象麸澜。
__call__函數(shù): 對于可調(diào)用對象挺尿,’名稱()‘等價(jià)于’名稱.__call__()'的簡寫。 所以開講到的類實(shí)例化為一個(gè)對象model炊邦,并傳入?yún)?shù)(data)编矾,就相當(dāng)于:model.__call__(data),又因?yàn)檎{(diào)用call函數(shù)就直接調(diào)用了forward函數(shù),所以直接對類示例化的對象傳入訓(xùn)練參數(shù)馁害,就直接調(diào)用了forward函數(shù)洽沟,對數(shù)據(jù)進(jìn)行了前向傳播的訓(xùn)練學(xué)習(xí)。
類中的函數(shù)會(huì)自動(dòng)鏈接__call__函數(shù)蜗细,也就是會(huì)自動(dòng)調(diào)用call函數(shù)。而類的屬性則不能調(diào)用call函數(shù)怒详。
Pytorch炉媒,主要也是按照__call__,__init__.forward三個(gè)函數(shù)實(shí)現(xiàn)網(wǎng)絡(luò)層之間的架構(gòu)的
Python中callable()用于檢查一個(gè)對象是否是可調(diào)用的,返回TRUE昆烁,obj仍然可能調(diào)用失敗吊骤,但返回FALSE,obj絕對不會(huì)調(diào)用成功静尼。? ?對于函數(shù)白粉,方法,lambda函式鼠渺,類以及實(shí)現(xiàn)了__call__方法的類實(shí)例鸭巴,都返回TRUE。