pytorch入门三 数据类型与函数

  1. 张量

  • pytorch中提供了不同数据类型的张量:

cpu情形下:

通用类型  torch.Tensor
float型  torch.FloatTensor
double型  torch.DoubleTensor
int型  torch.IntTensor
long型  torch.LongTensor
byte型  torch.ByteTensor

gpu情形下:

float型  torch.cuda.FloatTensor
double型  torch.cuda.DoubleTensor
int型  torch.cuda.IntTensor
long型  torch.cuda.LongTensor
byte型  torch.cuda.ByteTensor

注意:torch.Tensor,torch.FloatTensor,torch.DoubleTensor,torch.IntTensor,torch.LongTensor,torch.ByteTensor传入的参数即可以是张量的shape,也可以是张量的值,而torch.tensor则传入的是张量的值且只能传一组数值。

torch.tensor的值:

Tensor,...,ByteTensor的值:

当传入的参数是值时,张量的值是确定的。

Tensor,...,ByteTensor的shape参数:

当传入的参数是shape时,张量的值是不确定的,默认的数据类型是torch.float32

注意:pytorch框架里没有提供string这样的数据类型,所以为了表示某个标记之类的,可以使用one-hot编码或者Embedding(常用的Word2vec/glove

 

  1. 张量属性/方法

  • 索引

张量可以像数组那样进行索引,例如:

另外可以使用内置的index_inselect方法进行索引,该方法可以自定义索引多个行列(比如取第1/3/4行(列)),该方法传入两个参数分别为张量维度以及张量中的索引(注意索引传入类型为张量),

例如,index_inselect(dim,index),当dim=0时,对于张量a来说,选择的是张量a的第0维,即行,然后index=torch.tensor(0)表示选择了第0行,index=torch.tensor(1)表示选择了第1行;

同理当dim=1时,对于张量a来说,选择的是张量a的第1维,即列,然后index=torch.tensor(0)表示选择了第0列,index=torch.tensor([0,1])表示选择了第0列和第1列;

 

  • 切片

张量可以像数组那样进行切片,例如:

注意:2 表示[0,2),不包含索引2

::2 表示从0索引开始,每隔2个间隔取一个索引

... 表示对这部分全取,例如:

  • 逻辑操作

可以像数组那样进行逻辑操作,举例:

  • 张量形状

shape 或者内置方法size() ,例如

  • data 获取张量数据

  • item()  获取数据,仅当只有一个数据时才能用

  • dim() 获取张量维度

注意:标量的维度为0

  • numel() 获取张量元素数目 

  • type()  获取张量类型

注意:使用python内置的type()函数只能知道其是torch.Tensor类型

  • cpu 与gpu 数据互换

(低版本pytorch用法)

高版本用法:

  • 修改张量的形状

view()/reshape()两个方法一样

contiguous:view只能用在contiguous的variable上。如果在view之前用了transpose, permute等,需要用contiguous()来返回一个contiguous copy。
一种可能的解释是:
有些tensor并不是占用一整块内存,而是由不同的数据块组成,而tensor的view()操作依赖于内存是整块的,这时只需要执行contiguous()这个函数,把tensor变成在内存中连续分布的形式。
判断是否contiguous用torch.Tensor.is_contiguous()函数。

  • 转置操作 t()

  • transpose()

将指定维度对调,如果在2维情况,就相当于是转置,举例:

  • permute()

transpose类似也是对调维度,但使用不太一样

  • pow()  对张量进行幂运算,也可以用**代替
  • sqrt()  对张量取平方根

  • rsqrt()  取平方根的倒数

  • exp()   取e为底的幂次方

    e值:2.718281828459

  • log() 取log以e为底的对数   对应的还有以2为底的log2()、以10为底的log10()

  • round() 四舍五入

  • floor() 向下取整

  • ceil() 向上取整

  • trunc()/frac() 取整数/小数部分

  • max()/min()/median()/mean() 取最大值、最小值、中位数和平均值

注意:该方法默认将全部数据变成一维,并取整个数据里的最大/最小之类的值。如需要取特定维的数据,可以通过dim参数设置。

另外,设置了特定维的max函数返回两部分tensor,第一部分tensor为数值,第二部分为数值对应的索引。

还有一个keepdim参数,可以控制返回的格式和之前相同

  • sum()/prod() 求累加、累乘

该方法也可以使用dim参数对某维度进行运算

  • argmax()/argmin()  返回最大/小值的索引

该方法同样默认会将全部数据变成一维的,并计算整个数据里最大值的索引

  • argsort() 返回从小到大(默认,可以通过descending参数设置)的索引
  • topk()

    返回前几大的值,返回结果按从大到小排序(取前几小的值设置参数largestFalse,返回结果从小到大排序

  • kthvalue()   返回第几小的数

  • norm() 计算张量的范数(可以理解成张量长度的模),默认是l2范数(即欧氏距离)

注意:norm()只支持floating-point dtypes计算

  • clamp(min,max)  设置张量值范围
  • squeeze() 在指定索引位置删减维度,如果不传入索引,将会把所有能删减的维度(值为1)都删减
  • unsqueeze() 在指定索引位置增加维度

  • expand() 扩展数据,但仅限于维度是1的地方

  • repeat() 复制数据,对指定维度复制指定倍数

  • split() 根据长度切分数据

  • chunk 根据数量切分数据,也就是自定义要切成多少份

常用方法

数组/张量转换

  • 数组转张量: torch.from_numpy 

  • 张量转数组:data.numpy(),若为gpu数据,先转cpu,再调用data.numpy();或者使用numpy强制转换np.array(tensor)

基本运算

  • torch.add 加法运算,一般情况下也可以用+号代替
  • torch.sub 张量减法

  • torch.mul 张量乘法

  • torch.div 张量除法

  • torch.matmul 矩阵乘法  python3.5矩阵乘法还可以用@代替

逻辑操作

  • torch.equal 判断两个张量是否完全相等,返回True或者False

注意:  ==符号返回的只是一个由0和1组成的张量

  • torch.all 逻辑与操作,判断是否全为1
  • torch.any 逻辑或操作,判断是否存在1

  • torch.where 有三个参数a, b, c,对数据a进行逻辑判断,为1的取数据b上对应位置的值,为0取c上对应值

数据生成

  • torch.zeros 生成固定尺寸的全0张量
  • torch.ones 生成固定尺寸的全1张量

  • torch.full 生成固定尺寸的值全为指定值的张量

  • torch.eye 生成对角线上值全为1的张量

  • torch.arange 生成指定等差数列的张量

  • torch.linspace 生成等差数列的张量,用法和arrange稍有不同

  • torch.logspace 和linspace用法相似,可以理解成再linspace的基础上对其求10的n次方值

  • torch.rand 随机生成一个固定尺寸的张量,并且数值范围都在0~1之间

  • torch.randn 随机生成固定尺寸的张量,数值符合正态分布

  • torch.randint 随机生成一个固定尺寸的张量,并且数值为自定义范围的整数

  • torch.randperm 生成指定个数的张量(范围为0~个数-1)并打乱

  • torch.rand_like 传入一个张量,并根据该张量shape生成一个新的随机张量

注:有好多xxx_like的方法,原理都是一样的:传入一个张量,根据张量的shape生成新的张量

数据处理

  • torch.masked_select 取出指定条件数据
  • torch.cat 在指定维度合并数据,但要求两个数据维度相同,并且指定维度以外的维度尺寸相同

torch.stack 在指定维度创建一个新维度合并两个数据

其他操作

  • one-hot编码 通过结合torch.zeros()方法和tensor.scatter_()方法实现
  • 带下划线的方法

pytorch里面可以看到很多方法有两种版本:带下划线和不带下划线的,这两者的区别就是:不带下划线的方法操作数据会先新建一个相同的数据,然后对其进行操作后返回;带下划线的则直接对该数据进行操作并返回(声明该tensor是个in-place类型)

工具集

torch.utils下提供了很多API工具方便我们的使用

  • 随机切分数据集

通过torch.utils.data.random_split()方法随机切分数据集,通过torch.utils.data.DataLoader来载入数据

  • 函数式API和类API

在pytorch当中,大部分神经网络层、激活函数、损失函数等都提供了两种API调用方式,分别是函数式API和类API,前者基本都在torch.nn.functional下,后者基本都在torch.nn下,前者一般直接调用即可,适合函数式编程;后者一般是先实例化,然后通过其内置的方法进行调用,适合面向对象编程。当然这些API功能基本都可以自定义实现,只是这里提供了API简化了操作,并且还提供了GPU加速等功能

 

 

 

 

原文https://www.jianshu.com/p/5460b7fa3ec4

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值