Pytorch学习(杂知识)

本文介绍了深度学习中的关键概念和技术,包括Mini-batch训练策略、魔法函数、PyTorch中的DataLoader和DataSet、transformers库概述、torchvision的组成部分、torch.no_grad()的作用、常见的激活函数(如ReLU、Softmax)、以及GoogLeNet网络和ResNets的残差结构。
摘要由CSDN通过智能技术生成

目录

Mini-batch

魔法函数

DataLoader与DataSet

transformers的简介

torchvision简介

torch.no_grad()

Softmax

ReLu

随机梯度下降(Stochastic Gradient Descent,SGD)

torch.nn.CrossEntropyLoss(),交叉损失函数

Tensor:张量

F.avg_pool2d()函数

torch.nn.MaxPool2d

torch.cat

torch.nn.Conv2d

GoogLeNet网络

一、GoogLeNet网络的背景

二、Inception模块

ResNets  残差网络


Mini-batch

        Mii-batch是一种在机器学习中常用的训练算法。它是将大的数据集分成一些小的数据集每次只用一个小的数据集来训练模型。通常情况下,训练数据集中的数据越多,训练出的模型越准确,但是如果数据集太大,就会导致计算量过大,训练时间过长。因此,使用Mini-batch的方法可以在保证模型训练准确性的同时,降低计算时间和内存的消耗。在mini-batch中,每个小的数据集被称为一个patch,通常情况下,每个batch的大小是相同的。在训练过程中,每个batch都会被输入到模型中进行训练,模型的参数会根据每个batch的误差进行更新。这样,在训练过程中,每个batch都会为模型提供一些不同的信息,从而增强模型的泛化能力。
        使用mini-batch的方法可以在保证模型训练准确性的同时,降低计算时间和内存的消耗,同时还可以带来更好的泛化性能。因此,mini-batchi已经成为了深度学习中的一种常用的训练算法。

        链接:https://wenku.csdn.net/answer/7e8ca99bbfd84184b4ba9957911f4ccd

魔法函数

        魔法函数指的是Python中的特殊函数,它们以双下划线开头和结尾,如__init__、__str__等。这些函数在Python内部被调用,它们可以实现一些特殊的功能,比如重载运算符、创建对象、打印对象等。 

DataLoader与DataSet

        DataLoader与DataSet是PyTorch数据读取的核心,是构建一个可迭代的数据装载器,每次执行循环的时候,就从中读取一批Batchsize大小的样本进行训练。

  • Dataset:负责可被Pytorch使用的数据集的创建
  • Dataloader:向模型中传递数据

链接:Python中的Dataset和Dataloader详解_python_脚本之家

transformers的简介

         transformers提供了数千个预先训练好的模型来执行不同模式的任务,如文本、视觉和音频。这些模型可应用于:

  • 文本:用于文本分类、信息提取、问题回答、摘要、翻译、文本生成等任务,支持100多种语言。
  • 图像:用于图像分类、对象检测和分割等任务。
  • 音频:用于语音识别和音频分类等任务。

       transformer模型还可以在几种组合模式上执行任务,例如表格问题回答、光学字符识别、从扫描文档中提取信息、视频分类和视觉问题回答。
       transformer提供了api,可以快速下载并在给定文本上使用这些预训练的模型,在您自己的数据集上对它们进行微调,然后在我们的模型中心上与社区共享。同时,每个定义架构的python模块都是完全独立的,可以进行修改以进行快速研究实验。
       transformer由三个最流行的深度学习库——Jax、PyTorch和TensorFlow——支持,并在它们之间无缝集成。在加载模型进行推理之前,先用一个模型训练它们是很简单的。您可以从模型中心直接在它们的页面上测试我们的大多数模型。我们还提供私有模型托管、版本控制和公共和私有模型的推理API。

链接:Py之transformers:transformers的简介、安装、使用方法、案例应用之详细攻略_python transformers-CSDN博客
 

torchvision简介

torchvision是pytorch的一个图形库,它服务于PyTorch深度学习框架的,主要用来构建计算机视觉模型。以下是torchvision的构成:

    torchvision.datasets: 一些加载数据的函数及常用的数据集接口;
    torchvision.models: 包含常用的模型结构(含预训练模型),例如AlexNet、VGG、ResNet等;
    torchvision.transforms: 常用的图片变换,例如裁剪、旋转等;
    torchvision.utils: 其他的一些有用的方法。

原文链接:torchvision详细介绍-CSDN博客

torch.no_grad()

torch.no_grad() 是 PyTorch 中的一个上下文管理器,用于在进入该上下文时禁用梯度计算。
    这在你只关心评估模型,而不是训练模型时非常有用,因为它可以显著减少内存使用并加速计算。当你在 torch.no_grad() 上下文管理器中执行张量操作时,PyTorch 不会为这些操作计算梯度。这意味着不会在 .grad 属性中累积梯度,并且操作会更快地执行。

激活函数:

激活函数通常作用于神经元的加权输入/激活前的值(weighted sum),并产生一个非线性的输出值,作为神经元的激活状态,用于传递给下一层神经元或作为输出层的最终输出。

常用的非线性函数包括:

  1. Sigmoid函数:将输入映射到[0, 1]之间,常用于二分类问题或者作为输出层的激活函数。

  2. Tanh函数:将输入映射到[-1, 1]之间,也常用于二分类问题或者作为输出层的激活函数。

  3. ReLU函数(Rectified Linear Unit):将负数输入映射为0,保留正数输入,常用于隐藏层的激活函数。

  4. Softmax函数:将输入映射为概率分布(输出的向量的每一个值都为正而且元素之和为一)。常用于多分类问题的输出层。

Q:为什么一定要做非线性变换?

A:激活函数引入了非线性操作,使得神经网络可以更好地拟合复杂的非线性关系。如果神经网络只使用线性激活函数,那么整个网络将只是多个线性操作的组合,无法处理非线性数据或者学习非线性映射。

Softmax

Softmax是一种激活函数,它可以将一个数值向量归一化为一个概率分布向量,且各个概率之和为1。Softmax可以用来作为神经网络的最后一层,用于多分类问题的输出。Softmax层常常和交叉熵损失函数一起结合使用。

对于二分类问题,我们可以使用Sigmod函数(又称Logistic函数)。将(−∞,+∞)范围内的数值映射成为一个(0,1)区间的数值,一个(0,1)区间的数值恰好可以用来表示概率。对于多分类问题,一种常用的方法是Softmax函数,它可以预测每个类别的概率。

链接:三分钟读懂Softmax函数 - 知乎 (zhihu.com)

ReLu

ReLu,全称是Rectified Linear Unit,中文名称是线性整流函数,是在神经网络中常用的激活函数。通常意义下,其指代数学中的斜坡函数,即

         引入非线性激活函数的目的是提高神经网络的非线性拟合能力,增强模型的表达能力。因此,在表述过程中,在没有明确指明的情况下,激活函数指代非线性激活函数。经过严格的数学推导,如果网络中没有使用激活函数,每一层的节点的输入都是上层输出的线性函数,无论神经网络中的隐含层有多少,最后的输出结果都是网络输入的线性拟合,即隐含层没有发挥其作用。为此,引入非线性函数作为激活函数来提高模型的表达能力。

传送门: 谈谈神经网络中的非线性激活函数——ReLu函数

隐层

在人工神经网络 ANN中,隐层(Hidden Layer)是位于输入层和输出层之间的一层或多层神经元的集合。作为神经网络中的中间层,隐层负责对输入数据进行特征提取和转换,从而实现复杂的非线性映射关系。

神经网络的训练

前向传播(Forward Propagation)

前向传播(Forward Propagation)是一种在神经网络中进行信息传递的过程,它是神经网络训练的第一步。在前向传播中,输入数据通过神经网络的多个层(包括输入层、隐藏层和输出层)按照预定的权重和偏置进行计算,从输入层传递到输出层,最终得到神经网络的预测结果。

梯度下降

梯度下降法:是寻找极小值的一种方法。通过向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索直到在极小点收敛

随机梯度下降(Stochastic Gradient Descent,SGD)

optim.SGD是PyTorch中的一个优化器,其实现了随机梯度下降(Stochastic Gradient Descent,SGD)算法。在深度学习中,我们通常使用优化器来更新神经网络中的参数,以使得损失函数尽可能地小。

在PyTorch中使用optim.SGD优化器,一般需要指定以下参数:

  • params:需要更新的参数,通常为模型中的权重和偏置项。
  • lr:学习率,即每次参数更新时的步长。
  • momentum:动量,用来加速模型收敛速度,避免模型陷入局部最优解。
  • dampening:动量衰减,用来控制动量的衰减速度。
  • weight_decay:权重衰减,用来防止模型过拟合,即通过对权重的L2正则化来约束模型的复杂度。
  • nesterov:是否使用Nesterov动量。

损失函数

损失函数(Loss Function),也称为目标函数、成本函数或目标损失函数,是在监督式学习中用来度量模型预测值与真实标签之间差异的函数。

torch.nn.CrossEntropyLoss(),交叉损失函数

  1. 交叉熵损失函数会自动对输入模型的预测值进行softmax。因此在多分类问题中,如果使用nn.CrossEntropyLoss(),则预测模型的输出层无需添加softmax。
  2. nn.CrossEntropyLoss()=nn.LogSoftmax()+nn.NLLLoss()。
  3. 交叉熵损失函数用于分类任务,均方误差损失函数用于回归任务。

# Construct loss and optimizer, using PyTorch API
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

# Training cycle: forward, backward, update
# 前馈算loss,反馈计算关于loss的梯度,更新是用梯度下降算法利用的梯度进行更新
def train(epoch):
    running_loss = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        # 获得一个批次的数据和标签
        inputs, target = data
        optimizer.zero_grad()
        
        # forward + backward + update
        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if batch_idx % 300 == 299:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))
            running_loss = 0.0

 传送门:torch.nn.CrossEntropyLoss() 参数、计算过程以及及输入Tensor形状 - 知乎

反向传播

反向传播(Backpropagation)用于计算神经网络中各层权重和偏置的梯度,从而实现模型参数的更新。它是前向传播的逆过程,通过计算损失函数对神经网络输出的梯度,逐层向后传播,从输出层到输入层,计算每一层的梯度,并用于更新模型参数。

梯度消失问题(Gradient Vanishing)是指在深度神经网络中,反向传播算法中计算的梯度在网络的较深层逐渐变得非常小,甚至趋近于零,从而导致这些层的权重更新变得非常缓慢或停止更新,使得这些层的参数无法得到有效的训练。

梯度爆炸是要经过多次的连乘,每次乘法操作都可能将梯度放大,从而导致梯度值变得非常大,从而导致梯度爆炸(Gradient Explosion)。

优化算法

优化算法:优化算法就是决定在更新参数时如何调整步长、方向等因素,以最小化损失函数的值。随机梯度下降是最常见的优化算法。

Transformer模型

Transformer 的整体结构

原版的Transformer有六个编码器和六个解码器

Transformer本义为变压器,变换器,读作/trænsˈfɔːmə(r)/ 。2017年6月,谷歌团队发表的论文《Attention Is All You Need》中,Transformer第一次出现在人工智能的语境中,当时他被解释为一种基于注意力的编码器/解码器模型。天,当我们再谈论Transformer时,他已经是人工智能的经典框架,形成了一个大家族。

Transformer模型的设计解决了传统循环神经网络(RNN)和卷积神经网络(CNN)在处理长序列数据时的一些限制。其中,最重要的特性是自注意力机制(Self-Attention)和多头注意力机制(Multi-Head Attention)。Transformer 模型通过自注意力机制(self-attention)来建立输入序列中不同位置之间的依赖关系,从而有效地捕捉序列中的长程依赖关系。

Tensor:张量

# In PyTorch, Tensor is the important component in constructing dynamic computational graph
w = torch.tensor([1.0]) # w的初值为1.0
w.requires_grad = True # 需要计算梯度
# If autograd mechanics are required, the element variable requires_grad of Tensor has to be set to True.

# Tensor:张量(Tensor):是一个多维数组,它是标量、向量、矩阵的高维拓展。
# tensor即张量,它是一种数据结构,用来表示或者编码神经网络模型的输入、输出和模型参数等。

Tensor:张量(Tensor):是一个多维数组,它是标量、向量、矩阵的高维拓展。
tensor即张量,它是一种数据结构,用来表示或者编码神经网络模型的输入、输出和模型参数等。

F.avg_pool2d()函数

avg_pool2d(input, kernel_size, stride=None, padding=0, ceil_mode=False, count_include_pad=True, divisor_override=None)

执行2D平均池化操作,入参:

  • input:输入tensor, [batch_size,channels,height,width]
  • kernel_size: 池化区域尺寸,可以是一个数n,kernel=(n,n),或者形如(kh,kw)
  • stride: 池化操作的步长,标量或者(sh,sw).默认和kernel一致,这是个二维的,所以在height和width上均和kernerl一致,越界同样丢弃。
  • padding:默认是在输入input的四周补以0,可以指定为一个标量或(padh,padw)
  • ceil_mode: true(use ceil), false(use floor)
  • count_include_pad: true(计算平均数时包含补边0

pytorch中的F.avg_pool2d()平均池化操作用于二维,input是维度是4维;

pytorch中的F.avg_pool1d()平均池化操作用于一维,input的维度是三维。

torch.nn.MaxPool2d

作用:对邻域内特征点取最大,减小卷积层参数误差造成估计均值的偏移的误差,更多的保留纹理信息。

传送门:Pytorch学习笔记(四):nn.MaxPool2d()函数详解-CSDN博客

torch.cat

torch.cat(tensors, dim=0, *, out=None),也就是有两个参数,一个是要合并的张量,一个是在哪个维度上进行合并。函数将两个张量(tensor)按指定维度拼接在一起,注意:除拼接维数dim数值可不同外其余维数数值需相同,方能对齐。

dim = 0:按列对其
dim = 1:按行对其

传送门:Pytorch中torch.cat()函数解析-CSDN博客

torch.nn.Conv2d

nn.Conv2d:对由多个输入平面组成的输入信号进行二维卷积;

传送门:pytorch中的torch.nn.Conv2d()函数图文详解_python_脚本之家

GoogLeNet网络

一、GoogLeNet网络的背景

想要更好的预测效果,就要从网络深度和网络宽度两个角度出发增加网络的复杂度。

但这个思路有两个较为明显的问题:

        首先,更复杂的网络意味着更多的参数,也很容易过拟合;

        其次,更复杂的网络会消耗更多的计算资源,而且卷积核个数设计不合理,导致了卷积核中参数没有被完全利用(多数权重都趋近0)时,会造成大量计算资源的浪费。因此GoogLeNet在专注于加深网络结构的同时,引入了新的基本结构——Inception模块,以增加网络的宽度。GoogLeNet一共22层,没有全连接层,在2014年的ImageNet图像识别挑战赛中获得了冠军。

二、Inception模块

GooLeNet 的Inception模块的基本组成结构有四个:1x1卷积,3x3卷积,5x5卷积,3x3最大池化。

 传送门:GoogLeNet详解-CSDN博客

ResNets  残差网络

ResNet是在2015年有何凯明,张翔宇,任少卿,孙剑共同提出的,ResNet使用了一个新的思想,ResNet的思想是假设我们涉及一个网络层,存在最优化的网络层次,那么往往我们设计的深层次网络是有很多网络层为冗余层的。那么我们希望这些冗余层能够完成恒等映射,保证经过该恒等层的输入和输出完全相同。具体哪些层是恒等层,这个会有网络训练的时候自己判断出来。

 残差网络从一定程度上解决了模型退化问题(由于优化困难而导致,随着网络的加深,训练集的准确率反而下降了),它在一个块的输入和输出之间引入一条直接的通路,称为跳跃连接。
       跳跃连接的引入使得信息的流通更加顺畅:一是在前向传播时,将输入与输出的信息进行融合,能够更有效的利用特征;二是在反向传播时,总有一部分梯度通过跳跃连接反传到输入上,这缓解了梯度消失的问题。
【引自:《PyTorch深度学习实践9》——卷积神经网络-高级篇(Advanced-Convolution Neural Network)_advanced convolutional neural network-CSDN博客

如果我们使用标准优化算法训练一个普通网络,比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多。而理论上,随着网络深度的加深,应该训练得越来越好才对。也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。

        但有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达100层的网络也不例外。有人甚至在1000多层的神经网络中做过实验,这样就让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越深,网络连接会变得臃肿,但是ResNet确实在训练深度网络方面非常有效。

传送门:残差网络(Residual Network)-CSDN博客

对于一张黑白的手写的数字,我们应该以什么作为它的特征,输入给机器让他学习呢?

答案是,构成这张图的28*28=784个像素点的灰度!对于每一个像素,我们都给他赋一个从0到1的值。一个像素点越黑,他就越接近0;一个像素点越白,他就越接近1。

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值