pytorch設計模型

2021-09-29 22:30:37 字數 3860 閱讀 5010

1. 

nn.modulelist使對於加入其中的子模組,不必在forward中依次呼叫

nn.sequentialt使對於加入其中的子模組在forward中可以通過迴圈實現呼叫

2. pytorch中nn.modulelist和nn.sequential的用法和區別

nn.sequential定義的網路中各層會按照定義的順序進行級聯,因此需要保證各層的輸入和輸出之間要銜接。並且nn.sequential實現了forward()方法,因此可以直接通過類似於x=self.combine(x)的方式實現forward。而nn.modulelist則沒有順序性要求,並且也沒有實現forward()方法。

1.最直接的宣告

import torch

import torch.nn as nn

from torch.autograd import variable

from collections import ordereddict

class net(nn.module):

def __init__(self):

super(net, self).__init__()

self.fc1 = nn.linear(10,10)

self.relu1 = nn.relu(inplace=true)

self.fc2 = nn.linear(10,2)

def forward(self,x):

x = self.fc1(x)

x = self.relu1(x)

x = self.fc2(x)

return x

2 這是最簡單的定義乙個網路的方法,但是當網路層數過多的時候,這麼寫未免太麻煩,於是pytorch還有第二種定義網路的方法nn.modulelist()

class net(nn.module):

def __init__(self):

super(net, self).__init__()

self.base = nn.modulelist([nn.linear(10,10), nn.relu(), nn.linear(10,2)])

def forward(self,x):

x = self.base(x)

return x

nn.modulelist()接收的引數為乙個list,這樣就可以很方便的定義乙個網路,比如

base = [nn.linear(10,10) for i in range(5)]

net = nn.modulelist(base)

3 最後乙個方法就是nn.sequential()

class net(nn.module):

def __init__(self):

super(net, self).__init__()

self.base = nn.sequential(nn.linear(10,10), nn.relu(), nn.linear(10,2))

def forward(self,x):

x = self.base(x)

return x

當然nn.sequential()還有另外一種用法ordereddict

class multilayernn5(nn.module):

def __init__(self):

super(multilayernn5, self).__init__()

self.base = nn.sequential(ordereddict([

('0', basicconv(1, 16, 5, 1, 2)),

('1', basicconv(16, 32, 5, 1, 2)),

]))self.fc1 = nn.linear(32 * 7 * 7, 10)

def forward(self, x):

x = self.base(x)

x = x.view(x.size(0), -1)

x = self.fc1(x)

return x

除此之外,nn.sequential還能add_module

class multilayernn4(nn.module):

def __init__(self):

super(multilayernn4, self).__init__()

self.base = nn.sequential()

self.base.add_module('0', basicconv(1, 16, 5, 1, 2))

self.base.add_module('1', basicconv(16, 32, 5, 1, 2))

self.fc1 = nn.linear(32 * 7 * 7, 10)

def forward(self, x):

x = self.base(x)

x = x.view(x.size(0),-1)

x = self.fc1(x)

來看一下nn.sequential()以及nn.modulelist()的主要區別,我個人感覺就是nn.sequential()裡面自帶了forward函式,可以直接操作輸入,而nn.modulelist()需要定義乙個forward函式

tt = [nn.linear(10,10), nn.linear(10,2)]

n_1 = nn.sequential(*tt)

n_2 = nn.modulelist(tt)

x = torch.rand([1,10,10])

x = variable(x)

n_1(x)

n_2(x)#會出現notimplementederror

在定義比較深的網路的時候,結合nn.modulelist()以及nn.sequential()在**量上會看上去十分簡潔

這是分割線,最近在看densenet的時候,又學到了一種定義網路的辦法,就是直接繼承nn.sequential

class denselayer(nn.sequential):

def __init__(self):

super(denselayer, self).__init__()

self.add_module("conv1", nn.conv2d(1, 1, 1, 1, 0))

self.add_module("conv2", nn.conv2d(1, 1, 1, 1, 0))

def forward(self, x):

new_features = super(denselayer, self).forward(x)

return torch.cat([x, new_features], 1)

#這個寫法和下面的是一樣的

class denlayer1(nn.module):

def __init__(self):

super(denlayer1, self).__init__()

convs = [nn.conv2d(1, 1, 1, 1, 0), nn.conv2d(1, 1, 1, 1, 0)]

self.conv = nn.sequential(*convs)

def forward(self, x):

return torch.cat([x, self.conv(x)], 1)

net = denlayer1()

x = torch.tensor([[[[1, 2], [3, 4]]]])

print(x)

x = variable(x)

print(net(x))

pytorch 模型設計專題丨

複製層的初始化問題,使用deepcopyimport torch import torch.nn as nn import copy class mymodule nn.module def init self super mymodule,self init self.layer nn.linea...

pytorch 網路模型的設計 與繼承

參考 來自 深度特徵提取入門 1.網路模型 senet 參照 model implement method1 從models庫直接匯出18層 from torchvision import models resnet18 models.resnet18 pretrained 0 print resn...

Pytorch 四 訓練模型

1.在前三部分已經分別完成了資料的處理 神經網路的定義,還有優化器 損失函式的選擇,這次我們將開始學習如何訓練模型。2.模型的訓練其實也是套路,大致分為一下五個部分。1 載入trainloader中的資料,並將其轉換為variable 形式的資料,作為神經網路的輸入。2 每次迴圈開始之前,確保梯度的...