pytorch创建tensor数据

一、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。

可以用于:对两个维度相等,关系一一对应的数据,如果要以同样的的方式随机排序,可以通过此方法生成随机索引,如下图所示:

猜你喜欢

转载自www.cnblogs.com/jaysonteng/p/12585802.html