pytorch创建tensor数据

Posted jaysonteng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch创建tensor数据相关的知识,希望对你有一定的参考价值。

import torch

一、传入数据

tensor只能传入数据

可以传入现有的数据列表或矩阵

# 当是标量时候,即只有一个数据时候,[]括号是可以省略的
torch.tensor(2)
tensor(2)
# 如果是向量或矩阵,必须有[]括号
torch.tensor([2, 3])
tensor([2, 3])

Tensor可以传入数据、维度。

建议tensor给数据,Tensor给维度,不然容易把维度和数据搞混淆

# 没有[]时候是指维度,数据是随机初始化的,都接近于0
torch.Tensor(4)
tensor([0., 0., 0., 0.])
# 当有[]时候是指数据
torch.Tensor([2])
tensor([2.])
# float类型
torch.FloatTensor(3)
tensor([0., 0., 0.])
# double类型。
# 一般在增强学习里面用Double类型,因为增强学习对数据精度要求更高。
# 其他地方一般用float类型就够了。精度越高消耗的资源也会越多。
torch.DoubleTensor(3)
tensor([3.5825e+246, 2.0475e+161, 3.1725e+180], dtype=torch.float64)

二、传入维度的方法

rand

# 传入维度,随机生成相应维度数据
# 生成的数是0~1之间的,随机分布的数据(均匀分布)
# 默认是N(0, 1)均值为0,方差为1
# 推荐使用rand方法初始化数据
torch.rand(2, 3, 2)
tensor([[[0.0316, 0.3464],
         [0.2537, 0.3074],
         [0.4512, 0.5535]],

        [[0.5645, 0.9134],
         [0.7151, 0.2645],
         [0.9773, 0.6580]]])
# 维度可以加括号
torch.rand([2, 3, 2])
tensor([[[0.3623, 0.7754],
         [0.7515, 0.0527],
         [0.2006, 0.6329]],

        [[0.7246, 0.0875],
         [0.8303, 0.2042],
         [0.7149, 0.2826]]])

rand_like

a  = torch.ones(2, 3)
a
tensor([[1., 1., 1.],
        [1., 1., 1.]])
# 根据a数据的shape来生成随机数据
# 另外还有:ones_like、zeros_like等。
torch.rand_like(a)
tensor([[0.6721, 0.8581, 0.2823],
        [0.0510, 0.9334, 0.8291]])

randint

# 生成1~10之间随机整数
# [2, 5]是维度
torch.randint(1, 10, [2, 5]) 
tensor([[8, 2, 5, 5, 2],
        [5, 7, 8, 1, 7]])

normal

# 生成正态分布数据
# 维度2行3列
# 均值为4
# 方差0.6-0.1的数据。方差数据量需要与维度数据量相等:
# 比如此处是2*3=6个数据。方差就是6个数据。
torch.normal(mean=torch.full([2, 3], 4), std=torch.arange(0.6, 0, -0.1))
tensor([[3.7889, 3.9049, 3.9840],
        [4.1137, 3.9285, 4.0589]])

full

# 生成给定维度,全部数据相等的数据
torch.full([2, 3], 7)
tensor([[7., 7., 7.],
        [7., 7., 7.]])
# 也可以给定空维度,生成标量
torch.full([], 7)
tensor(7.)
# 一维,长度为1的向量
torch.full([1], 7)
tensor([7.])

arange

也可以用 range(),但不推荐

# 生成[0, 10)的tensor
torch.arange(0, 10)  
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 生成[0, 10)间隔为2的tensor
torch.arange(0, 10, 2)  
tensor([0, 2, 4, 6, 8])

linspace

# 将[0,10]等分切割成4份
torch.linspace(0, 10, steps=4)  
tensor([ 0.0000,  3.3333,  6.6667, 10.0000])

ones

# 给定维度,生成全为1的数据
c = torch.ones(3, 3)
c
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

ones_like

torch.ones_like(c)
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

zeros

# 生成全为0的tensor
a = torch.zeros(3, 3) 
a
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

zeros_like

torch.zeros_like(a)
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])

eye

 torch.eye(3, 3)  # 生成对角矩阵
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])
 torch.eye(3, 4)  # 若不是方阵,最后多的列会用0填充
tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.]])

empty

# 给定维度,随机生成未初始化的数据
# 非常不规则,可能出现非常大,非常小的情况,尽量要覆盖完成数据
torch.empty(1, 2)
tensor([[        inf, 6.9533e-310]])

randperm

torch.randperm(10)  # 相当于[0, 10) 的随机排序
tensor([0, 5, 3, 9, 8, 1, 2, 6, 7, 4])
a = torch.rand(2, 3)
a
tensor([[0.5030, 0.5566, 0.5968],
        [0.9044, 0.5012, 0.2717]])
b = torch.rand(2, 3)
b
tensor([[0.4264, 0.5325, 0.4145],
        [0.6967, 0.1065, 0.0063]])
idx = torch.randperm(2)
idx
tensor([1, 0])
a[idx]
tensor([[0.9044, 0.5012, 0.2717],
        [0.5030, 0.5566, 0.5968]])
b[idx]
tensor([[0.6967, 0.1065, 0.0063],
        [0.4264, 0.5325, 0.4145]])

三、数据维度查看

a = torch.Tensor(2, 3, 4)
a
tensor([[[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]],

        [[0., 0., 0., 0.],
         [0., 0., 0., 0.],
         [0., 0., 0., 0.]]])
a.shape  # 注意shape没有括号
torch.Size([2, 3, 4])
a.size()  # 与shape等价
torch.Size([2, 3, 4])
a.dim()  # 表示维度
3
len(a)  # 查看第一维度数据大小
2
# 数据内存大小查看
a.numel()
24

四、pytorch数据类型

  1. 标量:
    可以理解为常量,没有方向的向量(只有数值,没有方向),dimension=0
    常用于计算loss。预测值与真实值之间误差计算出来就是标量

  2. 张量:
    张量与标量的区别:张量有方向(维度)
    二维:适合线性batch输入,比如:torch.randn(2, 3) # 随机生成2行3列的张量。
    三维:torch.rand(1, 2, 3);三维适合RNN,[10, 20, 100] 20个句子,10个单词,每个单词用一个100维的向量表示
    四维:torch.rand(2, 3, 28, 28) 2张照片,3个通道,照片大小28(h)*28(w);

  3. pytorch数据类型:
    pytorch只支持数字类型数据,不支持字符串类型数据。
    如果要用pytorch来表示string,就将string转换为数字编码(或矩阵、向量)来处理。常用方法:One-hot,Embedding(Word2vec, glove)

技术图片

tensor和numpy类型互换:

# 直接将tensor转换为numpy
a = torch.Tensor([2, 3])
a
tensor([2., 3.])
a.numpy()
array([2., 3.])
import numpy as np

a = np.array([3, 4])
a
array([3, 4])
# 将numpy数据转换为张量
torch.from_numpy(a)  
tensor([3, 4], dtype=torch.int32)

1. 数据类型查看

a = torch.Tensor(2)
a.type()  # 查看tensor的数值类型
‘torch.DoubleTensor‘
type(a)  # 返回数据类型是tensor,但是不会返回具体的数值类型
torch.Tensor

2. 判断数字类型

a = torch.Tensor(2)
# 判断a的数值类型是否是float
isinstance(a, torch.FloatTensor), isinstance(a, torch.DoubleTensor)
(False, True)
b = a.cuda()  # 将b布置在GPU上。(数据默认是布置在CPU上的)
# CPU和GPU数据不能直接比较
isinstance(b, torch.FloatTensor), isinstance(b, torch.DoubleTensor)
(False, False)
# 若要进行比较,需要将数据转换为GPU
isinstance(b, torch.cuda.FloatTensor), isinstance(b, torch.cuda.DoubleTensor)
(False, True)

设置默认数据类型

1. 设置默认数据类型前

# Tensor默认是Float类型
a = torch.Tensor(2)
a.type()  # 查看数据类型
‘torch.FloatTensor‘
a = torch.Tensor([2.])
a.type()
‘torch.FloatTensor‘
# tensor传入整数是LongTensor类型
a = torch.tensor(2)
a.type()
‘torch.LongTensor‘
# 传入小数,是Float类型
a = torch.tensor(2.)
a.type()
‘torch.FloatTensor‘

2. 设置默认数据类型后

# 设置默认tensor数据类型
torch.set_default_tensor_type(torch.DoubleTensor)
# 即使设置了默认数据类型是double,但是给定的数据中至少要有一个是小数,不然设置会无效
a = torch.tensor([2, 3])
a.type()
‘torch.LongTensor‘
# 加了小数后,数据类型就是设置的默认double类型
b = torch.tensor([2., 3])
b.type()
‘torch.DoubleTensor‘








以上是关于pytorch创建tensor数据的主要内容,如果未能解决你的问题,请参考以下文章

pytorch创建tensor数据

PyTorch框架学习 — Tensor(张量)详解

pytorch-tensor创建,类型转换

深度学习03:PyTorch的数据类型Tensor

pytorch之张量的相关介绍

PyTorch-Tensor