首页人工智能Pytorch【深度学习(PyTorch...

【深度学习(PyTorch篇)】4.创建Tensor


本系列文章配套代码获取有以下两种途径:

  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/PyTorch





PyTorch中,创建Tensor的方法有很多种,每种方法都有其特定的使用场景,以下是一些主要的方法和它们的使用场景,以及示例代码。

01

从numpy数组创建


如果已经有一个numpy数组,可以使用torch.from_numpy()将其转换为Tensor这样做的好处是可以在 PyTorch 中利用 GPU 加速计算,同时仍然能够利用NumPy 提供的丰富的数组操作功能。
# 创建一个 NumPy 数组
>>> a = np.array([2,3.3])
# 转换为 Tensor
>>> torch.from_numpy(a)
tensor([2.00003.3000], dtype=torch.float64)


# 创建一个 NumPy 数组
>>> b = np.array([[1,2,3,4],
...               [5,6,7,8]])
# 转换为 Tensor
>>> torch.from_numpy(b)
tensor([[1234],
        [5678]], dtype=torch.int32)

02

从python的list创建


使用PyTorchtorch.tensor()torch.Tensor()函数都可以通过传入list数据创建Tensor但它们在用法、行为以及推荐的使用场景上有所不同。
  • torch.tensor():
torch.tensor()是一个工厂函数(factory function),用于创建新的张量。
它接收数据作为第一个参数,并可以接收其他可选参数,如dtype(数据类型)、device(设备,如CPU或GPU)和requires_grad(是否需要梯度)。torch.tensor()还会根据输入数据的类型自动推断出返回张量的数据类型,除非显式指定了dtype

因此,推荐使用torch.tensor()从数据创建新的张量,因为它提供了更清晰、更可预测的语义。

需要注意的是,torch.tensor()总是复制输入的数据,因此新创建的张量与输入数据在内存中不是同一个对象。

# 会尝试推断数据的类型
>>> torch.tensor([2,3])
tensor([23])
>>> torch.tensor([2,3]).type()
'torch.LongTensor'
>>> torch.tensor([[2,3.3],[5,6.6]])
tensor([[2.0000, 3.3000],
        [5.0000, 6.6000]]
)
>>> torch.tensor([[2,3.3],[5,6.6]]).type()
'torch.FloatTensor'
# 输入数据也可以是ndarray
>>> torch.tensor(np.array([2,3.3]))
tensor([2.00003.3000], dtype=torch.float64)
>>> torch.tensor(np.array([2,3.3])).type()
'torch.DoubleTensor'


  • torch.Tensor()
torch.Tensor()是一个构造函数(constructor),用于实例化一个新的张量对象。
torch.Tensor()的调用方式会根据传入的参数类型而有所不同。传递形状会创建一个未初始化的张量,而传递数据会尝试从这些数据中构造一个张量。
torch.Tensor()不会自动推断张量的数据类型,而是默认数据类型为FloatTensor,即32位浮点数。
# 默认数据类型为FloatTensor
>>> torch.Tensor([2,3])
tensor([2.3.])
>>> torch.Tensor([2,3]).type()
'torch.FloatTensor'
>>> torch.Tensor([[2,3.3],[5,6.6]])
tensor([[2.0000, 3.3000],
        [5.0000, 6.6000]]
)
>>> torch.Tensor([[2,3.3],[5,6.6]]).type()
'torch.FloatTensor'
# 输入数据也可以是ndarray
>>> torch.Tensor(np.array([2,3.3]))
tensor([2.00003.3000])
>>> torch.Tensor(np.array([2,3.3])).type()
'torch.FloatTensor'

03

创建未初始化的Tensor


torch.empty(size)torch.Tensor(size)可以根据给定的形状创建一个未初始化的Tensor。这意味着张量的值将是内存中的随机值,通常不是零或任何特定模式。
# empty()方法接收的是shape
>>> torch.empty(2,3)
tensor([[1.0286e-38, 9.0919e-39, 8.9082e-39],
        [9.2755e-39, 8.4490e-39, 1.0194e-38]]
)

# Tensor()方法接收的也是shape
>>> torch.Tensor(2,3)
tensor([[1.4013e-45, 0.0000e+00, 1.4013e-45],
        [0.0000e+00, 1.4013e-45, 0.0000e+00]]
)
这里需要注意的是,生成的未初始化的数据要么非常大,要么非常小,直接使用的话会出现类似torch.nan或者torch.inf这样的错误。因为这些未初始化的api方法,只是作为载体,后续需要将数据写进来,覆盖掉随机生成的数据。
04

将Tensor赋值为同一个元素


torch.full(size, fill_value) 函数用于创建一个填充了指定值的 Tensor
默认情况下,torch.full() 会根据 fill_value 的类型推断 tensor 的数据类型,但你也可以通过 dtype 参数显式指定数据类型。
# 创建一个形状为 (2, 3) 的 tensor,并填充值 7
>>> torch.full([2,3],7)
tensor([[7, 7, 7],
        [7, 7, 7]])
>>> torch.full([],7)
tensor(7)
>>> torch.full([1],7)
tensor([7])
05

随机生成


PyTorch提供了一些函数用于创建随机初始化的Tensor
  • torch.rand(size) 产生[0,1] 均匀分布的数据;

  • torch.rand_like(input, dtype) 接收tensor读取shape再用rand生成;

  • torch.randint(low = 0, high, size) 随机生成整数值tensor,范围 [min,max) 左闭右开;

  • torch.randn(size) N(0,1),即均值为0,方差为1的正态分布(N(u,std));

  • torch.normal(means,std,out = None) 返回一个张量,包含从给定参数means,std的离散正态分布中抽取随机数。均值means是一个张量,包含每个输出元素相关的正态分布的均值。std是一个张量,包含每个输出元素相关的正态分布的标准差。均值和标准差的形状不须匹配,但每个张量的元素个数须相同。

# .rand()方法随机的使用[0,1)的均值分布进行随机生成
>>> torch.rand(3,3)
tensor([[0.1379, 0.9675, 0.7739],
        [0.0617, 0.1093, 0.4735],
        [0.8028, 0.6730, 0.0587]]
)

# .rand_like()方法接收的是一个tensor,它是将tensor的shape读出来之后在未给rand()
>>> a = torch.rand(3,3)
>>> torch.rand_like(a)
tensor([[0.8711, 0.6817, 0.4961],
        [0.7291, 0.2573, 0.6875],
        [0.2378, 0.4857, 0.0768]]
)

# .randint(min,max,shape)方法使用自定义的数据空间,其中取值范围为[min,max),shape接收的是一个列表
>>> torch.randint(1,10,[3,3])
tensor([[8, 7, 3],
        [7, 7, 5],
        [1, 4, 2]]
)

# .randn()为N(0,1),即均值为0,方差为1
>>> torch.randn(3,3)
tensor([[-1.1194, -0.7181,  0.7337],
        [ 0.1946, -0.8891, -0.0226],
        [-0.0397,  0.5664, -0.1898]]
)

# .normal(u,std)方法可以自定义取值和方差,但是使用起来不是很方便
>>> torch.normal(mean=torch.full([10],0.),std=torch.arange(1,0,-0.1))
tensor([ 2.4278,  1.5845-0.2471-0.4362,  0.0557,  0.3101,  0.3443-0.0106,
        -0.2804,  0.0955])
05

序列生成


PyTorch中,torch.arange(), torch.linspace(), 和 torch.logspace() 是用于创建具有特定数值序列的tensor的函数。

  • torch.arange(start, end, step)返回一个1维tensor,其中包含从start到end(不包含end)的等差序列,步长为step。如果没有提供start和step,则默认为0和1;

  • torch.range(start, end, step) :会被弃用,使用arange()方法替代;

  • torch.linspace(start, end, steps) 返回一个1维tensor,其中包含从start到end的等间隔数值。steps参数定义了tensor中的元素数量,而不是步长。steps默认值为100;

  • torch.logspace(start, end, steps,base)返回一个1维tensor,其中包含在对数尺度上均匀间隔的数字。start和end是序列的起始和结束点的对数值(以10为底),steps是生成的数字的数量,base是对数的底数,默认为10。
# 创建一个从0到10(不包含10)的等差序列,步长为1
>>> torch.arange(0,10)
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 创建一个从0到10(不包含10)的等差序列,步长为2
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
# .range()方法会被弃用,使用.arange()方法替代
>>> torch.range(0,10)
<stdin>:1: UserWarning: torch.range is deprecated and will be removed in a future release because its behavior is inconsistent with Python's range builtin. Instead, use torch.arange, which produces values in [start, end).
tensor([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

#
 创建一个从0到10的等间隔数值序列,包含5个元素
>>> torch.linspace(0,10,steps=5)
tensor([ 0.0000,  2.5000,  5.0000,  7.5000, 10.0000])
# 创建一个从0到10的等间隔数值序列,包含10个元素
>>> torch.linspace(0,10,steps=10)
tensor([ 0.0000,  1.1111,  2.2222,  3.3333,  4.4444,  5.5556,  6.6667,  7.7778,
         8.8889, 10.0000])

#
 创建一个从10^0到10^1的均匀间隔数字序列,包含4个元素
>>> torch.logspace(0,1,steps=4)
tensor([ 1.0000,  2.1544,  4.6416, 10.0000])
# 创建一个从2^0到2^3的序列,包含4个元素
>>> torch.logspace(0,1,steps=4,base=2)
tensor([1.0000, 1.2599, 1.5874, 2.0000])
06

全0、全1、单位矩阵


torch.zeros(),torch.zeros_like(),torch.ones()torch.ones_like() 函数用于创建具有特定大小和数据类型的全零或全一张量。而 torch.eye() 函数用于创建单位矩阵。
  • torch.zeros(size)返回一个形状由size参数定义的全零张量;
  • torch.zeros_like(input, dtype)返回一个与input张量形状相同且元素全为零的张量;
  • torch.ones(size)返回一个形状由size参数定义的全1张量;
  • torch.ones_like(input, dtype)返回一个与input张量形状相同且元素全为1的张量;
  • torch.eye(size)返回一个形状为(n, m)的单位矩阵,其中n是行数,m是列数。如果m未指定,则默认为n,即生成一个n x n的方阵。单位矩阵是对角线元素为1,其他元素为0的矩阵。

# 创建一个3x3的全零张量
>>> torch.zeros(3,3)
tensor([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]
)

# 创建一个3x2的全为1的张量
>>> torch.ones(3,3)
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]
)

# 创建一个与a形状相同的全一张量
>>> a = torch.rand(3,3)
>>> torch.ones_like(a)
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]]
)

# 创建一个3x3的单位矩阵
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]]
)
# eye()方法当给定的shape不对应时,多余的会以0填充
>>> torch.eye(3,4)
tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.]]
)
# eye()方法只能接受一个或两个数据,也就是说不能生产更高维的数据
>>> torch.eye(4)
tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]]
)
08

随机排列


torch.randperm(n):返回一个0到n-1的n个整数的随机排列张量。

>>> torch.randperm(10)
tensor([5, 8, 7, 6, 3, 2, 4, 9, 0, 1])

更多内容可以前往官网查看

https://pytorch.org/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments