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

關(guān)于PyTorch中nn.Module類的簡介

 更新時間:2023年02月20日 08:41:18   作者:fengbingchun  
這篇文章主要介紹了關(guān)于PyTorch中nn.Module類的簡介,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

PyTorch nn.Module類的簡介

torch.nn.Module類是所有神經(jīng)網(wǎng)絡(luò)模塊(modules)的基類,它的實現(xiàn)在torch/nn/modules/module.py中。你的模型也應(yīng)該繼承這個類,主要重載__init__、forward和extra_repr函數(shù)。Modules還可以包含其它Modules,從而可以將它們嵌套在樹結(jié)構(gòu)中。

只要在自己的類中定義了forward函數(shù),backward函數(shù)就會利用Autograd被自動實現(xiàn)。只要實例化一個對象并傳入對應(yīng)的參數(shù)就可以自動調(diào)用forward函數(shù)。因為此時會調(diào)用對象的__call__方法,而nn.Module類中的__call__方法會調(diào)用forward函數(shù)。

nn.Module類中函數(shù)介紹:

  • __init__:初始化內(nèi)部module狀態(tài)。
  • register_buffer:向module添加buffer,不作為模型參數(shù),可作為module狀態(tài)的一部分。默認(rèn)情況下,buffer是持久(persistent)的,將與參數(shù)一起保存。buffer是否persistent的區(qū)別在于這個buffer是否被放入self.state_dict()中被保存下來。
  • register_parameter:向module添加參數(shù)。
  • add_module:添加一個submodule(children)到當(dāng)前module中。
  • apply:將fn遞歸應(yīng)用于每個submodule(children),典型用途為初始化模型參數(shù)。
  • cuda:將所有模型參數(shù)和buffers轉(zhuǎn)移到GPU上。
  • xpu:將所有模型參數(shù)和buffers轉(zhuǎn)移到XPU上。
  • cpu:將所有模型參數(shù)和buffers轉(zhuǎn)移到CPU上。
  • type:將所有參數(shù)和buffers轉(zhuǎn)換為所需的類型。
  • float:將所有浮點(diǎn)參數(shù)和buffers轉(zhuǎn)換為float32數(shù)據(jù)類型。
  • double:將所有浮點(diǎn)參數(shù)和buffers轉(zhuǎn)換為double數(shù)據(jù)類型。
  • half:將所有浮點(diǎn)參數(shù)和buffers轉(zhuǎn)換為float16數(shù)據(jù)類型。
  • bfloat16:將所有浮點(diǎn)參數(shù)和buffers轉(zhuǎn)換為bfloat16數(shù)據(jù)類型。
  • to:將參數(shù)和buffers轉(zhuǎn)換為指定的數(shù)據(jù)類型或轉(zhuǎn)換到指定的設(shè)備上。
  • register_backward_hook:在module中注冊一個反向鉤子。不推薦使用。
  • register_full_backward_hook:在module中注冊一個反向鉤子。每次計算梯度時都會調(diào)用此鉤子。使用此鉤子時不允許就地(in place)修改輸入或輸出,否則會觸發(fā)error。
  • register_forward_pre_hook:在module中注冊前向pre-hook。每次調(diào)用forward之前都會調(diào)用此鉤子。
  • register_forward_hook:在module中注冊一個前向鉤子。每次forward計算輸出后都會調(diào)用此鉤子。
  • state_dict:返回包含了module的整個狀態(tài)的字典。其中keys是對應(yīng)的參數(shù)和buffer名稱。
  • load_state_dict:將參數(shù)和buffers從state_dict復(fù)制到module及其后代(descendants)中。
  • parameters:返回module的參數(shù)的迭代器。
  • named_parameters:返回module的參數(shù)的迭代器,產(chǎn)生(yield)參數(shù)的名稱以及參數(shù)本身。不會返回重復(fù)的parameter。
  • buffers:返回module的buffers的迭代器。
  • named_buffers:返回module的buffers的迭代器,產(chǎn)生(yield)buffer的名稱以及buffer本身。不會返回重復(fù)的buffer。
  • children:返回直接子module的迭代器。
  • named_children:返回直接子module的迭代器,產(chǎn)生(yield)子module的名稱以及子module本身。不會返回重復(fù)的children。
  • modules:返回網(wǎng)絡(luò)中所有modules的迭代器。
  • named_modules:返回網(wǎng)絡(luò)中所有modules的迭代器,產(chǎn)生(yield)module的名稱以及module本身。不會返回重復(fù)的module。
  • train:將module設(shè)置為訓(xùn)練模式。這僅對某些module起作用。module.py實現(xiàn)中會修改self.training并通過self.children()來調(diào)整所有submodule的狀態(tài)。
  • eval:將module設(shè)置為評估模式。這僅對某些module起作用。module.py實現(xiàn)中直接調(diào)用train(False)。
  • requires_grad_:更改autograd是否應(yīng)記錄對此module中參數(shù)的操作。此方法就地(in place)設(shè)置參數(shù)的requires_grad屬性。
  • zero_grad:將所有模型參數(shù)的梯度設(shè)置為零。
  • extra_repr:設(shè)置module的額外表示。你應(yīng)該在自己的modules中重新實現(xiàn)此方法。

測試代碼如下:

import torch
import torch.nn as nn
import torch.nn.functional as F # nn.functional.py中存放激活函數(shù)等的實現(xiàn)
?
@torch.no_grad()
def init_weights(m):
? ? print("xxxx:", m)
? ? if type(m) == nn.Linear:
? ? ? ? ?m.weight.fill_(1.0)
? ? ? ? ?print("yyyy:", m.weight)
?
class Model(nn.Module):
? ? def __init__(self):
? ? ? ? # 在實現(xiàn)自己的__init__函數(shù)時,為了正確初始化自定義的神經(jīng)網(wǎng)絡(luò)模塊,一定要先調(diào)用super().__init__
? ? ? ? super(Model, self).__init__()
? ? ? ? self.conv1 = nn.Conv2d(1, 20, 5) # submodule(child module)
? ? ? ? self.conv2 = nn.Conv2d(20, 20, 5)
? ? ? ? self.add_module("conv3", nn.Conv2d(10, 40, 5)) # 添加一個submodule到當(dāng)前module,等價于self.conv3 = nn.Conv2d(10, 40, 5)
? ? ? ? self.register_buffer("buffer", torch.randn([2,3])) # 給module添加一個presistent(持久的) buffer
? ? ? ? self.param1 = nn.Parameter(torch.rand([1])) # module參數(shù)的tensor
? ? ? ? self.register_parameter("param2", nn.Parameter(torch.rand([1]))) # 向module添加參數(shù)
?
? ? ? ? # nn.Sequential: 順序容器,module將按照它們在構(gòu)造函數(shù)中傳遞的順序添加,它允許將整個容器視為單個module
? ? ? ? self.feature = nn.Sequential(nn.Linear(2, 2), nn.Linear(2, 2))
? ? ? ? self.feature.apply(init_weights) # 將fn遞歸應(yīng)用于每個submodule,典型用途為初始化模型參數(shù)
? ? ? ? self.feature.to(torch.double) # 將參數(shù)數(shù)據(jù)類型轉(zhuǎn)換為double
? ? ? ? cpu = torch.device("cpu")
? ? ? ? self.feature.to(cpu) # 將參數(shù)數(shù)據(jù)轉(zhuǎn)換到cpu設(shè)備上
?
? ? def forward(self, x):
? ? ? ?x = F.relu(self.conv1(x))
? ? ? ?return F.relu(self.conv2(x))
?
model = Model()
print("## Model:", model)
?
model.cpu() # 將所有模型參數(shù)和buffers移動到CPU上
model.float() # 將所有浮點(diǎn)參數(shù)和buffers轉(zhuǎn)換為float數(shù)據(jù)類型
model.zero_grad() # 將所有模型參數(shù)的梯度設(shè)置為零
?
# state_dict:返回一個字典,保存著module的所有狀態(tài),參數(shù)和persistent buffers都會包含在字典中,字典的key就是參數(shù)和buffer的names
print("## state_dict:", model.state_dict().keys())
?
for name, parameters in model.named_parameters(): # 返回module的參數(shù)(weight and bias)的迭代器,產(chǎn)生(yield)參數(shù)的名稱以及參數(shù)本身
? ? print(f"## named_parameters: name: {name}; parameters size: {parameters.size()}")
?
for name, buffers in model.named_buffers(): # 返回module的buffers的迭代器,產(chǎn)生(yield)buffer的名稱以及buffer本身
? ? print(f"## named_buffers: name: {name}; buffers size: {buffers.size()}")
?
# 注:children和modules中重復(fù)的module只被返回一次
for children in model.children(): # 返回當(dāng)前module的child module(submodule)的迭代器
? ? print("## children:", children)
?
for name, children in model.named_children(): # 返回直接submodule的迭代器,產(chǎn)生(yield) submodule的名稱以及submodule本身
? ? print(f"## named_children: name: {name}; children: {children}")
?
for modules in model.modules(): # 返回當(dāng)前模型所有module的迭代器,注意與children的區(qū)別
? ? print("## modules:", modules)
?
for name, modules in model.named_modules(): # 返回網(wǎng)絡(luò)中所有modules的迭代器,產(chǎn)生(yield)module的名稱以及module本身,注意與named_children的區(qū)別
? ? print(f"## named_modules: name: {name}; module: {modules}")
?
model.train() # 將module設(shè)置為訓(xùn)練模式
model.eval() # 將module設(shè)置為評估模式
?
print("test finish")

GitHub:https://github.com/fengbingchun/PyTorch_Test

PyTorch中nn.Module理解

nn.Module是Pytorch封裝的一個類,是搭建神經(jīng)網(wǎng)絡(luò)時需要繼承的父類:

import torch
import torch.nn as nn

# 括號中加入nn.Module(父類)。Test2變成子類,繼承父類(nn.Module)的所有特性。
class Test2(nn.Module):  
    def __init__(self):  # Test2類定義初始化方法
       super(Test2, self).__init__()  # 父類初始化
       self.M = nn.Parameter(torch.ones(10))
        
    def weightInit(self):
        print('Testing')

    def forward(self, n):
        # print(2 * n)
        print(self.M * n)
        self.weightInit()

# 調(diào)用方法
network = Test2()
network(2)  # 2賦值給forward(self, n)中的n。
……省略一部分代碼……
# 因為Test2是nn.Module的子類,所以也可以執(zhí)行父類中的方法。如:
model_dict = network.state_dict()  # 調(diào)用父類中的方法state_dict(),將Test2中訓(xùn)練參數(shù)賦值model_dict。
for k, v in model_dict.items():  # 查看自己網(wǎng)絡(luò)參數(shù)各層名稱、數(shù)值
	print(k)  # 輸出網(wǎng)絡(luò)參數(shù)名字
    # print(v)  # 輸出網(wǎng)絡(luò)參數(shù)數(shù)值

繼承nn.Module的子類程序是從forward()方法開始執(zhí)行的,如果要想執(zhí)行其他方法,必須把它放在forward()方法中。這一點(diǎn)與python中繼承有稍許的不同。

總結(jié)

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

相關(guān)文章

  • 使用Python獲取Word文檔關(guān)鍵信息

    使用Python獲取Word文檔關(guān)鍵信息

    計算 Word 文檔的頁數(shù)、字?jǐn)?shù)等信息是出版、學(xué)術(shù)和內(nèi)容管理等領(lǐng)域的一項基本任務(wù),本文介紹了使用Python直接獲取Word文檔頁數(shù)、字?jǐn)?shù)、段落數(shù)、節(jié)數(shù)等信息的方法,希望對大家有所幫助
    2024-03-03
  • Python中類的mro與繼承關(guān)系詳解(二)

    Python中類的mro與繼承關(guān)系詳解(二)

    這篇文章主要介紹了Python中類的mro與繼承關(guān)系詳解,上一篇我們已經(jīng)通過mro相關(guān)資料介紹了mro繼承關(guān)系的基礎(chǔ)內(nèi)容,這片緊接著上一篇文章展開詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2022-07-07
  • 讓Django的BooleanField支持字符串形式的輸入方式

    讓Django的BooleanField支持字符串形式的輸入方式

    這篇文章主要介紹了讓Django的BooleanField支持字符串形式的輸入方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python3庫numpy數(shù)組屬性的查看方法

    python3庫numpy數(shù)組屬性的查看方法

    下面小編就為大家分享一篇python3庫numpy數(shù)組屬性的查看方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python IDE Pycharm中的快捷鍵列表用法

    Python IDE Pycharm中的快捷鍵列表用法

    在本篇文章里小編給大家整理的是關(guān)于Python IDE Pycharm中的快捷鍵列表用法,需要的朋友們收藏下
    2019-08-08
  • python操作xlsx格式文件并讀取

    python操作xlsx格式文件并讀取

    python操作xlsx格式文件是比較常見的一個問題,本文給大家介紹xlrd庫讀取,pandas庫讀取的實例代碼,給大家講解的很詳細(xì),需要的朋友跟隨小編一起看看吧
    2021-06-06
  • Python如何輸出百分比

    Python如何輸出百分比

    這篇文章主要介紹了Python 如何輸出百分比,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Python實現(xiàn)Const詳解

    Python實現(xiàn)Const詳解

    這篇文章主要介紹了Python實現(xiàn)Const的方法的相關(guān)資料,需要的朋友可以參考下
    2015-01-01
  • python屬于解釋型語言么

    python屬于解釋型語言么

    在本篇文章里小編給大家整理了關(guān)于python是否屬于解釋型語言的相關(guān)知識點(diǎn)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • Python數(shù)據(jù)結(jié)構(gòu)集合set教程示例詳解

    Python數(shù)據(jù)結(jié)構(gòu)集合set教程示例詳解

    這篇文章主要為大家介紹了Python數(shù)據(jù)結(jié)構(gòu)集合set教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評論

SHOW| 马边| 南京市| 通江县| 财经| 洛浦县| 星座| 垣曲县| 姚安县| 洛宁县| 三明市| 河北省| 百色市| 莲花县| 博客| 增城市| 普兰店市| 阳泉市| 崇左市| 牟定县| 通榆县| 沙河市| 鹤峰县| 西丰县| 邵阳市| 谢通门县| 南川市| 阳高县| 河南省| 环江| 霞浦县| 扶绥县| 涟水县| 张家界市| 伊金霍洛旗| 大余县| 甘孜县| 康乐县| 扎鲁特旗| 高唐县| 涪陵区|