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)
注意,小写的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
按数量拆分