PyTorch学习(4):模型

2023-05-16

PyTorch学习(4):模型

  • Pytorch官方文档: https://pytorch-cn.readthedocs.io/zh/latest/
  • Pytorch学习文档: https://github.com/tensor-yu/PyTorch_Tutorial
  • Pytorch模型库: https://github.com/pytorch/vision/tree/master/torchvision/models
  • 参考: https://zhuanlan.zhihu.com/p/27401516
        https://pytorch.org/docs/stable/nn.html
        https://zhuanlan.zhihu.com/p/373150763
        https://blog.csdn.net/pipisorry/article/details/109191793

文章目录

  • PyTorch学习(4):模型
  • 前言
    • 1.基础模型搭建
    • 2.nn.Sequential模型搭建
    • 3.Container模型搭建
        • 1)适用场景
        • 2)容器特点
    • 4.PyTorch官方模型搭建
    • 5.模型参数
        • (1)model.named_parameters
        • (2)model.parameters
        • (3)model.state_dict
  • 总结


前言

卷积神经网络通常由三部分构成。第一部分是输入层。第二部分由n个卷积层和池化层的组合构成。第三部分由一个全连结的多层感知机分类器构成。


1.基础模型搭建

在PyTorch里面编写神经网络,所有的层结构和损失函数都来自于torch.nn,所有的模型构建都继承nn.Module这个基类,于是有了下面的这个模板。

import torch.nn as nn
import torch.nn.functional as F

class Model(nn.Module):
    def __init__(self, other_arguments=None):
        super(Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 20, 5)
        self.conv2 = nn.Conv2d(20, 64, 5)
        # other network layer

    def forward(self, x):
        x = F.relu(self.conv1(x))
        return F.relu(self.conv2(x))

net = Model()
print(net)
Model(
  (conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
  (conv2): Conv2d(20, 20, kernel_size=(5, 5), stride=(1, 1))
)

这样就建立了一个计算图,并且这个结构可以复用多次,每次调用就相当于用该计算图定义的参数做一次前向传播,这得益于PyTorch的自动求导功能,所以不需要手动编写反向传播,所有的网络层都由nn这个包提供,可参考官方文档查看详细内容。
官方文档链接: https://pytorch.org/docs/stable/nn.html

2.nn.Sequential模型搭建

此外,还可以使用torch.nn.Sequential,更方便进行模块化的定义,torch.nn.Sequential 其实就是Sequential容器,该容器将一系列操作按先后顺序给包起来,方便重复使用,所以必须确保前一个模块的输出大小和下一个模块的输入大小是一致的。
示例如下:

#首先导入torch相关包
import torch
import torch.nn as nn

class net_seq(nn.Module):
    def __init__(self):
        super(net_seq, self).__init__()
        self.seq = nn.Sequential(
                        nn.Conv2d(1,20,5),
                        nn.ReLU(),
                        nn.Conv2d(20,64,5),
                        nn.ReLU()
                        )      
    def forward(self, x):
        return self.seq(x)
net_seq = net_seq()
print(net_seq)
net_seq(
  (seq): Sequential(
    (0): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
    (1): ReLU()
    (2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
    (3): ReLU()
  )
)

注: nn.Sequential中可以使用OrderedDict来指定每个module的名字,而不是采用默认的命名方式(按序号 0,1,2,3…)。例子如下:

import torch
import torch.nn as nn
from collections import OrderedDict

class net_seq(nn.Module):
    def __init__(self):
        super(net_seq, self).__init__()
        self.seq = nn.Sequential(OrderedDict([
                        ('conv1', nn.Conv2d(1,20,5)),
                        ('relu1', nn.ReLU()),
                        ('conv2', nn.Conv2d(20,64,5)),
                        ('relu2', nn.ReLU())
                           ]))
    def forward(self, x):
        return self.seq(x)
net_seq = net_seq()
print(net_seq)                     
net_seq(
  (seq): Sequential(
    (conv1): Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1))
    (relu1): ReLU()
    (conv2): Conv2d(20, 64, kernel_size=(5, 5), stride=(1, 1))
    (relu2): ReLU()
  )
)

3.Container模型搭建

PyTorch中提供了一些便于用户构建神经网络的Containers即容器,比较常见的有Module、 ModuleList、Sequential和ModuleDict等。Module是构建神经网络的基类。一个神经网络模型可以包含PyTorch提供的各种Layer,也可以包含容器,如ModuleList、ModuleDict等。
Containers链接: https://pytorch.org/docs/stable/nn.html#containers

1)适用场景

  (1)当用于大量重复Layer构建时(常用for循环),推荐使用ModuleList实现网络结构。
  (2)当网络中Layer严格按顺序执行(常用于block构建),推荐使用Sequential实现网络结构。
  (3)当需要可选择的网络Layer时,推荐使用ModuleDict实现网络结构。
  (4)当需要记录每个Layer的输出信息或在Layer之间进行跳跃连接(skip connection),即当需要定制化forward函数中各Layer的数据流入时,推荐使用ModuleList实现网络结构。

2)容器特点

ModuleList和ModuleDict中各Layer的参数已被自动注册;
ModuleList中各Layer的顺序并不是网络的执行顺序,网络的执行顺序由forward函数定义的数据流方向决定;
Sequential中Layer的顺序表示网络的执行顺序;

当网络具有“索引”特性时,推荐使用ModuleDict
当网络具有“顺序”特性时,推荐使用Sequential
当网络具有“重复”特性时 或 需要定制化forward函数中各Layer的数据流入时或Layer之间存在skip connection时,推荐使用ModuleList

4.PyTorch官方模型搭建

PyTorch官方提供了常见的开源模型结构,可直接使用,并且提供了预训练模型,可帮助进行迁移学习。
预训练模型: https://github.com/pytorch/vision/tree/master/torchvision/models
预训练模型包括:
  AlexNet、DenseNet、GoogleNet、Inception、mnasNet、MobileNet、ResNet、ShuffleNet、SqueezeNet、VGGNet等等。

5.模型参数

网络结构Module包含很多属性,可以查看权重、参数等等。迭代训练的过程就是不断更新模型中的权重,来拟合训练数据的分布情况。

(1)model.named_parameters

  迭代model.named_parameters(),将会输出每一次迭代元素的名字和param。

for name, param in model.named_parameters():
    print(name,param.requires_grad)
    param.requires_grad=False

(2)model.parameters

  迭代model.parameters(),将会输出每一次迭代元素的param而不会打印名字,这是它和named_parameters的区别,两者都可以用来改变requires_grad的属性。

for param in model.parameters():
    print(param.requires_grad)
    param.requires_grad=False

(3)model.state_dict

  model.state_dict().items() 每次迭代会输出模型的name和param,但是这里的所有的param都是requires_grad=False,没有办法改变requires_grad的属性,所以改变requires_grad的属性只能通过上面的两种方式。

for name, param in model.state_dict().items():
    print(name,param.requires_grad)

总结

模型的定义就是先继承再构建组件最后组装
其中基本组件可从 torch.nn中获取,或者从torch.nn.functional中获取,同时为了方便
重复使用组件,可以使用 Sequential 等Containers容器将一系列组件包起来,最后在 forward()函数中将这些组件组装成需要的模型。

至此,基于PyTorch的模型搭建流程已基本完成,可根据官方开源模型进行适当修改或直接使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyTorch学习(4):模型 的相关文章

  • 用我自己的值初始化pytorch卷积层

    我想知道是否有办法用我自己的值初始化 pytorch 卷积过滤器 例如 我有一个元组 0 8423 0 3778 3 1070 2 6518 我想用这些值初始化 2X2 过滤器 我该怎么做 我查找了一些答案 但他们大多使用火炬正态分布和其他
  • Win10 64位上CUDA 12的PyTorch安装

    我需要在我的 PC 上安装 PyTorch 其 CUDA 版本 12 0 pytorch 2 的表 https i stack imgur com X13oS png in In 火炬网站 https pytorch org get sta
  • PoseWarping:如何矢量化此 for 循环(z 缓冲区)

    我正在尝试使用地面真实深度图 姿势信息和相机矩阵将帧从视图 1 扭曲到视图 2 我已经能够删除大部分 for 循环并将其矢量化 除了一个 for 循环 扭曲时 由于遮挡 视图 1 中的多个像素可能会映射到视图 2 中的单个位置 在这种情况下
  • 通过 Conda 安装 PyTorch

    目标 使用 pytorch 和 torchvision 创建 conda 环境 Anaconda 导航器 1 8 3 python 3 6 MacOS 10 13 4 我尝试过的 在Navigator中 创建了一个新环境 尝试安装 pyto
  • 使用 pytorch 获取可用 GPU 内存总量

    我正在使用 google colab 免费 Gpu 进行实验 并想知道有多少 GPU 内存可供使用 torch cuda memory allocated 返回当前占用的 GPU 内存 但我们如何使用 PyTorch 确定总可用内存 PyT
  • 在pytorch中使用tensorboard,但得到空白页面?

    我在pytorch 1 3 1中使用tensorboard 并且我在张量板的 pytorch 文档 https pytorch org docs stable tensorboard html 运行后tensorboard logdir r
  • 在pytorch张量中过滤数据

    我有一个张量X like 0 1 0 5 1 0 0 1 2 0 我想实现一个名为的函数filter positive 它可以将正数据过滤成新的张量并返回原始张量的索引 例如 new tensor index filter positive
  • 尝试理解 Pytorch 的 LSTM 实现

    我有一个包含 1000 个示例的数据集 其中每个示例都有5特征 a b c d e 我想喂7LSTM 的示例 以便它预测第 8 天的特征 a 阅读 nn LSTM 的 Pytorchs 文档 我得出以下结论 input size 5 hid
  • 如何更新 PyTorch 中神经网络的参数?

    假设我想将神经网络的所有参数相乘PyTorch 继承自的类的实例torch nn Module http pytorch org docs master nn html torch nn Module by 0 9 我该怎么做呢 Let n
  • Pytorch ValueError:优化器得到一个空参数列表

    当尝试创建神经网络并使用 Pytorch 对其进行优化时 我得到了 ValueError 优化器得到一个空参数列表 这是代码 import torch nn as nn import torch nn functional as F fro
  • torch.stack() 和 torch.cat() 函数有什么区别?

    OpenAI 的强化学习 REINFORCE 和 actor critic 示例具有以下代码 加强 https github com pytorch examples blob master reinforcement learning r
  • Pytorch 损失为 nan

    我正在尝试用 pytorch 编写我的第一个神经网络 不幸的是 当我想要得到损失时遇到了问题 出现以下错误信息 RuntimeError Function LogSoftmaxBackward0 returned nan values in
  • PyTorch 中的连接张量

    我有一个张量叫做data形状的 128 4 150 150 其中 128 是批量大小 4 是通道数 最后 2 个维度是高度和宽度 我有另一个张量叫做fake形状的 128 1 150 150 我想放弃最后一个list array从第 2 维
  • 如何计算cifar10数据的平均值和标准差

    Pytorch 使用以下值作为 cifar10 数据的平均值和标准差 变换 Normalize 0 5 0 5 0 5 0 5 0 5 0 5 我需要理解计算背后的概念 因为这些数据是 3 通道图像 我不明白什么是相加的 什么是除什么的等等
  • Pytorch 与 joblib 的 autograd 问题

    将 pytorch 的 autograd 与 joblib 混合似乎存在问题 我需要并行获取大量样本的梯度 Joblib 与 pytorch 的其他方面配合良好 但是 与 autograd 混合时会出现错误 我做了一个非常小的例子 显示串行
  • 将 Pytorch LSTM 的状态参数转换为 Keras LSTM

    我试图将现有的经过训练的 PyTorch 模型移植到 Keras 中 在移植过程中 我陷入了LSTM层 LSTM 网络的 Keras 实现似乎具有三种状态类型的状态矩阵 而 Pytorch 实现则具有四种状态矩阵 例如 对于hidden l
  • ValueError:使用火炬张量时需要解压的值太多

    对于神经网络项目 我使用 Pytorch 并使用 EMNIST 数据集 已经给出的代码加载到数据集中 train dataset dsets MNIST root data train True transform transforms T
  • PyTorch 给出 cuda 运行时错误

    我对我的代码做了一些小小的修改 以便它不使用 DataParallel and DistributedDataParallel 代码如下 import argparse import os import shutil import time
  • 对 FastAI 中的数据应用图像增强转换时出错

    我正在尝试复制这个 Kaggle 笔记本https www kaggle com tanlikesmath diabetic retinopathy with resnet50 oversampling https www kaggle c
  • PyTorch LSTM 中的“隐藏”和“输出”有什么区别?

    我无法理解 PyTorch 的 LSTM 模块 以及类似的 RNN 和 GRU 的文档 关于输出 它说 输出 输出 h n c n 输出 seq len batch hidden size num directions 包含RNN最后一层的

随机推荐