使用nn.Sequential()对象和nn.ModuleList建立模型

简介: 使用nn.Sequential()对象和nn.ModuleList建立模型

1、使用nn.Sequential()建立模型的三种方式

import torch as t
from torch import nn
# Sequential的三种写法
net1 = nn.Sequential()
net1.add_module('conv', nn.Conv2d(3, 3, 3))  # Conv2D(输入通道数,输出通道数,卷积核大小)
net1.add_module('batchnorm', nn.BatchNorm2d(3))  # BatchNorm2d(特征数)
net1.add_module('activation_layer', nn.ReLU())
net2 = nn.Sequential(nn.Conv2d(3, 3, 3),
                     nn.BatchNorm2d(3),
                     nn.ReLU()
                     )
from collections import OrderedDict
#注意字典的key不能重复
net3 = nn.Sequential(OrderedDict([
    ('conv1', nn.Conv2d(3, 3, 3)),
    ('bh1', nn.BatchNorm2d(3)),
    ('al', nn.ReLU())
]))
print('net1', net1)
print('net2', net2)
print('net3', net3)
# 可根据名字或序号取出子module
print(net1.conv, net2[0], net3.conv1)

输出:

net1 Sequential(
  (conv): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
  (batchnorm): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (activation_layer): ReLU()
)
net2 Sequential(
  (0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
  (1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (2): ReLU()
)
net3 Sequential(
  (conv1): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))
  (bh1): BatchNorm2d(3, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  (al): ReLU()
)
Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1)) Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1)) Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))

2、使用nn.ModuleList建立模型。

class MyModule(nn.Module):

   def __init__(self):

       super(MyModule, self).__init__()

       self.list = [nn.Linear(3, 4), nn.ReLU()]

       self.module_list = nn.ModuleList([nn.Conv2d(3, 3, 3), nn.ReLU()])

   def forward(self):

       pass

model = MyModule()

print(model)

输出:


MyModule(

 (module_list): ModuleList(

   (0): Conv2d(3, 3, kernel_size=(3, 3), stride=(1, 1))

   (1): ReLU()

 )

)

3、二者结合构造更复杂的网络模型


例如cisnet中的Decoder模型

class Decoder(nn.Module):
    num_quan_bits = 4
    def __init__(self, feedback_bits):
        super(Decoder, self).__init__()
        self.feedback_bits = feedback_bits
        self.dequantize = DequantizationLayer(self.num_quan_bits)
        self.multiConvs = nn.ModuleList()
        self.fc = nn.Linear(int(feedback_bits / self.num_quan_bits), 768)
        self.out_cov = conv3x3(2, 2)
        self.sig = nn.Sigmoid()
        for _ in range(3):
            self.multiConvs.append(nn.Sequential(
                conv3x3(2, 8),
                nn.ReLU(),
                conv3x3(8, 16),
                nn.ReLU(),
                conv3x3(16, 2),
                nn.ReLU()))
    def forward(self, x):
        out = self.dequantize(x)
        out = out.contiguous().view(-1, int(self.feedback_bits / self.num_quan_bits)) #需使用contiguous().view(),或者可修改为reshape
        out = self.sig(self.fc(out))
        out = out.contiguous().view(-1, 2, 24, 16) #需使用contiguous().view(),或者可修改为reshape
        for i in range(3):
            residual = out
            out = self.multiConvs[i](out)
            out = residual + out
        out = self.out_cov(out)
        out = self.sig(out)
        out = out.permute(0, 2, 3, 1)
        return out
目录
相关文章
|
2月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
PyTorch中的`nn.AdaptiveAvgPool2d()`函数用于实现自适应平均池化,能够将输入特征图调整到指定的输出尺寸,而不需要手动计算池化核大小和步长。
165 1
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
|
2月前
|
机器学习/深度学习 PyTorch TensorFlow
Pytorch学习笔记(二):nn.Conv2d()函数详解
这篇文章是关于PyTorch中nn.Conv2d函数的详解,包括其函数语法、参数解释、具体代码示例以及与其他维度卷积函数的区别。
234 0
Pytorch学习笔记(二):nn.Conv2d()函数详解
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch学习笔记(八):nn.ModuleList和nn.Sequential函数详解
PyTorch中的nn.ModuleList和nn.Sequential函数,包括它们的语法格式、参数解释和具体代码示例,展示了如何使用这些函数来构建和管理神经网络模型。
124 1
|
7月前
|
机器学习/深度学习 人工智能 PyTorch
基于torch.nn.Dropout通过实例说明Dropout丢弃法(附代码)
基于torch.nn.Dropout通过实例说明Dropout丢弃法(附代码)
170 0
|
PyTorch 算法框架/工具
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
521 2
PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch torch.nn库以及nn与nn.functional有什么区别?
Pytorch torch.nn库以及nn与nn.functional有什么区别?
111 0
|
存储 PyTorch 算法框架/工具
PyTorch模型创建与nn.Module
PyTorch模型创建与nn.Module
118 1
|
资源调度 PyTorch 算法框架/工具
介绍一下nn.BCEWithLogitsLoss()
nn.BCEWithLogitsLoss()是PyTorch中用于二元分类问题的损失函数之一,它是一种基于sigmoid函数的交叉熵损失函数,可用于处理具有多个标签的多标签分类问题。
2210 0
|
机器学习/深度学习 PyTorch 算法框架/工具
Pytorch中使用torch.nn模块进行神经网络模型初步构造
Pytorch中使用torch.nn模块进行神经网络模型初步构造
125 0
Pytorch中使用torch.nn模块进行神经网络模型初步构造
|
机器学习/深度学习 异构计算
【7】nn.module使用与数据增强
【7】nn.module使用与数据增强
186 0
【7】nn.module使用与数据增强