Python深度学习第四章知识点总结


学习目标:

此次知识点总结主要学习以下相关内容:

1.Tensor对象及运算

2.Tensor的索引和切片

3.Tensor的变换、拼接和拆分

4.Pytorch的Reduction操作

5.Pytorch的自动微分


学习内容:

一、Tensor对象及运算

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

import torch
import numpy as np
# torch.tensor
print('torch.Tensor 默认为:{}'.format(torch.Tensor(1).dtype))
print('torch.tensor 默认为:{}'.format(torch.tensor(1).dtype))
# 可以用 list构建
a = torch.tensor([[1,2],[3, 4]],dtype=torch.float64)
#也可以用 ndarray构建
b = torch,tensor(np,array([[1,2],[3,4]]),dtype=torch.uint8)
print(a)
print(b)
#通过 device 指定设备
cuda0 = torch.device('cuda:0')
c=torch.ones ((2,2),device=cuda0)
print(c)

对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返回指定区间的均匀分布采样的随机整数所生成的矩阵。

二、Tensor的索引和切片

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

import  torch

#基本索引
a=torch.arange(9).view(3,3)
print(a[2,2])

#切片
print(a[1:,:-1])
#row:1,2 col:1,2  -1:取开区间

# 带步长的切片
print(a[::2])
print(a[::2,::2])

#整数索引
a=torch.arange(9).view(3,3)
rows=[0,1]
cols=[2,2]
print(a[rows,cols])

#布尔索引
index=a>4
print(index)
print(a[index])

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

import torch
# torch.nonzero用于返非0的索引矩阵
a=torch.arange(16).view(4,4)
index=torch.nonzero(a>=8)
print(index)
a=torch.randint(0,2,(3,3))
index=torch.nonzero(a)
print(index)

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

import torch

#使用torch.where
x=torch.randn(3,2)
y=torch.ones(3,2)
print(x)
print(torch.where(x>0,x,y))

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

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

import torch

a=torch.rand(1,2,3,4,5)
print("元素个数",a.nelement())
print("轴的个数",a.ndimension())
print("矩阵维度",a.size(),a.shape)

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

import torch

# tensor.view(),tensor.reshape()的使用
a=torch.rand(1,2,3,4,5)
b=a.view(2*3,4*5)
print(b.shape)
c=a.reshape(-1)
print(c.shape)
d=a.reshape(2*3,-1)
print(d.shape)

torch.squeeze和torch.unsqueeze用来给Tensor去掉和添加轴(维度)。 torch.squeeze用于去掉维度为1的轴 ,torch.unsqueeze用于给Tensor的指定位置添加一个维度为1的轴。

import  torch

# torch.squeeze()去掉轴(维度),torch.unsqueeze()添加轴(维度)的使用
a=torch.rand(1,2,3,4,5)
b=torch.squeeze(a)
print(b.shape)
c=torch.unsqueeze(b,1)
print(c.shape)

abfff32c9f3b4ba9b9a5d5e68e7980d3.png         torch.t和torch.transpose用于转置二维矩阵。这两个函数只接收二维Tensor,torch.t是torch.transpose的简化版。

import torch

# torch.t(),torch.transpose()用于转置二维矩阵
a=torch.tensor([[2]])
b=torch.tensor([[2,3]])
print(torch.transpose(a,1,0))
print(torch.t(a))
print(torch.transpose(b,1,0))
print(torch.t(b))

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

import torch

#高维度tensor使用permute方法转换维度
a=torch.rand((1,224,224,3))
print(a.shape)
b=a.permute(0,3,1,2)
print(b.shape)

PyTorch提供了torch.cat和torch.stack用于拼接矩阵。

torch.cat(tensors, dim): tensors里不同张量对应的待拼接维度的size可以不一致,但是其他维度的size要保持一致。

torch.stack(tensors, dim):tensors里所有张量的维度要保持一致,否则会报错

区别: torch.cat会在dim的维度上进行合并,不会扩展出新的维度。 torch.stack则会在dim的维度上拓展出一个新的维度,然后进行拼接,该维度的大小为tensors的个数。

import torch

#torch.cat(),torch.stack()拼接矩阵
a=torch.randn(2,3)
b=torch.randn(3,3)
#默认维度为dim=0
c=torch.cat((a,b))
d=torch.cat((b,b,b),dim=1)
print(c.shape)
print(d.shape)

torch.split和torch.chunk用于拆分矩阵。
        torch.chunk(input, chunks, dim): chunks是均匀分割的份数,如果在进行分割的维度上的size不能被chunks整除,则最后一份tensor会略小(也可能为空)。
        torch.split()可以说是torch.chunk()的升级版,它不仅可以按份数均匀分割,还可以按特定的方案进行分割。 如果第二个参数是分割份数,这就和torch.chunk()一样了;第二种是分割方案,是一个list类型的数据,待分割的张量将会被分割为len(list)份,每一份的大小取决于list中的元素。

import torch

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/cf00b0dec0ad651ce000c333ff695f65.png)

 

![img](https://img-blog.csdnimg.cn/img_convert/5d8a97cd851ac4028740fd249219caef.png)

![img](https://img-blog.csdnimg.cn/img_convert/46506ae54be168b93cf63939786134ca.png)

![img](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)

![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**

img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)**

<img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />
  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值