1、张量
1.1 pytorch和python的对比
- python:int、float、tuple(元组)、string
- pytorch:以tensor结尾,不同类型的tensor的维度不同
例如:整型数字tensor维度为0,二维数组tensor的维度为2维
1.2 pytorch特殊地方
-
pytorch不支持string,可以用one-hot编码表示字符
-
常见类型:float32对应pytorch:torch.FloatTensor
int32对应pytorch:torch.IntTensor
uint8对应pytorch:torch.ByteTensor(常用于判断两者是否相等)
1.3 基础语法
isinstance(a, b):如果a是类型b,则输出True
=====零维
torch.tensor(num):可以直接生成一个标量,标量维度为0
dimension:维度
a.dim() = len(a.shape):得到维度
a.shape和a.size()都可以得到torch.size([])
torch.size([x,y,z]):括号里有几个数字代表几维,数字大小为包含下层张量个数。
以此为例,即有三维,三维里有x个二维,每个二维包含y个一维,每个一维包含z个数
a.type():得到的就是数据类型,即inttensor、floattensor那些
=====一维张量
torch.tensor([1.1, 2.2]):直接定义
torch.FLoatTensor(2):生成一个长度为2,维度为1的
一维张量(向量)用途:bias、linear input(将一张图片展成一维的)
比如一张图片28*28展成784输入
=====二维张量
torch.randn(2,3):生成正态分布(0,1)的2行3列矩阵
用途:linear input batch
比如图片输入(4,784),4张图片输入,每张为784
=====三维张量
torch.rand(1,2,3):生成均匀分布(0~1)的三维矩阵
list(x):若x为torch.size([1,2,3]),可以直接转换为[1,2,3]
a.numel():元素个数。上面为例:1*2*3=6
用途:RNN input batch
[words,sentences,features]:输入几个句子,每个句子几个单词,每个单词用多少特征表示
=====四维张量
用途:CNN[b,c,h,w]四维刚好对应batch、channel、height、width
2、创建Tensor
2.1 tensor与Tensor
- tensor接收现有数据
- Tensor或FloatTensor接收数据维度
或者用于接收数据时,需将数据[ ]
2.2 tensor的创建
=====import from list
例如:torch.tensor([2, 3.2])
=====import from numpy
例如:a = np.array([2, 3.3])
torch.from_numpy(a)
2.3 初始化tensor
=====未初始化:里面含有的是杂乱的数据,需要接着初始化。
否则容易出现问题:torch.nan, torch.inf
生成一维
torch.empty(1)
生成2行3列
torch.Tensor(2,3)
torch.IntTensor(2,3)
torch.FloatTensor(2,3)
=====随机初始化
rand/ rand_like/ randint
rand:生成数据符合[0,1]的均值分布
rand_like(a):生成shape同a
randint(min,max,[]):生成shape为[],数据min(可取),max(不可取)
randn:生成数据符合N(0,1)
例如:randn(3,3)
改变均值和方差:torch.normal(mean=torch.full([10],0),std=torch.arange(1,0,-0.1))
生成10个均值为0,标准差逐渐减小从1到0.1,然后可以reshape到想要的shape
=====指定初始化
full
torch.full([2,3],7):2行3列,7
torch.full([],7):标量7
torch.full([2],7):维度为1,长度为2的张量,元素值都是7
arange
torch.arange(0,10,2):从0到10,步长为2.包括0但不包括10
linspace/logspace
torch.linspace(0,10,steps=4):从0到10,取平均切割的四个数。包括0和10
===>tensor([0.0000, 3.3333, 6.6667, 10.0000])
torch.logspace(0,-1,steps=10):从0到-1,取10个数(包括0和10),然后将其当作10的幂。(10作为base参数可以设置)
===>tensor([1.0000, 0.7743, ···, 0.1000])
ones/zeros/eye
torch.ones(3,3):生成3行3列,元素值为1的矩阵
torch.ones_like(a):形状如a,元素值为1
torch.zeros(3,3):生成3行3列,元素值为0的矩阵
torch.eye(3,4):单位阵。如果不是方阵,针对此处
[[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]]
randperm
randperm(10):随机打散,生成0-9共10个索引
目的是为了在打散的同时能够保持原来对应的打散后仍然对应
例如:a = torch.rand(2,3)
b = torch.rand(2,2)
利用idx=torch.randperm(2)可以生成[0, 1]或[1, 0]
那么需要保持a[idx]和b[idx]同时使用
假设原来a的第一行对应b的第一行
[0,1]代表保持原来顺序不动
[1,0]代表a的原来第一行换到第二行,那么b原来的第一行也要换到第二行
2.4 默认类型
使用tensor和Tensor生成时,数据类型为默认tensor类型FloatTensor
可以修改:torch.set_default_tensor_type(torch.DoubleTensor)