一、定义Pytorch模型

本文详细介绍了PyTorch中定义模型的三种方式:Sequential、ModuleList和ModuleDict,以及如何利用它们构建复杂的网络结构,如U-Net模型。通过卷积、池化和全连接层的基础知识,解释了网络模型的工作原理,并展示了如何在PyTorch中修改和扩展模型,包括添加额外输入和输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. PyTorch模型定义的方式

1.1 torch.nn.Sequential

以上两种方式的唯一区别在于:

1.2 torch.nn.ModuleList

1.3 torch.nn.ModuleDict

1.4 实战

2.  用模型块快速搭建复杂网络 

2.1 卷积神经网络基础

2.1.1 卷积层

2.1.2 池化层

2.1.3 全连接层

2.2 U-Net模型

2.3 U-Net模型块分析 

2.4 U-Net模型块实现

2.5 U-Net模型块组装

3. PyTorch修改模型

3.1 修改模型层

3.2  添加外部输入 

3.3 添加额外输出


1. PyTorch模型定义的方式

  • 基于nn.Module,我们可以通过Sequential,ModuleList,ModuleDict三种方式来定义Pytorch模型。
  • torch.nn.Module是所有网络的基类,在Pytorch实现的Model都要继承该类。而且,Module是可以包含其他的Module的,以树形的结构来表示一个网络结构

1.1 torch.nn.Sequential

  • torch.nn.Sequential 类是 torch.nn 中的一种序列容器,通过在容器中嵌套各种实现神经网络中具体功能相关的类,来完成对神经网络模型的搭建,最主要的是,参数会按照我们定义好的序列自动传递下去。
  • 我们可以将嵌套在容器中的各个部分看作是不同的模块,这些模块可以自由组合。

方式一:直接排列

import torch.nn as nn
hidden_layor = 256
input_data = 784
output_data = 10
net = nn.Sequential(
    nn.Linear(input_data,hidden_layor),      #完成从输入层到隐藏层的线性变换
    nn.ReLU(),  #激活层
    nn.Linear(hidden_layor,output_data),  #隐藏层到输出层的线性变换
)
print(net)

 

 方式二:使用OrderDict有序字典进行传入搭建的模型 

hidden_layor = 256
input_data = 784
output_data = 10

import collections
import torch.nn as nn
net2 = nn.Sequential(collections.OrderedDict
                     ([
                         ('Line1',nn.Linear(input_data,hidden_layor)),
                         ('Relu1',nn.ReLU()),
                         ('Line2',nn.Linear(hidden_layor,output_data))
                     ]))
print(net2)

以上两种方式的唯一区别在于:

  • 使用第二种方式搭建的模型,每一个模块都可以自定义名字
  • 第一个方式搭建的模块是默认从0开始的数字序号作为每一个模块的名字

1.2 torch.nn.ModuleList

  • ModuleList是以list的形式保存sub-modules或者网络层,这样就可以先将网络需要的layer构建好保存到一个list,然后通过ModuleList方法添加到网络中。
import torch.nn as nn

hidden_layor = 256
input_data = 784
output_data = 10

net = nn.ModuleList([nn.Linear(input_data,hidden_layor),nn.ReLU()])
net.append(nn.Linear(hidden_layor,output_data))
print(net) # 类似List的索引访问
print(net[0])

nn.ModuleList 并没有定义一个网络,它只是将不同的模块储存在一起。ModuleList中元素的先后顺序并不代表其在网络中的真实位置顺序,需要经过forward函数指定各个层的先后顺序后才算完成了模型的定义。如下:

class model(nn.Module):
    def __init__(self):
        super(model,self).__init__()
        # 构建layer的list
        self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(10)])
    def forward(self,x):
        # 正向传播,使用遍历每个Layer
        for i, l in enumerate(self.linears):
            x = self.linears[i // 2](x) + l(x)
        return x

1.3 torch.nn.ModuleDict

  • ModuleDict和ModuleList的作用类似,只是ModuleDict能够更方便地为神经网络的层添加名称。
import torch.nn as nn

hidden_layor = 256
input_data = 784
output_data = 10

net = nn.ModuleDict({
    'Line1':nn.Linear(input_data,hidden_layor),
    'ReLu':nn.ReLU()})
net['Line2'] = nn.Linear(hidden_layor,output_data)

print(net)
print(net['Line2'])
print(net.Line2)

1.4 实战

import torch
import torch.nn as nn
from torch.autograd import Variable

batch_n = 100   #? 一个批次中输入数据的数量,意味着在一个批次中输入100个数据
hidden_layer = 100
input_data = 1000   #? 1000个特征
output_data = 10

#! 输入输出
x = Variable(torch.randn(batch_n,input_data),requires
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暮棂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值