一、pytorch和python数据类型差别:
* pytorch只支持数字类型数据,不支持字符串类型数据。
* 如果要用pytorch来表示string,就将string转换为数字编码(或矩阵、向量)来处理。常用方法:One-hot,Embedding(Word2vec, glove)
二、pytorch数据类型查看
* a.type() # 查看tensor数字类型
* type(a) # 返回a的类型是一个Tensor,但不会返回在Tensor中的具体数字类型
* isinstance(a, torch.FloatTensor) # 判断a是否为torch的floattensor数字类型,是就返回True
isinstance(data, torch.cuda.DoubleTensor) # 如果data最开始是部署在CPU上面,如果与cuda进行比较,就是False
data = data.cuda() # 将CPU上的数据搬运到cuda上面以后,再进行比较就是True
三、标量
* 定义理解:可以理解为常量,没有方向的向量(只有数值,没有方向),dimension=0
* pytorch中的定义:torch.tensor(1.),输出tensor(1.)
* 作用:常用于计算loss。预测值与真实值之间误差计算出来就是标量
* 标量的大小查看
注意:.shape方法没有括号
除了上图中的方法,还有a.dim()
区别是:dim是表示维度,即矩阵的高,1个数值。size/shape表示矩阵的高和宽....等多个数值。
四、张量
* 张量与标量区别:
张量有方向,定义时需加[]
* numpy和tensor类型互换
1)torch.from_numpy(data) # 将numpy数据转换为张量
2)tensor_data.numpy() # 直接将tensor转换为numpy
* tensor多维数据用处
1)二维数据:适合线性batch输入,比如:torch.randn(2, 3) # 随机生成2行3列的张量
2)三维数据:torch.rand(1, 2, 3);三维适合RNN,[10, 20, 100] 20个句子,10个单词,每个单词用一个100维的向量表示
3)四维数据:torch.rand(2, 3, 28, 28) 2张照片,3个通道,照片大小28(h)*28(w);
* tensor的内存查看
a.numel() # number of element
* 张量的定义
* torch.tensor() # 小写
接收现有的数据列表或矩阵[];
* torch.Tensor(),torch.FloatTensor() # 大写
接收维度(d1, d2, d3...),随机初始化数据;当然也可以接收现有数据,不过建议小写给数据,大写给维度,不然容易把维度和数据搞混淆。
* torch.empty()
给定维度。未初始化的数据,非常不规则,可能出现非常大,非常小的情况,尽量要覆盖完成数据
* torch.FloatTensor(d1, d2, d3)
生成随机载体,后面通过赋值方式修改值
* 建议数据类型
在增强学习里面用double,精度更高一些;其他地方一般使用float
* 设置tensor默认数据类型
torch.set_default_tensor_type(torch.DoubleTensor) # 注:原数据中一定要有小数,若全是整数,那么此设置无效
* torch.rand(2, 3) # 推荐使用
生成2行3列,数值在0~1之间随机分布的数据(均匀分布),默认是N(0, 1)均值为0,方差为1
* torch.rand_like(a)
根据a的shape来随机生成
* torch.randint(1, 10, [d1, d2, ...])
[1-10)范围内的整数,后面是给定维度
* torch.normal(mean=torch.full([2, 3], 0), std=torch.arange(0.6, 0, -0.1))
生成正态分布,2行3列,均值为0,方差从0.6-0.1,从下图可以看出,输出数据几乎是逐渐减小的趋势。
* torch.full([2, 3], 7)
将2行3列的数据全部赋值为7;torch.full([], 7) 生成的是tensor(7)标量;torch.full([1], 7)生成的是长度为1的向量
* torch.arange(0, 10)
生成[0, 10)的tensor([0, 1, 2,...9]);torch.arange(0, 10) # [0, 10),间隔为2的tensor数据;tensor.range(),不推荐使用。
* torch.linspace(0, 10, steps=4)
将[0,10]等分切割成4份
* torch.ones(3, 3)
给定shape,生成全为1的tensor矩阵;torch.ones_like(a),根据a的shape生成全为1的矩阵。
* torch.zeros(3, 3)
给定shape,生成全为0的tensor矩阵
* torch.eye(3, 4)
给定shape,生成对角矩阵。如果不是对角矩阵,后面会填充0,如下图:
* torch.randperm(10)
生成[0, 9]的乱序的一维tensor。
可以用于:对两个维度相等,关系一一对应的数据,如果要以同样的的方式随机排序,可以通过此方法生成随机索引,如下图所示: