最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch中forwod函數(shù)在父類中的調(diào)用方式解讀

 更新時間:2023年02月17日 14:42:03   作者:Ai_Taoism  
這篇文章主要介紹了pytorch中forwod函數(shù)在父類中的調(diào)用方式解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

pytorch forwod函數(shù)在父類中的調(diào)用

問題背景

最近在研究Detetron2的代碼結(jié)構(gòu)時,發(fā)現(xiàn)有些網(wǎng)絡代碼里面沒有forward函數(shù),卻照樣可以推理,深入挖掘之后,發(fā)現(xiàn)其將forword函數(shù)都寫在了同一個父類里面。

這就牽涉到了下面這個問題,子類中沒有forward函數(shù),只有父類中有forward函數(shù),這樣能不能正常調(diào)用網(wǎng)絡。

import torch.nn as nn

class Network1(nn.Module):
? ? def __init__(self):
? ? ? ? super().__init__()

? ? def forward(self,x):
? ? ? ? return x

class Network2(Network1):
? ? def __init__(self):
? ? ? ? super().__init__()


data = [1,2,3]
model = Network2().eval()
output = model(data)
print(output)

輸出結(jié)果如下:

[1,2,3]

pytorch forward方法調(diào)用原理

在使用Pytorch自定義網(wǎng)絡模型的時候,我們需要繼承nn.Module這個類,然后定義forward方法來實現(xiàn)前向轉(zhuǎn)播。

如下圖的一個自定義的網(wǎng)絡模型

首先該網(wǎng)絡模型的初始化方法__init__需要繼承父類nn.Module的初始化方法,用語句super().init()實現(xiàn)。

并在初始化方法里面,定義了卷積、BN、激活函數(shù)等。接下來定義forward方法,將整個網(wǎng)絡連接起來。

有了上面的定義,我們可以實例化一個對象,例如:

fire2 = Fire(96, 128,16,64,64)

實現(xiàn)前向傳播,使用 y= fire2(x) 其中x是該網(wǎng)絡的輸入,y是輸出,實現(xiàn)了forward方法的額功能。

這里就會有人感到奇怪,forward作為Fire這個類的方法,使用的時候不應該是 y= fire2.forward(x)嗎。

這里為什么一個類的實例可以當做方法直接使用?這是因為這個Fire類繼承的父類nn.Module里面定義了__call__方法。

一個類如果定義了__call__方法,則該類的實例就可以作為一個方法那樣直接使用。

例如下列代碼[1]

class A():
    def __call__(self):
        print('i can be called like a function')
 
a = A()
a()

就會執(zhí)行print函數(shù),打印其中搞的文字。這里需要區(qū)別的是,實例化的時候,類的名稱后面括號可以傳遞參數(shù),例如前面實例化Fire的時候,傳遞in_channel,out_channel等參數(shù)。

但是要利用__call__的特性,是在實例名后面的括號中傳遞參數(shù),例如上面的例子a(),這里雖然沒有參數(shù),但是也可以改變__call__的定義使之可以傳遞參數(shù)。

回到網(wǎng)絡模型的內(nèi)容上來。翻看nn.Module的部分源碼[2],可以發(fā)現(xiàn),nn.Module里面果然定義了__call__,并且傳遞了參數(shù)*input。在__call__的定義中國,調(diào)用了self.forward。

這里其實還有一個點值得注意。其實nn.Module里面并沒有定義forward,但他卻調(diào)用self.forward,嚴格來說,他是“想要”調(diào)用self.forward。

如果我們沒有定義一個類,例如Fire,來繼承nn.Module,并且在這個類里面定義forward,那么nn.Module中__call__下面的self.forward就是無效的。

這意味著,父類中__call__下面調(diào)用的函數(shù),可以在繼承他的子類中定義

下面給出一個簡單的例子。

class father():
    def __call__(self):
        self.forward()
        print('I''m the father!')

class child(father):
    def forward(self):
        print('Forward!')
F=father()
C=child()

這里定義了父類father,并定義了繼承他的一個子類child。此外還進行了他們的實例化。

顯然,在father的__call__方法下面,調(diào)用了self.forward,但是沒有定義。child在繼承了father之后,定義了forward。

首先,這段代碼不會報錯,即使father的__call__下面的self.forward并沒有定義,這也是前面我說的,雖然沒有定義forward,但是可以理解為他“想要”調(diào)用self.forward。

那么在child記成了father之后,進行了forward的定義,這使得child本身可以調(diào)用forward。

在上面這段代碼的基礎上,如果我們執(zhí)行F(),匯報下面這一段錯誤,這解釋了forward沒有定義,只是“想要”調(diào)用self.forward。

如果我們執(zhí)行C(),則如下圖輸出。

顯然,在child中補充了forward的定義,就可以成功調(diào)用。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 使用python去除PDF簡單水印的示例

    使用python去除PDF簡單水印的示例

    最近在下載PDF書籍的時候,發(fā)現(xiàn)有些PDF有水印,于是就尋思著能不能用Python去除這些討厭的水印,PDF主要有兩種類型,一種是文字版,另外一種就是掃描版(圖片),這個去除水印主要就是針對掃描版的PDF,所以本文介紹了如何使用python去除PDF簡單水印,需要的朋友可以參考下
    2024-03-03
  • python 根據(jù)pid殺死相應進程的方法

    python 根據(jù)pid殺死相應進程的方法

    下面小編就為大家?guī)硪黄猵ython 根據(jù)pid殺死相應進程的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 利用anaconda保證64位和32位的python共存

    利用anaconda保證64位和32位的python共存

    這篇文章主要為大家詳細介紹了利用anaconda保證64位和32位的python共存,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 淺談Python中的可迭代對象、迭代器、For循環(huán)工作機制、生成器

    淺談Python中的可迭代對象、迭代器、For循環(huán)工作機制、生成器

    這篇文章主要介紹了Python中的可迭代對象、迭代器、For循環(huán)工作機制、生成器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Python使用plotly繪制數(shù)據(jù)圖表的方法

    Python使用plotly繪制數(shù)據(jù)圖表的方法

    本篇文章主要介紹了Python使用plotly繪制數(shù)據(jù)圖表的方法,實例分析了plotly繪制的技巧,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Python劃分數(shù)組為連續(xù)數(shù)字集合的練習

    Python劃分數(shù)組為連續(xù)數(shù)字集合的練習

    這篇文章主要給大家分享的是Python劃分數(shù)組為連續(xù)數(shù)字集合的練習,下面文章首先對問題進行詳細描述,在根據(jù)問題提出解決方案,內(nèi)容詳細,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • python用pickle模塊實現(xiàn)“增刪改查”的簡易功能

    python用pickle模塊實現(xiàn)“增刪改查”的簡易功能

    本篇文章主要介紹了python用pickle模塊實現(xiàn)“增刪改查”的簡易功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-06-06
  • pip已經(jīng)安裝好第三方庫但pycharm中import時還是標紅的解決方案

    pip已經(jīng)安裝好第三方庫但pycharm中import時還是標紅的解決方案

    這篇文章主要介紹了python中pip已經(jīng)安裝好第三方庫但pycharm中import時還是標紅的問題,本文給大家分享解決方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 使用Flask-Cache緩存實現(xiàn)給Flask提速的方法詳解

    使用Flask-Cache緩存實現(xiàn)給Flask提速的方法詳解

    這篇文章主要介紹了使用Flask-Cache緩存實現(xiàn)給Flask提速的方法,結(jié)合實例形式詳細分析了Flask-Cache的安裝、配置及緩存使用相關操作技巧,需要的朋友可以參考下
    2019-06-06
  • 使用Python實現(xiàn)簡單的數(shù)據(jù)備份

    使用Python實現(xiàn)簡單的數(shù)據(jù)備份

    數(shù)據(jù)備份,即數(shù)據(jù)的復制和存儲,是指將數(shù)據(jù)從一個位置復制到另一個位置,以防止原始數(shù)據(jù)丟失或損壞,下面我們就來了解一下用Python如何實現(xiàn)這一功能吧
    2025-03-03

最新評論

梁平县| 光泽县| 南部县| SHOW| 唐山市| 界首市| 鹿邑县| 彭阳县| 日喀则市| 桐庐县| 哈尔滨市| 炎陵县| 安达市| 张家口市| 临漳县| 玛曲县| 肇庆市| 溆浦县| 甘孜县| 察雅县| 渑池县| 两当县| 怀远县| 昌都县| 新乐市| 水富县| 庆阳市| 罗源县| 独山县| 肥乡县| 怀来县| 安徽省| 河东区| 赣州市| 麦盖提县| 连城县| 莱西市| 日喀则市| 偏关县| 定边县| 安仁县|