1. torch.nn.Module
官方文檔:torch.nn.Module
CLASS torch.nn.Module(*args, **kwargs)
- 所有神經(jīng)網(wǎng)絡(luò)模塊的基類。
- 您的模型也應(yīng)該對(duì)此類進(jìn)行子類化。
- 模塊還可以包含其他模塊,允許將它們嵌套在樹(shù)結(jié)構(gòu)中。您可以將子模塊分配為常規(guī)屬性:
training(bool)
-布爾值表示此模塊是處于訓(xùn)練模式還是評(píng)估模式。
定義一個(gè)模型
import torch.nn as nn
import torch.nn.functional as F
class Model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(1, 20, 5)
self.conv2 = nn.Conv2d(20, 20, 5)
def forward(self, x):
x = F.relu(self.conv1(x))
return F.relu(self.conv2(x))
- 以這種方式分配的子模塊將被注冊(cè),并且當(dāng)您調(diào)用
to()
等時(shí)也將轉(zhuǎn)換其參數(shù)。
to(device=None,dtype=None,non_blocking=False)
device ( torch.device) – 該模塊中參數(shù)和緩沖區(qū)所需的設(shè)備to(dtype ,non_blocking=False)
dtype ( torch.dtype) – 該模塊中參數(shù)和緩沖區(qū)所需的浮點(diǎn)或復(fù)雜數(shù)據(jù)類型to(tensor,non_blocking=False)
張量( torch.Tensor ) – 張量,其數(shù)據(jù)類型和設(shè)備是該模塊中所有參數(shù)和緩沖區(qū)所需的數(shù)據(jù)類型和設(shè)備
引用上面定義的模型,將模型轉(zhuǎn)移到GPU上
# 創(chuàng)建模型
model = Model()
# 定義設(shè)備 gpu1
gpu1 = torch.device("cuda:1")
model = model.to(gpu1)
1.1 add_module(name,module)
將子模塊添加到當(dāng)前模塊。
可以使用給定的名稱作為屬性訪問(wèn)模塊。
add_module(name,module)
主要參數(shù):
- name(str)-子模塊的名稱??梢允褂媒o定的名稱從此模塊訪問(wèn)子模塊。
- module(Module)-要添加到模塊的子模塊。
添加一個(gè)卷積層
model.add_module("conv3", nn.Conv2d(20, 20, 5))
1.2 apply(fn)
將 fn 遞歸地應(yīng)用于每個(gè)子模塊(由 .children() 返回)以及self。
典型的用法包括初始化模型的參數(shù)(另請(qǐng)參見(jiàn)torch.nn.init)。
apply(fn)
主要參數(shù):
- fn( Module -> None)-應(yīng)用于每個(gè)子模塊的函數(shù)
將所有線性層的權(quán)重置為1
import torch
from torch import nn
@torch.no_grad()
def init_weights(m):
print(m)
if type(m) == nn.Linear:
m.weight.fill_(1.0)
print(m.weight)
net = nn.Sequential(nn.Linear(2, 2), nn.Linear(2,2))
net.apply(init_weights)
1.3 cpu()
將所有模型參數(shù)和緩沖區(qū)移動(dòng)到CPU。
device = torch.device("cpu")
model = model.to(device)
1.4 cuda(device=None)
將所有模型參數(shù)和緩沖區(qū)移動(dòng)到GPU。
這也使關(guān)聯(lián)的參數(shù)和緩沖區(qū)成為不同的對(duì)象。因此,如果模塊在優(yōu)化時(shí)將駐留在GPU上,則應(yīng)在構(gòu)造優(yōu)化器之前調(diào)用該函數(shù)。
cuda(device=None)
主要參數(shù):
- device(int,可選)-如果指定,所有參數(shù)將被復(fù)制到該設(shè)備
轉(zhuǎn)移到GPU包括以下參數(shù):
- 模型
- 損失函數(shù)
- 輸入輸出
# 創(chuàng)建模型
model = Model()
# 將模型轉(zhuǎn)移到GPU上
model = model.cuda()
# 將損失函數(shù)轉(zhuǎn)移到GPU上
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.cuda()
# 將輸入輸出轉(zhuǎn)移到GPU上
imgs, targets = data
imgs = imgs.cuda()
targets = targets.cuda()
另一種表示形式(通過(guò) to(device)
來(lái)表示)
# 創(chuàng)建模型
model = Model()
# 定義設(shè)備:如果有GPU,則在GPU上訓(xùn)練, 否則在CPU上訓(xùn)練
device = torch.device("cuda" if torch.cuda.is_available else "cpu")
# 將模型轉(zhuǎn)移到GPU上
model = model.to(device)
# 將損失函數(shù)轉(zhuǎn)移到GPU上
loss_fn = nn.CrossEntropyLoss()
loss_fn = loss_fn.to(device)
# 將輸入輸出轉(zhuǎn)移到GPU上
imgs, targets = data
imgs = imgs.to(device)
targets = targets.to(device)
1.5 train()
將模塊設(shè)置為訓(xùn)練模式。
這只對(duì)某些模塊有任何影響。如受影響,請(qǐng)參閱特定模塊在培訓(xùn)/評(píng)估模式下的行為詳情,例如: Dropout 、 BatchNorm 等。
train(mode=True)
主要參數(shù):
- mode(bool)-是否設(shè)置訓(xùn)練模式( True )或評(píng)估模式( False )。默認(rèn)值: True 。
1.6 eval()
將模塊設(shè)置為評(píng)估模式。
這只對(duì)某些模塊有任何影響。如受影響,請(qǐng)參閱特定模塊在培訓(xùn)/評(píng)估模式下的行為詳情,例如: Dropout 、 BatchNorm 等。
在進(jìn)行模型測(cè)試的時(shí)候會(huì)用到。
1.7 state_dict()
返回一個(gè)字典,其中包含對(duì)模塊整個(gè)狀態(tài)的引用。
返回模型的關(guān)鍵字典。
model = Model()
print(model.state_dict().keys())
在保存模型的時(shí)候我們也可以直接保存模型的 state_dict()
model = Model()
# 保存模型
# 另一種方式:torch.save(model, "model.pth")
torch.save(model.state_dict(), "model.pth")
# 加載模型
model.load_state_dict(torch.load("model.pth"))
2. torch.nn.Sequential
順序容器。模塊將按照它們?cè)跇?gòu)造函數(shù)中傳遞的順序添加到它。
Sequential 的 forward() 方法接受任何輸入并將其轉(zhuǎn)發(fā)到它包含的第一個(gè)模塊。然后,它將輸出“鏈接”到每個(gè)后續(xù)模塊的輸入,最后返回最后一個(gè)模塊的輸出。
官方文檔:torch.nn.Sequential
CLASS torch.nn.Sequential(*args: Module)
import torch
from torch import nn
# 使用 Sequential 創(chuàng)建一個(gè)小型模型。運(yùn)行 `model` 時(shí)、
# 輸入將首先傳遞給 `Conv2d(1,20,5)`。輸出
# `Conv2d(1,20,5)`的輸出將作為第一個(gè)
# 第一個(gè) `ReLU` 的輸出將成為 `Conv2d(1,20,5)` 的輸入。
# `Conv2d(20,64,5)` 的輸入。最后
# `Conv2d(20,64,5)` 的輸出將作為第二個(gè) `ReLU` 的輸入
model = nn.Sequential(
nn.Conv2d(1, 20, 5),
nn.ReLU(),
nn.Conv2d(20, 64, 5),
nn.ReLU()
)
2.1 append
append 在末尾追加給定塊。
append(module)
在末尾追加給定模塊。![]()
def append(self, module):
self.add_module(str(len(self)), module)
return self
append(model, nn.Conv2d(64, 64, 5))
append(model, nn.ReLU())
print(model)
3. torch.nn.functional.conv2d
對(duì)由多個(gè)輸入平面組成的輸入圖像應(yīng)用2D卷積。
卷積神經(jīng)網(wǎng)絡(luò)詳解:csdn鏈接
官方文檔:torch.nn.functional.conv2d
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)
主要參數(shù):
- input:形狀的輸入張量,(minibatch, inchannels, iH, iW)。
- weigh:卷積核權(quán)重,形狀為 (out_channels, inchannels / groups, kH, kW)
默認(rèn)參數(shù):
- bias:偏置,默認(rèn)值: None。
- stride:步幅,默認(rèn)值:1。
- padding:填充,默認(rèn)值:0。
- dilation :內(nèi)核元素之間的間距。默認(rèn)值:1。
- groups:將輸入拆分為組,in_channels 應(yīng)被組數(shù)整除。默認(rèn)值:1。
對(duì)上圖卷積操作進(jìn)行代碼實(shí)現(xiàn)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-692109.html
import torch.nn.functional as F
input = torch.tensor([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]], dtype=float32)
kernel = torch.tensor([[0, 1],
[2, 3]], dtype=float32)
# F.conv2d 輸入維數(shù)為4維
# torch.reshape(input, shape)
# reshape(樣本數(shù),通道數(shù),高度,寬度)
input = torch.reshape(input, (1, 1, 3, 3))
kernel = torch.reshape(kernel, (1, 1, 2, 2))
output = F.conv2d(input, kernel, stride=1)
print(input.shape)
print(kernel.shape)
print(input)
print(kernel)
print(output)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-692109.html
到了這里,關(guān)于Pytorch學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)模塊torch.nn.Module和torch.nn.Sequential的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!