pytorch学习day3

2024-05-31 23:04
文章标签 学习 pytorch day3

本文主要是介绍pytorch学习day3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、模型创建(Module)

网络创建流程

上面的图表展示了使用PyTorch创建神经网络模型的主要步骤。每个步骤按顺序连接,展示了从导入必要的库到最终测试模型的整个流程:

  1. 导入必要的库:首先导入PyTorch及其相关模块。
  2. 定义网络结构:通过继承 nn.Module 类定义神经网络的层和前向传播过程。
  3. 实例化模型:使用定义的结构实例化模型对象。
  4. 定义损失函数和优化器:选择并定义损失函数和优化器。
  5. 准备数据:加载并预处理数据,创建数据加载器。
  6. 训练模型:通过训练循环进行前向传播、计算误差和反向传播更新权重。
  7. 测试模型:在测试数据上评估模型的性能。

模型构建的两个要素

在PyTorch中,构建神经网络模型的关键在于两个要素:构建子模块拼接子模块。这两个要素分别在模型类的 __init__() 方法和 forward() 方法中实现。

1. 构建子模块

在自定义模型中,通过继承 nn.Module 类,并在 __init__() 方法中定义子模块。这些子模块通常是神经网络的各层,例如卷积层、全连接层、激活函数等。

示例:

import torch.nn as nnclass CustomModel(nn.Module):def __init__(self):super(CustomModel, self).__init__()# 定义子模块self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)self.fc1 = nn.Linear(in_features=16*16*16, out_features=120)self.fc2 = nn.Linear(in_features=120, out_features=84)self.fc3 = nn.Linear(in_features=84, out_features=10)

在上面的代码中,我们定义了一个卷积层 conv1,一个池化层 pool,以及三个全连接层 fc1fc2fc3。这些子模块是模型的基本组成部分。

2. 拼接子模块

forward() 方法中定义子模块的拼接方式。forward() 方法描述了输入数据如何经过这些子模块的传递过程,最终输出结果。

示例:

class CustomModel(nn.Module):def __init__(self):super(CustomModel, self).__init__()self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)self.pool = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)self.fc1 = nn.Linear(in_features=16*16*16, out_features=120)self.fc2 = nn.Linear(in_features=120, out_features=84)self.fc3 = nn.Linear(in_features=84, out_features=10)def forward(self, x):x = self.pool(F.relu(self.conv1(x)))  # 拼接卷积层和池化层x = x.view(-1, 16*16*16)              # 展平张量x = F.relu(self.fc1(x))               # 拼接第一个全连接层x = F.relu(self.fc2(x))               # 拼接第二个全连接层x = self.fc3(x)                       # 拼接第三个全连接层return x

forward() 方法中,我们定义了输入数据的传递路径。数据首先通过卷积层 conv1 和池化层 pool,然后展平为一维张量,依次通过三个全连接层 fc1fc2fc3,最后输出结果。

通过这两个步骤,我们可以构建出一个功能齐全的神经网络模型。以下是流程图,帮助理解这两个要素在模型构建中的位置和作用。

当然,以下是关于模型构建的两个要素的表格,可以直接复制使用:

| 模型构建的两个要素 |                  描述                  |
|--------------------|----------------------------------------|
| 构建子模块         | 在自定义模型(继承 nn.Module)的 `__init__()` 方法中定义各个层(卷积层、池化层、全连接层等)|
| 拼接子模块         | 在自定义模型的 `forward()` 方法中定义层的连接方式,描述前向传播过程              |

这个表格简明地展示了模型构建的两个关键步骤和它们分别在哪个方法中实现。希望这能帮助你更好地理解和使用PyTorch进行模型构建。

通过以上两个步骤,我们可以灵活地定义各种复杂的神经网络模型,并通过 forward() 方法灵活地组合这些子模块,实现数据的前向传播过程。

二、nn.Mudule的属性

nn.Module 是 PyTorch 中所有神经网络模块的基类。它提供了一些关键属性和方法,用于构建和管理神经网络模型。以下是 nn.Module 的一些重要属性和方法:

1. parameters()

  • 描述:返回模型所有参数的迭代器。
  • 用途:通常用于优化器来获取模型参数进行训练。
for param in model.parameters():print(param.size())

2. named_parameters()

  • 描述:返回一个包含模型参数名字和参数本身的迭代器。
  • 用途:当你需要获取特定层的参数时特别有用。
for param in model.parameters():print(param.size())

3. children()

  • 描述:返回模型所有子模块的迭代器。
  • 用途:用于递归遍历模型的各个子模块。
for child in model.children():print(child)

4. named_children()

  • 描述:返回一个包含模型子模块名字和子模块本身的迭代器。
  • 用途:用于详细查看每个子模块。
for name, child in model.named_children():print(name, child)

5. modules()

  • 描述:返回模型所有模块(包括模型本身和其子模块)的迭代器。
  • 用途:用于遍历所有模块。
for module in model.modules():print(module)

6. named_modules()

  • 描述:返回一个包含模型模块名字和模块本身的迭代器。
  • 用途:当你需要以层级结构查看所有模块时使用。
  • for name, module in model.named_modules():print(name, module)

7. add_module(name, module)

  • 描述:将一个子模块添加到当前模块。
  • 用途:动态地添加子模块。
model.add_module('extra_layer', nn.Linear(10, 10))

8. forward()

  • 描述:定义前向传播逻辑。用户需要在自己的子类中重载这个方法。
  • 用途:定义输入数据如何通过网络层进行传递。
def forward(self, x):x = self.layer1(x)x = self.layer2(x)return x

9. train(mode=True)

  • 描述:将模块设置为训练模式。
  • 用途:启用或禁用 Dropout 和 BatchNorm。
model.train()  # 设置为训练模式
model.eval()   # 设置为评估模式

10. zero_grad()

  • 描述:将所有模型参数的梯度清零。
  • 用途:在每次反向传播前清除旧的梯度。
model.zero_grad()

这些属性和方法提供了强大的功能,使得 nn.Module 能够灵活且高效地管理神经网络模型。通过这些接口,你可以构建、管理和训练复杂的神经网络。

三、模型容器Containers

模型容器(Containers)

在 PyTorch 中,模型容器(Containers)是用于组织和管理神经网络层的一种方式。通过使用模型容器,可以更方便地构建和管理复杂的神经网络结构。以下是 PyTorch 中常用的几种模型容器:

1. nn.Sequential

描述:

nn.Sequential 是一个按顺序执行子模块的容器。它将子模块按定义顺序串联起来,适合用于简单的前向传播模型。

用途:

用于快速构建按顺序堆叠的网络结构,例如多层感知机(MLP)和简单的卷积神经网络(CNN)。

示例:

import torch.nn as nnmodel = nn.Sequential(nn.Conv2d(1, 20, 5),nn.ReLU(),nn.Conv2d(20, 64, 5),nn.ReLU()
)

在这个例子中,输入数据依次通过两个卷积层和两个 ReLU 激活函数。

2. nn.ModuleList

描述:

nn.ModuleList 是一个存储子模块的有序列表,但并没有定义前向传播的具体顺序。它主要用于需要灵活前向传播定义的模型。

用途:

适用于需要在前向传播过程中动态选择层或者有条件执行层的情况。

示例:

import torch.nn as nnclass MyModule(nn.Module):def __init__(self):super(MyModule, self).__init__()self.layers = nn.ModuleList([nn.Conv2d(1, 20, 5), nn.Conv2d(20, 64, 5)])def forward(self, x):for layer in self.layers:x = layer(x)return x

在这个例子中,layers 存储了两个卷积层,并在 forward 方法中以循环的方式应用它们。

3. nn.ModuleDict

描述:

nn.ModuleDict 是一个存储子模块的字典,可以使用键来访问子模块。它提供了灵活的模块管理方式,可以通过键值对的方式存取模块。

用途:

适用于需要命名访问子模块,且不需要严格的前向传播顺序的情况,例如多分支的模型结构。

示例:

import torch.nn as nnclass MyModule(nn.Module):def __init__(self):super(MyModule, self).__init__()self.layers = nn.ModuleDict({'conv1': nn.Conv2d(1, 20, 5),'conv2': nn.Conv2d(20, 64, 5)})def forward(self, x):x = self.layers['conv1'](x)x = self.layers['conv2'](x)return x

在这个例子中,layers 存储了两个卷积层,可以通过键名 'conv1''conv2' 进行访问。

4. nn.ParameterListnn.ParameterDict

描述:

这两个容器分别用于存储参数列表和参数字典,与 ModuleListModuleDict 类似,但它们存储的是参数而不是模块。

用途:

适用于需要灵活管理模型参数的情况。

示例:

import torch
import torch.nn as nnclass MyModule(nn.Module):def __init__(self):super(MyModule, self).__init__()self.params = nn.ParameterList([nn.Parameter(torch.randn(10, 10)) for i in range(3)])self.param_dict = nn.ParameterDict({'param1': nn.Parameter(torch.randn(10, 10)),'param2': nn.Parameter(torch.randn(10, 10))})def forward(self, x):# 使用 self.params 和 self.param_dict 进行前向传播pass

在这个例子中,params 存储了三个参数,而 param_dict 则存储了两个命名参数。

4 总结

通过使用这些模型容器,PyTorch 提供了灵活且高效的方式来组织和管理神经网络模型的层和参数。nn.Sequential 适用于简单的顺序结构,nn.ModuleListnn.ModuleDict 提供了更多的灵活性,适用于更复杂的网络结构。nn.ParameterListnn.ParameterDict 则用于更灵活的参数管理。利用这些容器,可以更方便地构建和管理复杂的神经网络模型。

5 实现一个简单VGG网络

创建一个简单的VGG网络

VGG网络是一种深度卷积神经网络,因其简单且具有良好的性能而广泛应用。下面我们利用PyTorch提供的模型容器,构建一个简化版的VGG网络。我们将主要使用nn.Sequential来按顺序堆叠卷积层和全连接层。

相关论文地址:https://arxiv.org/abs/1409.1556

1. 导入必要的库

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

2. 定义VGG块

VGG块由多个卷积层和一个池化层组成。我们定义一个函数来创建这些块。

def vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))layers.append(nn.ReLU(inplace=True))in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2, stride=2))return nn.Sequential(*layers)

3. 定义VGG网络

我们利用nn.Sequential来堆叠多个VGG块,最后添加全连接层。

class SimpleVGG(nn.Module):def __init__(self):super(SimpleVGG, self).__init__()self.features = nn.Sequential(vgg_block(2, 3, 64),vgg_block(2, 64, 128),vgg_block(3, 128, 256),vgg_block(3, 256, 512),vgg_block(3, 512, 512))self.classifier = nn.Sequential(nn.Linear(512*7*7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 10))def forward(self, x):x = self.features(x)x = torch.flatten(x, 1)x = self.classifier(x)return x

4. 实例化和测试模型

我们创建模型实例并打印其结构,确保其正确性。

model = SimpleVGG()
print(model)

5. 测试模型结构

为了确保模型构建正确,我们可以打印模型结构或者传递一个随机张量进行测试。

if __name__ == "__main__":model = SimpleVGG()print(model)# 测试输入数据input_tensor = torch.randn(1, 3, 224, 224)output = model(input_tensor)print(output.shape)  # 应输出 torch.Size([1, 10])

通过这些步骤,我们利用PyTorch提供的模型容器创建了一个简化版的VGG网络。这个网络由五个VGG块和三个全连接层组成,适用于图像分类任务。根据需求可以进一步调整网络结构和参数。

这篇关于pytorch学习day3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019285

相关文章

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

从零教你安装pytorch并在pycharm中使用

《从零教你安装pytorch并在pycharm中使用》本文详细介绍了如何使用Anaconda包管理工具创建虚拟环境,并安装CUDA加速平台和PyTorch库,同时在PyCharm中配置和使用PyTor... 目录背景介绍安装Anaconda安装CUDA安装pytorch报错解决——fbgemm.dll连接p

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用