PyTorch基本数据类型

PyTorch是没有string类型的,需要使用编码的方式来表达字符串。
下图也可以看到数据部署到CPU与GPU的类型描述是不同的。
在这里插入图片描述
type(a)查看a的类型
isinstance(a,torch.FloatTensor),判断a是否为torch.FloatTensor类型,是返回True
data=data.cuda()可以将数据部署位置变更为GPU

标量 dim=0

标量一般用在网络的最终输出,计算损失函数值
生成维度为0的数据

a=torch.tensor()#生成标量数据并赋给a
a.shape
a.size()
len(a.shape)
a.dim()
import torch
a=torch.tensor(1.0)
print(a,'\n',a.shape,'\n',a.size(),'\n',len(a.shape),'\n',a.dim())

在这里插入图片描述

向量(张量)

dim=1

一维向量一般使用在Bias(偏置)和线性输入
生成维度为1的向量

a=torch.tensor([])#生成向量数据并赋给a

在这里插入图片描述
生成不同维度的FloatTensor,不能指定内容,随机产生

a=torch.FloatTensor(1)
b=torch.FloatTensor(2)

在这里插入图片描述
从numpy中引入

a=numpy.ones(2)
b=torch.from_numpy(a)
print(b,'\t',type(b))

在这里插入图片描述

dim=2

**二维向量用于多重输入 **
在这里插入图片描述
size可以进行索引

a.size(0)#表示对dim索引,返回dim值
a.size(1)#表示对列索引
a=torch.randn(2,3)
print(a.size(),'\t',a.size(0),'\t',a.size(1))

在这里插入图片描述

dim=3…

三维向量一般用于RNN
与上面二维同理,只需要添加第三行。size的索引可以扩展到2。
四维适合图片的处理,用于CNN使用同上面的方法。

获取数据占用的内存大小

a.numel()#表示a占用的大小

创建tensor

从numpy中引入数据

import torch
import numpy
a=numpy.array([2,2.3])
b=torch.from_numpy(a)
print(b)

在这里插入图片描述

从list导入

直接在创建时使用list

import torch
a=torch.tensor([2,2.3])
print(a)

1
注意,小写的tensor接收数据,大写的Tensor主要接收维度(数据也可以,下面讲)

import torch
#import numpy
a=torch.Tensor([2,2.3])
b=torch.Tensor(1,2)
print(a,'\t',b)

不建议大写的传数据,容易混淆
在这里插入图片描述

创建未初始化的数据

一定要覆盖掉初始化的数据
创建mxn的空的矩阵,实际上里面不是空的,是填满了随机数

Torch.empty(m,n)

教程里推荐用这种,这是生成Float类型的

Torch.FloatTensor(d1,d2,d3)

生成Int类型的就用这个

Torch.IntTensor(d1,d2,d3)

创建随机初始换的数据

rand 在0-1之间随机生成;rand_like 生成一个与指定对象维度相同的对象,取值也在0-1之间;randint生成随机的整数对象,整数的范围需要给出[min,max),还有形状
在这里插入图片描述
正态分布的随机数N(0,1)
randn

设置默认的数据类型

在使用torch.tensor创建数据的时候,通常默认类型为float类型。
增强学习一般使用double类型,所以通常会更改默认的数据类型

torch.set_default_tensor_type(torch.DoubleTensor)#这样就可以设置成默认数据类型为double

统一操作

全部赋值、全部清零…full

a=torch.full([2,2],0)
b=torch.full([],1)#如果是标量的话
c=torch.full([2],1)#如果是向量的话

生成等差数列

起始为x,不包含m,步长为n

a=torch.arange(x,m,n)

从m到n,进行x等分,这里包含末端的n

a=torch.linspace(m,n,step=x)

从xm到xn进行x等分

a=torch.logspace(m,n,step=x)

生成全零矩阵、全一矩阵、单位阵

a=torch.ones(m,n)#生成全一矩阵
b=torch.zeros(m,n)#生成全零矩阵
c=torch.eye(m,n)#生成单位阵不是对角矩阵会忽略右侧

随机打散

0-n-1这n个整数进行随机打散排列

torch.randperm(n)

用于多个相关联矩阵的数据随机排列的index。

索引tensor

1.索引方式同python里

a[维度参数]
a[1,2,3,4]#这是对4维进行索引,缺少维度会按顺序排布

对于一个n维的tensor,如果给出n维的参数,会返回一个标量。

切片tensor

同python中的使用,使用冒号来连接

例子说明
1:3从1到3-1
1:从取到最后
:3从头取到3-1
:取全部
-1最后一个
0:28:2从0到28-1,步长为2取值

选取指定维度

在b维度进行筛选,从0开始计,tourch.tensor(值)用于给出选取该维度哪几列。

a.index_select(b,tourch.tensor())

…表示任意多的维度

例子说明
[1,…]对于n维的tensor,指定第一个维度选取1其他的选择全部
[1,…,4]对于n维的tensor,指定第一个维度选取1,最后一个维度选取4,其他维度全选。

masked_select(x,条件)

用来显示tensor中满足条件的数据。
返回的结果是一行数据,不会显示出在tensor中的维度信息。
在这里插入图片描述

torch.take(src,torch.tensor(值))

先打平数据,将多维tensor转化为一行,然后按顺序索引对应位置的数据(从0开始)。
在这里插入图片描述

维度变换

view与reshape

注意,这样的方式很容易造成数据无法恢复成原来的样子
两者没有差别,reshape是为了与python通用新增的,两者用法完全相同,这里以reshape为例
在这里插入图片描述
reshape的要求是,所有维度相乘的总值要求不变,对于上面的例子就是34=26
所以这种方法可以打平数据
在这里插入图片描述
在这里插入图片描述

squeeze与unsqueeze

squeeze挤压与unsqueeze展开,对维度增加或减少
a.unsqueeze(索引维度)
会在指定的索引维度前面添加一个维度。如果维度是负数,会在后侧添加。这个取值范围是在[-dim-1,dim+1)中选取。掌握正的或负的即可,任意一种都可以解决所有问题。
在这里插入图片描述
在维度前展开相当于把原有的东西放入一个箱子,在维度后展开相当于把原来的东西分份。
在这里插入图片描述
a.squeeze(索引维度)维度删减
删减指定维度(值为1才能删),如果不写会删除所有维度值为1的维度

expand与repeat

两者都是维度扩展,改变维度值。不会改变维度个数。
区别在于repeat在扩展的同时会把原有数据复制过去,expand只是扩展,但不会复制数据占用空间
只对维度值为1的才会起效果。如果哪个维度想保持不变,可以写-1
在这里插入图片描述
repeat中输入的参数是对应维度值要复制的次数
在这里插入图片描述

矩阵转置.t

a.t即可把a进行转置。
.t只适合二维矩阵

transpose(a,b)交换a,b两个维度

这个语句可以在高维度下使用,但实际还是对两个维度进行转换。
注意,转换之后使用view容易照成维度顺序模糊,后面最好跟上contiguous()
在这里插入图片描述

permute指定维度排序

括号中的值表示原来维度。
在这里插入图片描述

broadcasting

可以不复制数据来进行维度扩展
我的理解就是对照目标tensor与现有tensor变更成同样的形状
变更的方法是现有维度作为小的维度放置,其他用1补全,然后复制修改。
小维度:
在这里插入图片描述
在这里插入图片描述
更进一步的,目标是41,现有13,两者取最小公倍数变成两个4*3
在这里插入图片描述
broadcasting是为了解决实际的一些问题出现的,它可以用上面expand与repeat表示出来,但过程繁杂,内存占用更大。它是为了解决例如:[1,2,3,4]这样维度的tensor仅在最后一个(或几个)维度中更改数值而出现的。

拼接与拆分

cat拼接

torch.cat([拼接的torch],dim=拼接的维度)
拼接时要注意,除去拼接的那个维度外其他的维度的值必须相等。
在这里插入图片描述

stack

stack与cat不同,它会在拼接维度前添加一个新的维度,拼接维度的值不变。原有的维度必须完全相同。
在这里插入图片描述

split

根据长度拆分
拆分对象.split([每组中的个数],dim=拆分的维度)
这种方法是指定了每组中包含的数量
在这里插入图片描述
也可以指定步长,自动拆分
在这里插入图片描述

chunk

按数量拆分
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值