網站首頁 編程語言 正文
在使用pytorch框架時,難免要自己定義網絡。于是,super(XXXX, self).init(),就成了自定義網絡結構時必不可少的第一句。但是,super(XXXX, self).init()具體的作用是什么我一直沒有搞清楚。閱讀了大量的博客后,我終于搞懂了!
一言以蔽之:super(XXX, self).init()——對繼承自父類的屬性進行初始化,并且用父類的初始化方法初始化繼承的屬性。
我們先看一個簡單的例子:
class Person():
? ? def __init__(self, name, gender):
? ? ?? ?# 為name和gender賦值?
? ? ? ? self.name = name
? ? ? ? self.gender = gender
? ? ? ??
? ? def printinfo(self):
? ??
? ? ? ? print(self.name, self.gender)
# Stu類繼承Person類 ? ? ? ?
class Stu(Person):
? ? def __init__(self, name, gender, school):
? ??
? ? ? ? # 使用父類的初始化方法來初始化子類name和gender屬性
? ? ? ? super(Stu, self).__init__(name, gender) ?
? ? ? ??
? ? ? ? self.school = school
? ? ? ??
? ? def printinfo(self): ??
? ? ?? ?# 對父類的printinfo方法進行重寫
? ? ? ?
? ? ? ? print(self.name, self.gender, self.school)?
? ??
if __name__=='__main__':
? ? stu = Stu('Bob', 'female', '5th')
? ? stu.printinfo()
>>>
Bob female 5th
當然,如果初始化的邏輯與父類的不同,不使用父類的方法,自己重新初始化也是可以的。比如:
class Person(object):
? ? def __init__(self, name, gender, age):
? ? ? ? self.name = name
? ? ? ? self.gender = gender
? ? ? ? self.age = age
? ? ? ??
# Student類繼承Person類
class Student(Person):
? ? def __init__(self, name, gender, age, school, score):
? ??
? ? ?? ?# 調用父類的初始化方法,初始化name、gender、age屬性
? ? ? ? super(Student, self).__init__(name,gender, age)
? ? ? ??
? ? ? ? # 對name、gender屬性進行改寫。age屬性仍保持父類的初始化方法
? ? ? ??
? ? ? ? self.name = name.upper() ?# 姓名改為大寫
? ? ? ? self.gender = gender.upper() ?# 性別改為大寫
? ? ? ? self.school = school
? ? ? ? self.score = score
? ? ? ??
s = Student("Alice", "female", "18", "High school", "17")
print(s.name, s.gender, s.school, s.score)
>>>
ALICE FEMALE High school 17
在理解了上面的小例子后,我們再仔細研究一下機器學習中的代碼:
class Net(nn.Module): # 繼承自nn.Moudle
? ? def __init__(self):
? ??
? ? ? ? super(Net, self).__init__()
? ? ? ? # 輸入圖像channel:1;輸出channel:6;5x5卷積核
? ? ? ? self.conv1 = nn.Conv2d(1, 6, 5)
super(Net, self).init()的含義:子類Net類繼承父類nn.Module,super(Net, self).init()就是對繼承自父類nn.Module的屬性進行初始化。并且是用nn.Module的初始化方法來初始化繼承的屬性。
也就是:用父類的方法初始化子類的屬性。
有的人肯定會問,為啥要用父類的方法去初始化屬性呢?原因很簡單:就是因為父類的方法已經寫好了,我們只需要調用就可以了。難道你還想自己寫一堆代碼去初始化各種權重和參數,處理一堆forward和backward的邏輯嗎?
最后,多一句嘴,介紹一寫在python中__init()的作用
在python中創建類后,通常會創建一個 init__ ()方法,這個方法會在創建類的實例的時候自動執行。
實例1:【實例化Bob這個對象的時候, __ init__ ()方法會自動執行】:
在下面的示例中,我們在實例化Bob這個對象的時候, __ init__ ()方法就已經自動執行了,如果不是__ init__ ()方法,比如說eat()方法,那就只有在調用時才會執行。
class Person():
? ? def __init__(self):
? ? ? ? print("是一個人")
? ? def eat(self):
? ? ? ? print("要吃飯")
? ? ? ??
Bob = Person()
>>>
是一個人
【實例2】哪些需放入__ init__ ()方法中,哪些不需要???
需要在 __ init__ ()方法中定義:希望有一些操作是在創建實例的時候就自動創建的。在神經網絡代碼中,一些網絡結構的設置,也最好放在 __ init__ ()方法中。
在下述代碼中,我們把money這個屬性也定義在__ init__ ()方法中,這樣就不需要在執行eat()方法后再執行qian()方法。
class Person():
? ? def __init__(self, name,money):
? ? ? ? print("是一個人")
? ? ? ? self.name = name
? ? ? ? self.money = money
? ? def eat(self):
? ? ? ? print("%s要吃飯" % self.name)
? ? def qian(self):
? ? ? ? print("花了%s元" % self.money)
Bob = Person("Bob",12)
Bob.eat()
Bob.qian()
>>>
是一個人
Bob要吃飯
花了12元
原文鏈接:https://blog.csdn.net/weixin_44025103/article/details/126143715
相關推薦
- 2022-10-12 Docker部署搭建WebDav服務的詳細過程_docker
- 2021-12-16 jquery+swiper組件實現時間軸滑動年份tab切換效果_jquery
- 2023-05-23 Golang拾遺之實現一個不可復制類型詳解_Golang
- 2022-07-23 C#中的隨機數函數Random()_C#教程
- 2023-04-12 Android同步屏障機制sync?barrier實例應用詳解_Android
- 2024-03-16 nginx 報 unknown directive “server“ 詭異問題處理
- 2022-08-25 R語言多元線性回歸實例詳解_R語言
- 2022-12-06 C#實現跑馬燈效果的示例代碼_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支