PyTorch 创建Tensor

​Pytorch中定义了一个Tensor类来实现张量,Tensor在使用上与numpy的ndarray类似,不同的是,Tensor可以在GPU上运行,但是numpy只能在CPU上运行,当然numpy与Tensor可以进行相互转换,以此使得numpy数据在GPU上运行。Pytorch中的Tensor又包括CPU上的数据类型和GPU上的数据类型,两种数据类型之间也可以进行相互转换。

在 PyTorch 中可以通过三种方式创建张量:

  • 通过调用Tensor类的构造函数。
  • 通过将 NumPy 数组或 Python 列表转换为张量。
  • 通过PyTorch提供的接口为您创建具有特定数据的张量。例如,您可以使用torch.zeros() 函数创建一个填充零值的张量。

通过调用Tensor类的构造函数

  • 通过传递Python 可迭代的数据(例如,列表(list),元组(tuple), 矩阵(array)),它将用作新创建的张量的相应元素的取值。张量的类型由list,tuple,array元素的类型决定

举例说明:

>>> tensor_from_list=torch.tensor([1.0,2.0,3.0])
>>> tensor_from_list
    tensor([1., 2., 3.])
>>> tensor_from_list.type()
    'torch.FloatTensor'
  • 张量的类型这篇博文里面,我们介绍了不通的张量类型所使用的类,例如32位的浮点型tensor使用torch.FloatTensor类,64位的双进度使用torch.DoubleTensor类。我们可以通过不同的类型的Tensor的类来构造不通的Tensor对象。
    举例说明:
>>> torch.FloatTensor([[1,2,3],[3,2,1]])
tensor([[ 1., 2., 3.],
        [ 3., 2., 1.]]) 
  • torch.tensor 默认的数据类型是32位浮点型,但是可以通过torch.set_default_tensor_type(t)设置默认的tensor类型
    举例说明:
>>> torch.tensor([1.2, 3]).dtype    # initial default for floating point is torch.float32
torch.float32
>>> torch.set_default_tensor_type(torch.DoubleTensor)
>>> torch.tensor([1.2, 3]).dtype    # a new floating point tensor
torch.float64

通过将 NumPy 数组或 Python 列表转换为张量

在这种情况下,类型将从NumPy数组或者Python列表的类型中获取。
举例说明,我们使用 NumPy 创建了相同的元素取值为0的张量:

>>> n = np.zeros(shape=(3, 2)) 
>>> n 
array([[ 0., 0.], 
       [ 0., 0.], 
       [ 0., 0.]]) 
>>> b = torch.tensor(n) 
>>> b 
tensor([[ 0., 0.], 
        [ 0., 0.],
        [ 0., 0.]], dtype=torch.float64) 

在上面的例子中,torch.tensor 方法接受 NumPy 数组作为参数,并从中创建相应形状的张量。我们创建了一个由零初始化的 NumPy 数组,它默认创建了一个双精度(64 位浮点也,就是numpy.float64)数组。因此,生成的张量具有 DoubleTensor 类型(在前面的示例中显示为 dtype 值)。通常,在 DL 中,双精度不是必需的,它会增加额外的内存和性能开销。常见的做法是使用32位浮点型,甚至16位浮点型,已经绰绰有余。要创建这样的张量,您需要明确指定 NumPy 数组的类型:

>>> n = np.zeros(shape=(3, 2), dtype=np.float32) 
>>> torch.tensor(n) 
tensor([[ 0., 0.],         
        [ 0., 0.],         
        [ 0., 0.]]) 

作为一个选项,可以在 dtype 参数中将所需张量的类型提供给 torch.tensor 函数。但是,请注意,因为此参数期望获得 PyTorch 类型,而不是 NumPy 类型。 PyTorch 类型保存在 torch 包中,例如,torch.float32 和 torch.uint8。

>>> n = np.zeros(shape=(3,2)) 
>>> torch.tensor(n, dtype=torch.float32) 
tensor([[ 0., 0.], 
        [ 0., 0.], 
        [ 0., 0.]]) 

另外通过接口 torch.from_numpy,例如:

>>> a=np.array([2,3.0])
>>> torch.from_numpy(a)
tensor([2., 3.], dtype=torch.float64)
>>> a=np.ones([2,3])
>>> torch.from_numpy(a)
tensor([[1., 1., 1.],
        [1., 1., 1.]], dtype=torch.float64)

通过PyTorch提供的接口创建具有特定数据的张量

通过PyTorch提供的接口为您创建具有特定数据的张量。
生成随机数Tensor的方法,比如:

  • torch.rand()
  • torch.randn()
  • torch.rand_like()
  • torch.normal()
  • torch.linespace()

torch.rand(*sizes, out=None) → Tensor
均匀分布

返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。

参数:
sizes (int…) - 整数序列,定义了输出张量的形状

out (Tensor, optinal) - 结果张量

import torch
torch.rand(2, 3)

tensor([[0.3352, 0.0144, 0.3443],
        [0.5197, 0.5235, 0.1199]])

torch.randn()
标准正态分布

torch.randn(*sizes, out=None) → Tensor

返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。

参数:

sizes (int...) - 整数序列,定义了输出张量的形状
out (Tensor, optinal) - 结果张量
import torch
torch.randn(2, 3)

tensor([[ 0.5692,  0.7205,  1.2461],
        [ 0.5549, -0.6557, -0.0171]])

torch.normal
离散正态分布

torch.normal(means, std, out=None) → → Tensor

返回一个张量,包含了从指定均值means和标准差std的离散正态分布中抽取的一组随机数。

标准差std是一个张量,包含每个输出元素相关的正态分布标准差。

参数:

means (float, optional) - 均值
std (Tensor) - 标准差
out (Tensor) - 输出张量

例子:

import torch
torch.normal(mean=0.5,std=torch.arange(1, 6).float())


tensor([ 1.1610, -1.8812,  1.1811, -2.8335, -5.2556])

torch.linespace()
线性间距向量

torch.linspace(start, end, steps=100, out=None) → Tensor

返回一个1维张量,包含在区间start和end上均匀间隔的step个点。

输出张量的长度由steps决定。

参数
start (float) - 区间的起始点

end (float) - 区间的终点

steps (int) - 在start和end间生成的样本数

out (Tensor, optional) - 结果张量

例子

import torch
torch.linspace(2, 9, steps=5)


tensor([2.0000, 3.7500, 5.5000, 7.2500, 9.0000])

rand_like
返回一个与输入大小相同的张量,该张量由区间 [0,1) 上均匀分布的随机数填充。
参数
input - 输入向量

参考链接:

  • torch.Tensor — PyTorch 1.9.0 documentation

  • Pytorch 基本的数据类型_洪流之源-CSDN博客_pytorch 数据类型

  • https://zhuanlan.zhihu.com/p/115997577

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值