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