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

jiaxin359 jiaxin359     2023-02-19     124

关键词:

使用PyTorch构建神经网络十分的简单,下面是我总结的PyTorch构建神经网络的一般过程以及我在学习当中遇到的一些问题,期望对你有所帮助。

PyTorch构建神经网络的一般过程

下面的程序是PyTorch官网60分钟教程上面构建神经网络的例子,版本0.4.1:

import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

# 第一步:准备数据
# Compose是将两个转换的过程组合起来,ToTensor将numpy等数据类型转换为Tensor,将值变为0到1之间
# Normalize用公式(input-mean)/std 将值进行变换。这里mean=0.5,std=0.5,是将[0,1]区间转换为[-1,1]区间
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
     
# trainloader 是一个将数据集和采样策略结合起来的,并提供在数据集上面迭代的方法
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                          shuffle=True, num_workers=0)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                         shuffle=False, num_workers=0)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')



# 第二步:构建神经网络框架,继承nn.Module类
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)

        self.conv2 = nn.Conv2d(6, 16, 5)

        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

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

        x = x.view(-1, 16 * 5 * 5)

        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x
        
net = Net()



# 第三步:进行训练
# 定义损失策略和优化方法
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

# 训练神经网络
for epoch in range(4):
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        inputs, labels = data
        
        optimizer.zero_grad()
        
        # 训练过程1:前向过程,计算输入到输出的结果
        outputs = net(inputs)
        
        # 训练过程2:由结果和label计算损失
        loss = criterion(outputs, labels)

        # 训练过程3:在图的层次上面计算所有变量的梯度
        # 每次计算梯度的时候,其实是有一个动态的图在里面的,求导数就是对图中的参数w进行求导的过程
        # 每个参数计算的梯度值保存在w.grad.data上面,在参数更新时使用
        loss.backward()

        # 训练过程4:进行参数的更新
        # optimizer不计算梯度,它利用已经计算好的梯度值对参数进行更新
        optimizer.step()

        running_loss += loss.item()  # item 返回的是一个数字
        if i % 2000 == 1999:
            print('[%d, %5d] loss: %.3f' %
                  (epoch+1, i+1, running_loss/2000))
            running_loss = 0.0
print('Finished Training')



# 第四步:在测试集上面进行测试
total = 0
correct = 0
with torch.no_grad():
    for data in testloader:
        images, label = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == label).sum().item()

print("Accuracy of networkd on the 10000 test images: %d %%" % (100*correct/total))

这个例子说明了构建神经网络的四个步骤:1:准备数据集 。2:构建神经网络框架,实现神经网络的类。 3:在训练集上进行训练。 4:在测试集上面进行测试。

而在第三步的训练阶段,也可以分为四个步骤:1:前向过程,计算输入到输出的结果。2:由结果和labels计算损失。3:后向过程,由损失计算各个变量的梯度。4:优化器根据梯度进行参数的更新。

训练过程中第loss和optim是怎么联系在一起的

loss是训练阶段的第三步,计算参数的梯度。optim是训练阶段的第四步,对参数进行更新。在optimizer初始化的时候,optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9),获取了参数的指针,可以对参数进行修改。当loss计算好参数的梯度以后,把值放在参数w.grad.data上面,然后optimizer直接利用这个值对参数进行更新。

以SGD为例,它进行step的时候的基本操作是这样的:p.data.add_(-group[‘lr‘], d_p),其中 d_p = p.grad.data

为什么要进行梯度清零

在backward每次计算梯度的时候,会将新的梯度值加到原来旧的梯度值上面,这叫做梯度累加。下面的程序可以说明什么是梯度累加:

import torch
x = torch.rand(2, requires_grad=True)
y = x.mean()  # y = (x_1 + x_2) / 2  所以求梯度后应是0.5

y.backward()
print(x.grad.data) # 输出结果:tensor([0.5000, 0.5000])

y.backward()
print(x.grad.data) # 输出结果:tensor([1., 1.])  说明进行了梯度累积

求解梯度过程和参数更新过程是分开的,这对于那些需要多次求导累计梯度,然后一次更新的神经网络可能是有帮助的,比如RNN,对于DNN和CNN不需要进行梯度累加,所以需要进行梯度清零。

如何使用GPU进行训练

旧版本:

use_cuda = True if torch.cuda.is_available() else False  # 是否使用cuda
if use_cuda:
    model = model.cuda()  # 将模型的参数放入GPU
if use_cuda:
    inputs, labels = inputs.cuda(), labels.cuda()  # 将数据放入到GPU

0.4版本以后推荐新方法 to(device),

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net.to(device)  #将模型的参数放入GPU中
inputs, labels = inputs.to(device), labels.to(device)  # 将数据放入到GPU中

参考:
Pytorch内部中optim和loss是如何交互的? - 罗若天的回答 - 知乎
pytorch学习笔记(二):gradient

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

关于torch.nn:使用Pytorch来构建神经网络,主要的工具都在torch.nn包中.nn依赖于autograd来定义模型,并对其自动求导.构建神经网络的典型流程:定义一个拥有可学习参数的神经网络遍历训练数据集处理输入数据使其流经神经网络计算损失... 查看详情

使用pytorch构建卷积神经网络的分类器

参考技术A分类任务和数据介绍可以参考神经网络的构建结果保存模型以及进行测试在全部测试集上的表现如果在GPU上进行训练的话 查看详情

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

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

如何使用 pytorch 构建多维自动编码器

】如何使用pytorch构建多维自动编码器【英文标题】:howtobuildamultidimensionalautoencoderwithpytorch【发布时间】:2019-10-1815:17:19【问题描述】:我遵循了序列自动编码器的这个很好的答案,LSTMautoencoderalwaysreturnstheaverageoftheinputsequence.但... 查看详情

基于pytorch的深度学习入门教程——构建神经网络

...2:PyTorch的自动梯度计算Part3:使用PyTorch构建一个神经网络Part4:训练一个神经网络分类器Part5:数据并行化本文是关于Part3的内容。 Part3:使用PyTorch构建一个神经网络神经网络可以使用touch.nn来构建。nn依赖于... 查看详情

pytorch实践模型训练(torchvision)

...失函数的选择以及一些辅助的工具等,TorchVision是一个和PyTorch配合使用的Python包,包含很多图像处理工具PyTorch中的数据读取模型训练开始的第一步就是数据读取,PyTorch提 查看详情

pytorch使用总结(代码片段)

...ckward()的一些API。同时包含着和张量相关的梯度。nn.Module-神经网络模块。便捷的数据封装,能够将运算移往GPU,还包括一些输入输出的东西。nn.Parameter-一种变量ÿ 查看详情

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

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

Pytorch 卷积网络内存使用详情

...问题描述】:我正在尝试为非常大的输入(5*100,000,000)训练神经网络,它需要比预期更多的内存。这是一些最小的例子:importtorchimporttorch.nnasnnimporttorch.nn.functionalasFimpor 查看详情

如何在 PyTorch 中构建具有两个输入的网络

...间】:2019-01-1300:08:46【问题描述】:假设我想拥有通用的神经网络架构:Input1-->CNNLayer\\--->FCLayer--->Output/Input2-->FCLayerInput1是图像数据,input2是非图像数据。我已经在 查看详情

pytorch基本介绍

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

基于pytorch,如何构建一个简单的神经网络

本文为PyTorch官方教程中:如何构建神经网络。基于PyTorch专门构建神经网络的子模块torch.nn构建一个简单的神经网络。完整教程运行codelab→https://openbayes.com/console/open-tutorials/containers/OgcYkLjKw89torch.nn文档→https://pytorch.org/docs/stab... 查看详情

如何使用 pytorch 构建多任务 DNN,例如 100 多个任务?

】如何使用pytorch构建多任务DNN,例如100多个任务?【英文标题】:Howtousepytorchtoconstructmulti-taskDNN,e.g.,formorethan100tasks?【发布时间】:2020-05-0222:47:40【问题描述】:以下是使用pytorch为两个回归任务构建DNN的示例代码。forward函数返... 查看详情

如何自定义构建基于 Jquery 的 javascript API 以及关于 Jquery 中使用的语法的一些问题

】如何自定义构建基于Jquery的javascriptAPI以及关于Jquery中使用的语法的一些问题【英文标题】:howtoCustombuildajavascriptAPIbasedonJqueryandsomequestionsaboutthesyntaxusedinJquery【发布时间】:2011-03-2912:39:57【问题描述】:我带着很多问题来到这... 查看详情

pytorch学习笔记第四篇——神经网络(代码片段)

...了解了自动梯度Autograd,pytorch中可以使用torch.nn构建神经网络,nn依赖于autograd来定义模型并对其进行微分。nn.Module包含层,以及返回output的方法forward(input)。文章目录1.定义网络1.1自定义网络1.2使用自定义网络的自动... 查看详情

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

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

pytorch使用pytorch进行张量计算自动求导和神经网络构建(代码片段)

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052首先,让我们介绍一下什么是pytorch,它是一个基于Python的开源深度学习框架,它提供了两个核心功能:张量计算和自动求导。张量计算张量... 查看详情

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

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