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

雁回晴空 雁回晴空     2023-02-21     764

关键词:

前言

本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。

Part1:PyTorch简单知识

Part2:PyTorch的自动梯度计算

Part3:使用PyTorch构建一个神经网络

Part4:训练一个神经网络分类器

Part5:数据并行化


本文是关于Part3的内容。

 

Part3:使用PyTorch构建一个神经网络

神经网络可以使用touch.nn来构建。nn依赖于autograd来定义模型,并且对其求导。一个nn.Module包含网络的层(layers),同时forward(input)可以返回output。

例如,下面的网络(卷积网络)是用来对数字图像进行分类的。

 

这是一个简单的前馈网络。它接受输入,然后一层一层向前传播,最后输出一个结果。

训练神经网络的典型步骤如下:

(1)  定义神经网络,该网络包含一些可以学习的参数(如权重)

(2)  在输入数据集上进行迭代

(3)  使用网络对输入数据进行处理

(4)  计算loss(输出值距离正确值有多远)

(5)  将梯度反向传播到网络参数中

(6)  更新网络的权重,使用简单的更新法则:weight = weight - learning_rate* gradient,即:新的权重=旧的权重-学习率*梯度值。


1 定义网络

我们先定义一个网络:

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


class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 1 input image channel, 6 output channels, 5x5 square convolution
        # kernel
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        # Max pooling over a (2, 2) window
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # If the size is a square you can only specify a single number
        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 = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features


net = Net()
print(net)

预期输出:

Net (

 (conv1): Conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))

 (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))

 (fc1): Linear (400 ->120)

 (fc2): Linear (120 ->84)

 (fc3): Linear (84 ->10)

)

 

你只需要定义forward函数,那么backward函数(梯度在此函数中计算)就会利用autograd来自动定义。你可以在forward函数中使用Tensor的任何运算。

学习到的参数可以被net.parameters()返回。

params = list(net.parameters())
print(len(params))
print(params[0].size())  # conv1's .weight

 

预期输出:

10

torch.Size([6, 1, 5, 5])


前向计算的输入和输出都是autograd.Variable,注意,这个网络(LeNet)的输入尺寸是32*32。为了在MNIST数据集上使用这个网络,请把图像大小转变为32*32。

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

预期输出:

Variable containing:
-0.0796  0.0330  0.0103  0.0250  0.1153 -0.0136  0.0234  0.0881  0.0374 -0.0359
[torch.FloatTensor of size 1x10]

将梯度缓冲区归零,然后使用随机梯度值进行反向传播。

net.zero_grad()
out.backward(torch.randn(1, 10))

注意:torch.nn只支持mini-batches. 完整的torch.nn package只支持mini-batch形式的样本作为输入,并且不能只包含一个样本。例如,nn.Conv2d会采用一个4D的Tensor(nSamples* nChannels * Height * Width)。如果你有一个单样本,可以使用input.unsqueeze(0)来添加一个虚假的批量维度。

 

在继续之前,让我们回顾一下迄今为止所见过的所有类。

概述:

(1)  torch.Tensor——多维数组

(2)  autograd.Variable——包装了一个Tensor,并且记录了应用于其上的运算。与Tensor具有相同的API,同时增加了一些新东西例如backward()。并且有相对于该tensor的梯度值。

(3)  nn.Module——神经网络模块。封装参数的简便方式,对于参数向GPU移动,以及导出、加载等有帮助。

(4)  nn.Parameter——这是一种变量(Variable),当作为一个属性(attribute)分配到一个模块(Module)时,可以自动注册为一个参数(parameter)。

(5)  autograd.Function——执行自动求导运算的前向和反向定义。每一个Variable运算,创建至少一个单独的Function节点,该节点连接到创建了Variable并且编码了它的历史的函数身上。

 

2 损失函数(Loss Function)

损失函数采用输出值和目标值作为输入参数,来计算输出值距离目标值还有多大差距。在nn package中有很多种不同的损失函数,最简单的一个loss就是nn.MSELoss,它计算输出值和目标值之间的均方差。

例如:

output = net(input)
target = Variable(torch.arange(1, 11))  # a dummy target, for example
criterion = nn.MSELoss()

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

 

现在,从反向看loss,使用.grad_fn属性,你会看到一个计算graph如下:

input -> conv2d -> relu -> maxpool2d -> conv2d -> relu -> maxpool2d
      -> view -> linear -> relu -> linear -> relu -> linear
      -> MSELoss
      -> loss

当我们调用loss.backward(),整个的graph关于loss求导,graph中的所有Variables都会有他们自己的.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

预期输出:

<torch.autograd.function.MSELossBackwardobjectat0x7fb3c0dcf4f8>

<torch.autograd.function.AddmmBackwardobjectat0x7fb3c0dcf408>

<AccumulateGradobjectat0x7fb3c0db79e8>

 

3 反向传播(Backprop)

可以使用loss.backward()进行误差反向传播。你需要清除已经存在的梯度值,否则梯度将会积累到现有的梯度上。

现在,我们调用loss.backward(),看一看conv1bias 梯度在backward之前和之后的值。

net.zero_grad()     # zeroes the gradient buffers of all parameters

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

loss.backward()

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

 

4 更新权重

实践当中最简单的更新法则就是随机梯度下降法( StochasticGradient Descent (SGD)

weight = weight - learning_rate * gradient

执行这个操作的python代码如下:

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

但是当你使用神经网络的时候,你可能会想要尝试多种不同的更新法则,例如SGD,Nesterov-SGD, Adam, RMSProp等。为了实现此功能,有一个package叫做torch.optim已经实现了这些。使用它也很方便:

import torch.optim as optim

# create your optimizer
optimizer = optim.SGD(net.parameters(), lr=0.01)

# in your training loop:
optimizer.zero_grad()   # zero the gradient buffers
output = net(input)
loss = criterion(output, target)
loss.backward()
optimizer.step()    # Does the update

 


pytorch深度学习实践入门01(代码片段)

文章目录基于PyTorch的两层神经网络一、基于numpy的两层神经网络实现:二、基于PyTorch的两层神经网络实现:三、使用nn库实现两层神经网络四、自定义nnModules实现两层神经网络总结基于PyTorch的两层神经网络提示:在... 查看详情

pytorch深度学习60分钟快速入门part3:神经网络

 神经网络可以通过使用torch.nn包来构建。既然你已经了解了autograd,而nn依赖于autograd来定义模型并对其求微分。一个nn.Module包含多个网络层,以及一个返回输出的方法forward(input)。例如,查看下图中的对数字图片分类的网络... 查看详情

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

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

神经网络与深度学习pytorch入门——张量(代码片段)

...通过参考飞桨AIStudio-人工智能学习与实训社区 教程进行pytorch相关学习。目录一.概念:张量、算子二.使用pytorch实现张量运算1.2.1创建张量1.2.1.1指定数据创建张量1.2.1.2指定形状创建1.2.1.3指定区间创建1.2.2张量的属性1.2.2.1张... 查看详情

(翻译)60分钟入门深度学习工具-pytorch(代码片段)

60分钟入门深度学习工具-PyTorch作者:SoumithChintala原文翻译自:一、Pytorch是什么?二、AUTOGRAD三、神经网络四、训练一个分类器五、数据并行他是一个基于Python的科学计算包,目标用户有两类为了使用GPU来替代numpy一个深度学习研... 查看详情

深度学习为什么选择pytorch?史上最详细pytorch入门教程(代码片段)

目录前言一、Pytorch介绍1.常见的深度学习框架2.Pytorch框架的崛起3.Pytorch与Tensorflow多方位比较二、Tensors1.Tensor的创建2.Tensor的操作3.Tensor与Numpy三、Autograd的讲解1.模型中的前向传播与反向传播2.利用autograd计算梯度四、构建神经网络... 查看详情

深度学习理论与实战pytorch实现

课程目录:01.预备内容(入门)02.Python基础(入门)03.PyTorch基础(入门)04.神经网络(进阶)05.卷积神经网络(进阶)06.循环神经网络(进阶)07.生成对抗网络GAN(进阶)08.强化学习(进阶)09.毕业项目 下载地址:深度学习理... 查看详情

深度学习python怎么入门知乎

...深度学习书籍都是基于一些流行的Python库,如TensorFlow、PyTorch或Keras。相比之下,《运用深度学习》(GrokkingDeepLearning)通过从零开始、一行一行地构建内容来教你进行深度学习。《运用深度学习》你首先要开发一个人工神经元,... 查看详情

pytorch深度学习60分钟快速入门part0:系列介绍

 说明:本系列教程翻译自PyTorch官方教程《DeepLearningwithPyTorch:A60MinuteBlitz》 教程目标在高层次上理解PyTorch的Tensor库和神经网络训练一个小型的神经网络来分类图像前提条件假设读者熟悉基础的NumPy库确保已经安装了torch和t... 查看详情

深度学习-pytorch框架实战系列

深度学习-PyTorch框架实战系列PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能... 查看详情

系统入门深度学习,直击算法工程师

...数(09:18)2-5逻辑回归示例(12:17)2-6单层、多层感知机(08:51)2-7pytorch构建单多层感知机(19:53)2-8基于多层DNN假钞识别(01:43)2-9数据集及特征分析(05:49)2-10项目构建和模型训练 查看详情

第3章神经网络《深度学习入门基于python的理论与实现》

第3章神经网络《深度学习入门基于Python的理论与实现》3.1从感知机到神经网络3.2激活函数3.1从感知机到神经网络 查看详情

基于pytorch完整的训练一个神经网络并进行验证(代码片段)

原视频链接:Pytorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】土堆老师的Github地址之前学的也不少了,现在要去训练一个完整的神经网络,利用Pytorch和CIFAR10数据集准备数据集importtorchvision#导入torchvision##... 查看详情

pytorch是啥?

PyTorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。它是一个基于Python的可续计算包,提供两个高级功能:具有强大的GPU加速的张量计算(如NumPy... 查看详情

深入浅出卷积神经网络及实现!

...CNN的基础原理及常见的CNN网络进行了详细解读,并介绍了Pytorch构建深度网络的流程。最后,以阿里天池零基础入门CV赛事为学习实践,对Pytorch构建CNN模型进行实现。数据及背景  CNN原理CNN,又称卷积神经网络,是深 查看详情

怎么快速入门深度学习

...理论知识,就需要学习一个深度学习的框架:Tensorflow、Pytorch。最近几年pytorch用的人越来越多了。图像识别的话,还需要学习opencv。参考技术A学习深度学习的基础知识:学习深度学习的基本概念,包括神经网络、卷积神经网络... 查看详情

深度学习之pytorch实战——迁移学习

...(这篇博客其实很早之前就写过了,就是自己对当前学习pytorch的一个教程学习做了一个学习笔记,一直未发现,今天整理一下,发出来与前面基础形成连载,方便初学者看,但是可能部分pytorch和torchvision的API接口已经更新了,... 查看详情

基于cnn卷积神经网络的tensorflow+keras深度学习的人脸识别(代码片段)

基于CNN卷积神经网络的TensorFlow+Keras深度学习的人脸识别前言项目实现效果补充模型数据嵌入模型CNN神经网络模型项目概述项目运行流程核心环境配置项目核心代码详解目录核心代码设置数据集目录收集人脸识别数据——UUID格... 查看详情