用pytorch构建神经网络的基本流程和实现过程(代码片段)

黑马程序员官方 黑马程序员官方     2022-12-02     316

关键词:

关于torch.nn:

  • 使用Pytorch来构建神经网络, 主要的工具都在torch.nn包中.
  • nn依赖于autograd来定义模型, 并对其自动求导.

构建神经网络的典型流程:

定义一个拥有可学习参数的神经网络
遍历训练数据集
处理输入数据使其流经神经网络
计算损失值
将网络参数的梯度进行反向传播
以一定的规则更新网络的权重
  • 我们首先定义一个Pytorch实现的神经网络:
# 导入若干工具包
import torch
import torch.nn as nn
import torch.nn.functional as F


# 定义一个简单的网络类
class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 定义第一层卷积神经网络, 输入通道维度=1, 输出通道维度=6, 卷积核大小3*3
        self.conv1 = nn.Conv2d(1, 6, 3)
        # 定义第二层卷积神经网络, 输入通道维度=6, 输出通道维度=16, 卷积核大小3*3
        self.conv2 = nn.Conv2d(6, 16, 3)
        # 定义三层全连接网络
        self.fc1 = nn.Linear(16 * 6 * 6, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # 在(2, 2)的池化窗口下执行最大池化操作
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        # 计算size, 除了第0个维度上的batch_size
        size = x.size()[1:]
        num_features = 1
        for s in size:
            num_features *= s
        return num_features


net = Net()
print(net)

输出结果:

Net(
  (conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
  (fc1): Linear(in_features=576, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=10, bias=True)
)

注意:

    • 模型中所有的可训练参数, 可以通过net.parameters()来获得.
params = list(net.parameters())
print(len(params))
print(params[0].size())

输出结果:

10
torch.Size([6, 1, 3, 3])

假设图像的输入尺寸为32 * 32:

input = torch.randn(1, 1, 32, 32)
out = net(input)
print(out)

输出结果:

tensor([[ 0.1242,  0.1194, -0.0584, -0.1140,  0.0661,  0.0191, -0.0966,  0.0480,
          0.0775, -0.0451]], grad_fn=<AddmmBackward>)
  • 有了输出张量后, 就可以执行梯度归零和反向传播的操作了.
net.zero_grad()
out.backward()

注意:

    • torch.nn构建的神经网络只支持mini-batches的输入, 不支持单一样本的输入.
    • 比如: nn.Conv2d 需要一个4D Tensor, 形状为(nSamples, nChannels, Height, Width). 如果你的输入只有单一样本形式, 则需要执行input.unsqueeze(0), 主动将3D Tensor扩充成4D Tensor.

损失函数

  • 损失函数的输入是一个输入的pair: (output, target), 然后计算出一个数值来评估output和target之间的差距大小.
  • 在torch.nn中有若干不同的损失函数可供使用, 比如nn.MSELoss就是通过计算均方差损失来评估输入和目标值之间的差距

应用nn.MSELoss计算损失的一个例子:

output = net(input)
target = torch.randn(10)

# 改变target的形状为二维张量, 为了和output匹配
target = target.view(1, -1)
criterion = nn.MSELoss()

loss = criterion(output, target)
print(loss)

输出结果:

tensor(1.1562, grad_fn=<MseLossBackward>)

关于方向传播的链条: 如果我们跟踪loss反向传播的方向, 使用.grad_fn属性打印, 将可以看到一张完整的计算图如下:

input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d
      -> view -> linear -> relu -> linear -> relu -> linear
      -> MSELoss
      -> loss
  • 当调用loss.backward()时, 整张计算图将对loss进行自动求导, 所有属性requires_grad=True的Tensors都将参与梯度求导的运算, 并将梯度累加到Tensors中的.grad属性中.
print(loss.grad_fn)  # MSELoss
print(loss.grad_fn.next_functions[0][0])  # Linear
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])  # ReLU

输出结果:

<MseLossBackward object at 0x7fdba3216da0>
<AddmmBackward object at 0x7fdba3216f28>
<AccumulateGrad object at 0x7fdba3216f28>

反向传播(backpropagation)

  • 在Pytorch中执行反向传播非常简便, 全部的操作就是loss.backward().
  • 在执行反向传播之前, 要先将梯度清零, 否则梯度会在不同的批次数据之间被累加.

执行一个反向传播的小例子:

# Pytorch中执行梯度清零的代码
net.zero_grad()

print('conv1.bias.grad before backward')
print(net.conv1.bias.grad)

# Pytorch中执行反向传播的代码
loss.backward()

print('conv1.bias.grad after backward')
print(net.conv1.bias.grad)

输出结果:

conv1.bias.grad before backward
tensor([0., 0., 0., 0., 0., 0.])
conv1.bias.grad after backward
tensor([-0.0002,  0.0045,  0.0017, -0.0099,  0.0092, -0.0044])

更新网络参数

  • 更新参数最简单的算法就是SGD(随机梯度下降).
  • 具体的算法公式表达式为: weight = weight - learning_rate * gradient

首先用传统的Python代码来实现SGD如下:

learning_rate = 0.01
for f in net.parameters():
    f.data.sub_(f.grad.data * learning_rate)

然后使用Pytorch官方推荐的标准代码如下:

# 首先导入优化器的包, optim中包含若干常用的优化算法, 比如SGD, Adam等
import torch.optim as optim

# 通过optim创建优化器对象
optimizer = optim.SGD(net.parameters(), lr=0.01)

# 将优化器执行梯度清零的操作
optimizer.zero_grad()

output = net(input)
loss = criterion(output, target)

# 对损失值执行反向传播的操作
loss.backward()
# 参数的更新通过一行标准代码来执行
optimizer.step()

使用pytorch构建神经网络的流程以及一些问题(代码片段)

使用PyTorch构建神经网络十分的简单,下面是我总结的PyTorch构建神经网络的一般过程以及我在学习当中遇到的一些问题,期望对你有所帮助。PyTorch构建神经网络的一般过程下面的程序是PyTorch官网60分钟教程上面构建神经网络的例... 查看详情

计算机视觉pytorch实现(代码片段)

...torch和TensorFlow等。这些框架可以极大简化了构建深度学习神经网络的过程。在计算机视觉应用中通过pytorch 查看详情

pytorch基本介绍

...张量的梯度。这为构建和训练深度学习模型提供了便利。神经网络(NeuralNetworks):PyTorch提供了构建和训练神经网络的工具,包括各种层、激活函数、损失函数等等。数据加载 查看详情

神经网络和深度学习-用pytorch实现线性回归(代码片段)

...型,我们的模型类应该继承于nn.Module,它是所有神经网络模块的Baseclass。在这个类中我们需要实现两个函数,一个是构造函数init,另一个是前馈函数forward,用module实现的类会自动实现bac 查看详情

pytorch深度学习框架:优雅而简洁的代码实现(代码片段)

...简洁的API和灵活的动态计算图,使得构建和训练深度神经网络变得更加优雅和简洁。本文将介绍PyTorch的基本原理和使用方法,以及如何在PyTorch中实现常见的深度学习模型。PyTorch的基本原理PyTorch的核心是张量(Tensor&#... 查看详情

用pytorch构建一个喵咪识别模型(代码片段)

 本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052目录一、前言二、问题阐述及理论流程2.1问题阐述2.2猫咪图片识别原理 三、用PyTorch实现 3.1PyTorch介绍3.2PyTorch构建模型的五要素3.3PyTorch实现的步骤3.3.1.... 查看详情

pytorch图像分类教程专栏目录

...要包括图像分类常用数据集、图像分类基本流程、全连接神经网络、卷积神经网络、多尺度卷积、跳连卷积、自定义数据集实现图 查看详情

pytorch图像分类教程专栏目录

...要包括图像分类常用数据集、图像分类基本流程、全连接神经网络、卷积神经网络、多尺度卷积、跳连卷积、自定义数据集实现图 查看详情

diffusion扩散模型学习1——pytorch搭建ddpm实现图片生成

Diffusion扩散模型学习1——Pytorch搭建DDPM利用深度卷积神经网络实现图片生成学习前言源码下载地址网络构建一、什么是Diffusion1、加噪过程2、去噪过程二、DDPM网络的构建(Unet网络的构建)三、Diffusion的训练思路利用DDPM生... 查看详情

神经网络与深度学习作业3:分别使用numpy和pytorch实现fnn例题(代码片段)

目录过程推导——了解BP原理 数值计算 代码实现 使用numpy实现 使用pytorch实现 1、对比【numpy】和【pytorch】程序,总结并陈述。2、激活函数Sigmoid用PyTorch自带函数torch.sigmoid(),观察、总结并陈述。3、激活函数Sigmoid改... 查看详情

使用pytorch实现深度学习的主要流程(代码片段)

一、使用Pytorch实现深度学习的主要流程使用Pytorch进行深度学习的实现流程主要包含如下几个部分:1、预处理、后处理并确认网络的输入和输出2、创建Dataset3、创建DataLoader4、创建网络模型5、定义正向传播函数(forward... 查看详情

mlp多层感知器pytorch实现过程(代码片段)

...播计算损失反向传播求梯度更新权重1.构建网络模型多层神经网络中第一层称之为输入层,最后一层称之为输出层,中间的层称之为隐层。在分类模型中,输出层的每一个变量对应一个类别。层与层之间两两单元之间... 查看详情

pytorch之深度神经网络概念全面整理(代码片段)

深度神经网络就是用一组函数去逼近原函数,训练的过程就是寻找参数的过程。1、神经网络训练过程神经网络的训练过程如下:收集数据,整理数据实现神经网络用于拟合目标函数做一个真实值和目标函数值直接估... 查看详情

基于pytorch使用实现cnn如何使用pytorch构建cnn卷积神经网络(代码片段)

基于pytorch使用实现CNN如何使用pytorch构建CNN卷积神经网络本文是一个基于pytorch使用CNN在生物信息学上进行位点预测的例子基于pytorch实现CNN,基于CNN进行位点预测,将CNN代码进行封装,可以非常简单的使用代码,基... 查看详情

pytorch实现文本情感分类流程(代码片段)

文章目录基本概念介绍文本情感分类准备数据集文本的序列化构建模型模型的训练与评估完整代码基本概念介绍tokenization:分词,每个词语就是一个token分词方法:转化为单个字(常见)切分词语N-gram:准... 查看详情

pytorch-模型建立(代码片段)

...torch.nnnn.Module中的forward()方法PyTorch中的nn.functional包定义神经网络的层作为类的属性网络中的层layerParameterVsArgument两种类型的ParametersHyperparametersDatadependenthyperparametersKernel和Filter关于参数总结weight-神经网络的可学习参数重写类方... 查看详情

使用pytorch实现手写数字识别(代码片段)

...DataLoader构建模型,这里可以使用torch构造一个深层的神经网络模型的训练模型的保存,保存模型,后续持续使用模型的评估,使用测试集,观察模型的好坏准备训练集和测试集准备数据集的方法前面已经讲过&#... 查看详情

基于pytorch使用实现cnn如何使用pytorch构建cnn卷积神经网络(代码片段)

基于pytorch使用实现CNN如何使用pytorch构建CNN卷积神经网络本文是一个基于pytorch使用CNN在生物信息学上进行位点预测的例子基于pytorch实现CNN,基于CNN进行位点预测,将CNN代码进行封装,可以非常简单的使用代码,基... 查看详情