PyTorch深度学习基础

第四章PyTorch深度学习基础

在介绍PyTorch之前,读者需要先了解NumPy。NumPy是用于科学计算的框架,它提供了一个N维矩阵对象ndarray和初始化、计算ndarray 的函数,以及变换ndarray形状、组合拆分ndarray的函数。

PyTorh的Tensor和NumPy的ndarray 十分类似,但是Tensor具备两个ndarray不具备面对于深度学习来说非常重要的功能。其一是Tensor能利用GPU计算,GPU根据芯片性能的不同,在进行矩阵运算时,能比CPU快几十倍。其二是Tensor在计算时,能够作为节点自动地加入计算图,而计算图可以为其中的每个节点自动计算微分,下面我们介绍Tensor对象及其运算。后面的代码都依赖于以下两个模块

import torch

import numpy as np

4.1Tensor对象及其运算

Tensor对象是一个任意维,度的矩阵,但是一个Tensor中所有元素的数据类型必须一致。torch包含的数据类型和普遍编程语言的数据类型类似,包含浮点型、有有符号整型和无符号整型。这些类型既可以定义在CPU上,t也可以定义在GPU上。在使用Tenso r数据类型时,可以通过dtype属性指定它的数据类型,device指定它的设备(CPU或者GPU)。

 

通过device在GPU上定义变量后,可以在终端上通过nv idia-smi 命令查看显存(显卡内存)占用。torch还支持在CPU GPU之间复制变量。

对Tensor执行算数运算符的运算,是两个矩阵对应元素的运算。torch.mm执行矩阵乘法的运算。

此外,还有一些具有特定功能的函数,    这里列举一部分。torch.clamp起到分段函数的作用,    
可用于去掉矩阵中过小或者过大的元素;torch.round将小数转为整数;torch.tanh计算双曲正切函数,该函数将数值映射到(0,1)。 

除了直接从ndarray或list类型的数据中创建Tensor,PyTorch 还提供了一些可直接创建数据的函数,这些函数往往需要提供共矩阵的维度。torch.arange和Python内置的range的使用方法基本相同,其中第3个参数是步长长torch.linspace的第3个参数指定返回的个数torch.ones 返回全0,torch.zeros返回全0矩阵

torch.rand 返回范围为[0,1]的均匀分布采样!的元素所组成的矩阵,torch.randn返回从正态分布采样的元素所组成的矩阵,torch.randint返回回指定区间的均匀分布采样的随机整数所生成的矩阵。

4.2 Tensor的索引和切片

Tensor支持基本索引和切片操作,不仅如此,它还支持ndarray中的高级索引(整数索引和布尔索引)操作。

torch.nonzero用于返回非零值的索引矩阵。torch.where(condition,x,y)判断conditio n 的条件是否满足。当某个元素满足条件时,则返回对应矩阵x相同位置的元素,否则返回矩降阵y的元素。
 

4.3 Tensor的变换、拼接和拆分    


PyTorch提供了大量的对Tensor进行操作的函数或方法,这些函数内部使用指针实现对矩阵的形状变换、拼接和拆分等操作,使得我们无须关心Tensor在内存的物理结构或者管理指针就可以方便且快速地执行这些操作。Tensor.nele ement、Tensor.ndimension、ndimension.size可分别用来
查看矩阵元素的个数、轴的个数以及维度属性Tensor.shape也可以用来查看Tensor的维度。 
   
在PyTorch中,Tensor.view和Tensor.re shape 都能被用来更改Tensor的维度。它们的区别在于,Tensor.view要求Tensor的物理存储必必须是连续的,否则将报错;而Tensor.reshape则没有这种要求。但是,Tensor.view返回的一定是一个索引,更改返回值,则原始值同样被更改; Tensor.reshape返回的是引用还是复制是不确角定的。它们的相同之处是都接收要输出的维度作为参数,且输出的矩阵元素个数不能改变,可以在维度中输入-1,PyTorch会自动推断它的数值,

torch.squeeze 和 torch.unsqueeze用于为Tensor去掉和添加轴。其中torch.squeeze用于去掉维度为1的轴,而torch.unsqueeze用于给Tensor的指定位置添加一个维度为1的轴。
torch.t 和 torch.transpose用于转置二维矩阵。对于高维度Tensor,可以使用permute方法来变换维度。PyTorch提供torch.cat和torch.stack用于拼接矩阵。除了拼接矩阵还提供了torch.split和torch.chunk用于拆分矩阵。

4.4PyTorch的Reduction操作

Reduction 操作的特点是它往往对一个 Tensor 内的元素执行归约操作,比如torch.max 找极大值、torch.cumsum计算累加,它还提供了 dim参数来指定沿矩阵的哪个维度执行操作。

4.5    PyTorch的自动微分    


当将Tensor 的requires_grad属性设置为True 时,PyTorch的 torch.autograd会自动追踪它的计算轨迹。当需要计算微分的时候,只需要对最终计算结果的Tensor调用backward方法,所有计算节点的微分就会被保存在grad属性。
Tensor.detach会将Tensor从计算图剥离出去不在计算它的微分。

with torch.no_grad():包括代码段不会计算微分。

第五章 Logistic回归

5.1    线性回归简介    


线性回归模型是指采用线性组合形式的回归模型,在线性回归问题中,因变量和自变量之间是线性关系的。

在线性回归中,我们假设随机变量𝑥1, ⋯ , 𝑥𝑛与𝑦之间的关系是线性的。但在实际中,我 们通常会遇到非线性关系。这个时候,我们可以使用一个非线性变换𝑔(⋅),使得线性 回归模型𝑓(⋅)实际上对𝑔(𝑦)而非𝑦进行拟合,即: 𝑦 = 𝑔 −1 𝑓 𝒙 • 其中𝑓(⋅)仍为: f 𝒙 = 𝒘⊤𝒙 + 𝑏 • 因此这样的回归模型称为广义线性回归模型。

广义线性回归模型使用非常广泛。例如在二元分类任务中,我们的目标是拟合这样一 个分离超平面𝑓(𝒙) = 𝒘⊤𝒙 + 𝑏,使得目标分类𝑦可表示为以下阶跃函数: 𝑦 = ቊ 0, 𝑓(𝒙) < 0 1, 𝑓(𝒙) > 0 • 但是在分类问题中,由于𝑦取离散值,这个阶跃判别函数是不可导的。不可导的性质 使得许多数学方法不能使用。我们考虑使用一个函数 𝜎(⋅) 来近似这个离散的阶跃函数, 通常可以使用logistic函数。(Sigmoid 函数)

 逻辑回归模型:只是在线性回归之后加了一个sigmoid激活函数!将值映 射在【0,1】之间。

损失函数:MSE loss:计算数值之间的差异  BCE loss:计算分布之间的差异。

用PyTorch实现Logistic回归代码依赖于

逻辑回归实现同样是四个步骤: • 准备数据集 • 设计模型 • 定义损失函数和优化器 • 模型训练

代码实现如下:

Logistic 回归是深度学习中最基础的非线性生模型之一。在介绍Logistic回归以前,本章首先介绍了线性回归作为铺垫。线性回归的预测目标是连续变量,而Logistic回归的预测目标是二元变量。为了应对这一差异,Logistic回归在线性回归的基础上加入了sigmoid激活函数。本章最后使PyTorch实现了Logistic回归模型,读者可以通过这个例子进一步体会深度学习模型构建的整体流程以及框架编程的简便性。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值