日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

(pytorch-深度学习系列)pytorch构造深度学习模型-学习笔记

發(fā)布時(shí)間:2024/8/23 pytorch 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (pytorch-深度学习系列)pytorch构造深度学习模型-学习笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

pytorch構(gòu)造深度學(xué)習(xí)模型

1. 通過繼承module類的方式來構(gòu)造模型

Module類是nn模塊里提供的一個(gè)模型構(gòu)造類,是所有神經(jīng)網(wǎng)絡(luò)模塊的基類。
可以繼承基類并重構(gòu) __init()__函數(shù)和forward()forward()forward()函數(shù)的方式來構(gòu)造模型。

以下是一個(gè)構(gòu)造一個(gè)模型的例子:

import torch from torch import nnclass MLP(nn.Module):# 聲明帶有模型參數(shù)的層,這里聲明了兩個(gè)全連接層def __init__(self, **kwargs):# 調(diào)用MLP父類Module的構(gòu)造函數(shù)來進(jìn)行必要的初始化。這樣在構(gòu)造實(shí)例時(shí)還可以指定其他函數(shù)super(MLP, self).__init__(**kwargs)self.hidden = nn.Linear(784, 256) # 隱藏層self.act = nn.ReLU()self.output = nn.Linear(256, 10) # 輸出層# 定義模型的前向計(jì)算,即如何根據(jù)輸入x計(jì)算返回所需要的模型輸出def forward(self, x):a = self.act(self.hidden(x))return self.output(a)

實(shí)例化剛剛構(gòu)建的MLP類得到模型變量net,net(X)會(huì)調(diào)用MLP繼承自Module類的__call__函數(shù),這個(gè)函數(shù)將調(diào)用MLP類定義的forward函數(shù)來完成前向計(jì)算。

X = torch.rand(2, 784) net = MLP() print(net) net(X)

2. 通過Sequential類定義簡(jiǎn)單的模型

如果定義的模型的前向計(jì)算就是簡(jiǎn)單的串聯(lián)各層的計(jì)算時(shí),可以通過Sequential類快速定義模型。它可以接收一個(gè)子模塊的有序字典(OrderedDict)或者一系列子模塊作為參數(shù)來逐一添加Module的實(shí)例,而模型的前向計(jì)算就是將這些實(shí)例按添加的順序逐一計(jì)算。

定義一個(gè)與Sequential類有相同功能的類:ep_sequential來解讀Sequential類的工作機(jī)制:

class ep_sequential(nn.Module):from collections import OrderedDictdef __init__(self, *args):super(ep_sequential, self).__init__()if len(args) == 1 and isinstance(args[0], OrderedDict): # 如果傳入的是一個(gè)OrderedDictfor key, module in args[0].items():self.add_module(key, module) # add_module方法會(huì)將module添加進(jìn)self._modules(一個(gè)OrderedDict)else: # 傳入的是一些Modulefor idx, module in enumerate(args):self.add_module(str(idx), module)def forward(self, input):# self._modules返回一個(gè) OrderedDict,保證會(huì)按照成員添加時(shí)的順序遍歷成員for module in self._modules.values():input = module(input)return input

這里通過forward函數(shù)就可以看出Sequential類實(shí)現(xiàn)的是簡(jiǎn)單的串聯(lián)各層

net = ep_equential(nn.Linear(128, 256),nn.ReLU(),nn.Linear(256, 10), ) print(net) net(X)

3. 使用ModuleList類

ModuleList接收一個(gè)子模塊的列表作為輸入,可以像List那樣進(jìn)行append和extend操作:

net = nn.ModuleList([nn.Linear(128, 256), nn.ReLU()]) net.append(nn.Linear(256, 10)) # # 類似List的append操作 print(net[-1]) # 類似List的索引訪問 print(net) # net(torch.zeros(1, 128)) # 會(huì)報(bào)NotImplementedError

ModuleList僅僅是一個(gè)儲(chǔ)存各種模塊的列表,這些模塊之間沒有聯(lián)系也沒有順序(所以不用保證相鄰層的輸入輸出維度匹配),而且沒有實(shí)現(xiàn)forward功能需要自己實(shí)現(xiàn),所以上面執(zhí)行net(torch.zeros(1, 128))會(huì)報(bào)NotImplementedError;而Sequential內(nèi)的模塊需要按照順序排列,要保證相鄰層的輸入輸出大小相匹配,內(nèi)部forward功能已經(jīng)實(shí)現(xiàn)。

這是官網(wǎng)的例子:

class MyModule(nn.Module):def __init__(self):super(MyModule, self).__init__()self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])def forward(self, x):# ModuleList can act as an iterable, or be indexed using intsfor i, l in enumerate(self.linears):x = self.linears[i // 2](x) + l(x)return x

但是,ModuleList并不是一般的list,加入到ModuleList里的所有模塊的參數(shù)會(huì)被自動(dòng)添加到網(wǎng)絡(luò)中。
下面的例子進(jìn)行了對(duì)比:

class Module_ModuleList(nn.Module):def __init__(self):super(Module_ModuleList, self).__init__()self.linears = nn.ModuleList([nn.Linear(10, 10)])class Module_List(nn.Module):def __init__(self):super(Module_List, self).__init__()self.linears = [nn.Linear(10, 10)]net1 = Module_ModuleList() net2 = Module_List()print("net1:") for p in net1.parameters():print(p.size())print("net2:") for p in net2.parameters():print(p)

輸出:

net1: torch.Size([10, 10]) torch.Size([10]) net2:

從結(jié)果可以看出,使用ModuleList 初始化網(wǎng)絡(luò)層,那么該層參數(shù)就會(huì)被自動(dòng)加入調(diào)用ModuleList的網(wǎng)絡(luò)的模型中。

4. 使用ModuleDict類

ModuleDict接收一個(gè)子模塊的字典作為輸入, 類似ModuleList,可以像字典那樣進(jìn)行添加訪問操作:

net = nn.ModuleDict({'linear': nn.Linear(128, 256),'act': nn.ReLU(), }) net['output'] = nn.Linear(256, 10) # 添加 print(net['linear']) # 訪問 print(net.output) print(net) # net(torch.zeros(1, 128)) # 會(huì)報(bào)NotImplementedError

和ModuleList一樣,ModuleDict實(shí)例僅僅是存放了一些模塊的字典,并沒有定義forward函數(shù)。同樣,ModuleDict也與Python的普通的Dict不同,ModuleDict里的所有模塊的參數(shù)會(huì)被自動(dòng)添加到整個(gè)網(wǎng)絡(luò)中。

總結(jié)

以上是生活随笔為你收集整理的(pytorch-深度学习系列)pytorch构造深度学习模型-学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。