暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PyTorch特殊张量的创建与类型转化

AI有温度 2021-11-09
835

AI因你而升温,记得加个星标哦!

import torch
torch.__version__
# '1.7.0'

复制

1 特殊张量的创建

numpy
类似,PyTorch
中的张量也有很多特殊创建的形式。

zeros
:全0张量

# 形状为2行3列
torch.zeros([23])
# tensor([[0., 0., 0.],
#         [0., 0., 0.]])

复制

ones
:全1张量

# 形状为2行3列
torch.ones([23])
# tensor([[1., 1., 1.],
#         [1., 1., 1.]])

复制

eye
:单位矩阵

torch.eye(3)
# tensor([[1., 0., 0.],
#         [0., 1., 0.],
#         [0., 0., 1.]])

复制

diag
:对角矩阵

在PyTorch中,需要利用一维张量去创建对角矩阵。

torch.diag(torch.tensor([1,2,3,4,5]))
# tensor([[1, 0, 0, 0, 0],
#         [0, 2, 0, 0, 0],
#         [0, 0, 3, 0, 0],
#         [0, 0, 0, 4, 0],
#         [0, 0, 0, 0, 5]])

复制

rand
:服从0-1均匀分布的张量

torch.rand(23)
# tensor([[0.2154, 0.7666, 0.7396],
#         [0.3063, 0.9024, 0.0047]])

复制

randn
:服从标准正态分布的张量

torch.randn(33)
# tensor([[ 1.2200, -1.0587,  1.0716],
#        [-1.2465, -0.3391,  1.2131],
#        [ 0.7201,  1.2034, -1.0660]])

复制

normal
服从指定正态分布的张量

# 均值为2,标准差为3的张量,形状为2行2列
torch.normal(23, size = (22))
# tensor([[9.0815, 0.9216],
#         [0.9856, 4.2866]])

复制

randint
整数随机采用

torch.randint(110, size = [24])
# tensor([[1, 8, 2, 3],
#         [5, 3, 5, 7]])

复制

arange/linspace
:生成数列

# 从1-5,左闭右开
torch.arange(5
# tensor([0, 1, 2, 3, 4])


# 从1-5,左右都包含,等距取3个数
torch.linspace(153)
# tensor([1., 3., 5.])

复制

empty
:生成未初始化的指定形状矩阵

它生成的数近似于0,但不为0

torch.empty(23)
# tensor([[-2.1193e-17,  4.5602e-41,  3.0720e-09],
#         [ 3.0630e-41,  0.0000e+00,  0.0000e+00]])

复制

full
:根据指定形状,填充指定数值

# 填充形状为2行4列,填充数值为2
torch.full([24], 2)
# tensor([[2, 2, 2, 2],
#         [2, 2, 2, 2]])

复制

2 _like
后缀的用法

创建指定形状的数组,在上述函数后面加上_like
即可。比如现在我们有一个张量t
,形状为2行3列:

t = torch.tensor([[123], [456]])

复制

我们想创建一个1-100随机数的张量,形状与张量t
相同:

torch.randint_like(t, 1100)
# tensor([[57, 67, 77],
#         [76, 45, 31]])

复制

上述函数都有_like
方法,需要注意的是该方法转化需要注意转化前后数据类型一致的问题,若数据类型不一致,则会报错:

# randn为float型,而t为int型
# 转换数据类型不一致,就会报错
torch.randn_like(t)
# RuntimeError

复制

3 张量与其他数据类型的转换

张量、数组和列表是较为相似的三种类型对象,在实际操作过程中,经常会涉及三种对象的相互转化。

3.1 .numpy()/np.array()
:张量转化为数组

# 使用.numpy()
t.numpy()
# array([1, 2, 3])

# 使用np.array()
np.array(t)
# array([1, 2, 3])

复制

3.2 tolist()/list()
:张量转化为列表

# 使用tolist()
t = torch.tensor([123])
t.tolist()
# [1, 2, 3]

复制

需要注意的是,在使用list()时,此时转化的列表是由一个个零维张量构成的列表,而非张量的数值构成的列表。可理解为1维张量是由0维张量组成的。

# 使用list(),结果是零维张量构成的列表,为标量
list(t)
# [tensor(1), tensor(2), tensor(3)]

复制

3.3 .item()
:标量转化为数值

在很多情况下,我们需要将最终计算的结果张量转为单独的数值进行输出。

n = torch.tensor(1)
print(n)
# tensor(1)

# 使用.item()方法将标量转为python中的数值
n.item()
# 1

复制

4 张量的深拷贝

与python中其他对象类型一样,等号赋值操作实际上是浅拷贝,需要进行深拷贝,则需要使用clone方法。

4.1 浅拷贝

t1 = torch.arange(10)
t2 = t1
t2[1] = 10
print(t1)
# t1也被改变了
# tensor([ 0, 10,  2,  3,  4,  5,  6,  7,  8,  9])
print(t2)
# tensor([ 0, 10,  2,  3,  4,  5,  6,  7,  8,  9])

复制

4.2 clone()
深拷贝

t1 = torch.arange(10)
t2 = t1.clone()
t2[1] = 10

# t1并没有被改变
print(t1)
# tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

# t2的第二个元素变成了10
print(t2)
# tensor([ 0, 10,  2,  3,  4,  5,  6,  7,  8,  9])

复制


推荐阅读
TensorFlow与PyTorch到底该如何选择?
PyTorch张量的创建与基本类型
PyTorch张量的维度与形变
文章转载自AI有温度,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论