第4章 PyTorch深度学习基础

Pytorch的对比学习:Pytorch中的Tensor和Numpy中的ndarrary十分相似,但是Tensor(张量)具备两个ndarray不具备而对于深度学习来说非常重要的功能。其一是:Tensor能利用GPU计算,GPU根据芯片性能不同来进行矩阵计算时,能比CPU快几十倍;其二是:Tensor在计算时,能够作为节点自动地加入计算图,而计算图可以为其中的每个节点自动计算微分。

要进行Tensor对象及其运算,要先在pycharm中导入以下两个库:

Tensor对象是一个任意维度的矩阵,但是Tensor中所有元素的数据类型必须一致。

torch包含的数据类型:浮点型、有符号整型和无符号整型。这些类型既可以定义在CPU上,也可以定义在GPU上。

一、Tensor对象及其运算

1.可以通过dtype属性指定它的数据类型,device指定它的设备(GPU或者CPU)。

下图示例为没有GPU的代码及其结果显示:

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

下图示例为没有GPU的代码及其结果显示:

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

代码及其结果显示:

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

代码及其结果显示:

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

代码及其结果显示:

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

代码及其结果显示:

二、Tensor的索引和切片

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

代码及其结果显示:

2. torch.nonzeros用于返回非零值的索引矩阵。

代码及其结果显示:

3. torch.where(condition,x,y)判断condition的条件满足。当某个元素满足条件时,则返回对应矩阵x相同位置的元素,否则返回矩阵y的元素。

代码及其结果显示:

三、 Tensor的变换、拼接和拆分

Pytorch提供了大量的对Tensor进行操作的函数或方法,这些函数内部使用指针实现对矩阵的形式变换、拼接和拆分等操作,使得我们无需关心Tensor在内存的物理结构或者管理指针就可以方便且快速地执行这些操作。

1.Tensor.nelement、Tensor.ndimension、ndimension.size可分别用来查看矩阵元素的个数、轴的个数以及维度,属性Tensor.shape也可以用来查看Tensor的维度。

代码及其结果显示:

元素个数=每个维度的大小相乘

轴的个数=维度个数

矩阵维度是指张量的形状,即每个维度的大小。

2.在Pytorch中,Tensor.view和Tensor.reshape都能被用来更改Tensor的维度。它们的区别在于Tensor.view要求Tensor的物理存储必须是连续的,否则将报错;而Tensor.reshape则没有这种要求。但是,Tensor.view返回的一定是一个索引,更改返回值,则原始值同样被更改;Tensor.reshape返回的是引用还是复制是不确定的。它们的相同之处是都接收要输出的维度作为参数,且输出的矩阵元素个数不能改变,可以在维度中输入-1,Pytorch会自动推断它的数值。

代码及其结果显示:

3. torch.squeeze(挤压)和torch.unsqueeze用于Tensor去掉和添加轴(维度)。其中torch.squeeze用于去掉维度为1的轴,而torch.unsqueeze用于Tensor的指定位置添加一个维度为1的轴。

代码及其结果显示:

4. torch.t和torch.transpose用于转置二维矩阵(行列互换)。这两个函数只接收二维Tensor,torch.t是torch.transpose的简化版。

代码及其结果显示:

5. 对于高维度的Tensor,可以使用permute方法来变换维度。

代码及其结果显示:

6.Pytorch提供了torch.cat和torch.stack(堆叠)用于拼接矩阵。不同之处是,torch.cat在已有的轴dim上拼接矩阵,给定轴的维度可以不同,而其他轴的维度必须相同。torch.stack在新的轴上拼接,它要求被拼接的矩阵的所有维度都相同。

代码及其结果显示:

7. 除了拼接矩阵,Pytorch还提供了torch.split和torch.split和torch.chunk用于拆分矩阵。它们的不同之处在于,torch.split传入的是拆分后每个矩阵的大小,可以传入list,也可以传入整数,而torch.chunk传入的是拆分的矩阵个数。

代码及其结果显示:

四、Pytorch的reduction操作

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

代码及其结果显示:

五、Pytorch的自动微分

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

代码及其结果显示:(红色部分为一个警告)

2.Tensor.detach会将Tensor从计算图剥离出去,不再计算它的微分。

代码及其结果显示:(红色部分为一个警告)

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

代码及其结果显示:

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值