Pytorch使用教学3-特殊张量的创建与类型转化

1 特殊张量的创建

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

zeros:全0张量

Python 复制代码
# 形状为2行3列
torch.zeros([2, 3])
# tensor([[0., 0., 0.],
#         [0., 0., 0.]])

ones:全1张量

Python 复制代码
# 形状为2行3列
torch.ones([2, 3])
# tensor([[1., 1., 1.],
#         [1., 1., 1.]])

eye:单位矩阵

Python 复制代码
torch.eye(3)
# tensor([[1., 0., 0.],
#         [0., 1., 0.],
#         [0., 0., 1.]])

diag:对角矩阵

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

Python 复制代码
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均匀分布的张量

Python 复制代码
torch.rand(2, 3)
# tensor([[0.2154, 0.7666, 0.7396],
#         [0.3063, 0.9024, 0.0047]])

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

Python 复制代码
torch.randn(3, 3)
# tensor([[ 1.2200, -1.0587,  1.0716],
#        [-1.2465, -0.3391,  1.2131],
#        [ 0.7201,  1.2034, -1.0660]])

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

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

randint整数随机采用

Python 复制代码
torch.randint(1, 10, size = [2, 4])
# tensor([[1, 8, 2, 3],
#         [5, 3, 5, 7]])

arange/linspace:生成数列

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


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

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

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

Python 复制代码
torch.empty(2, 3)
# tensor([[-2.1193e-17,  4.5602e-41,  3.0720e-09],
#         [ 3.0630e-41,  0.0000e+00,  0.0000e+00]])

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

Python 复制代码
# 填充形状为2行4列,填充数值为2
torch.full([2, 4], 2)
# tensor([[2, 2, 2, 2],
#         [2, 2, 2, 2]])

2 _like后缀的用法

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

Python 复制代码
t = torch.tensor([[1, 2, 3], [4, 5, 6]])

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

Python 复制代码
torch.randint_like(t, 1, 100)
# tensor([[57, 67, 77],
#         [76, 45, 31]])

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

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

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

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

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

Python 复制代码
# 使用.numpy()
t.numpy()
# array([1, 2, 3])

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

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

Python 复制代码
# 使用tolist()
t = torch.tensor([1, 2, 3])
t.tolist()
# [1, 2, 3]

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

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

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

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

Python 复制代码
n = torch.tensor(1)
print(n)
# tensor(1)

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

4 张量的深拷贝

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

4.1 浅拷贝

Python 复制代码
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()深拷贝

Python 复制代码
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])

Pytorch张量操作大全:

Pytorch使用教学1-Tensor的创建
Pytorch使用教学2-Tensor的维度
Pytorch使用教学3-特殊张量的创建与类型转化
Pytorch使用教学4-张量的索引
Pytorch使用教学5-视图view与reshape的区别
Pytorch使用教学6-张量的分割与合并
Pytorch使用教学7-张量的广播
Pytorch使用教学8-张量的科学运算
Pytorch使用教学9-张量的线性代数运算
Pytorch使用教学10-张量操作方法大总结

有关Pytorch建模相关的AI干货请扫码关注公众号「AI有温度」阅读获取

相关推荐
985小水博一枚呀几秒前
【深度学习滑坡制图|论文解读3】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer
龙哥说跨境1 分钟前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
AltmanChan1 分钟前
大语言模型安全威胁
人工智能·安全·语言模型
985小水博一枚呀5 分钟前
【深度学习滑坡制图|论文解读2】基于融合CNN-Transformer网络和深度迁移学习的遥感影像滑坡制图方法
人工智能·深度学习·神经网络·cnn·transformer·迁移学习
数据与后端架构提升之路14 分钟前
从神经元到神经网络:深度学习的进化之旅
人工智能·神经网络·学习
小白学大数据17 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
flashman91118 分钟前
python在word中插入图片
python·microsoft·自动化·word
爱技术的小伙子20 分钟前
【ChatGPT】如何通过逐步提示提高ChatGPT的细节描写
人工智能·chatgpt
菜鸟的人工智能之路21 分钟前
桑基图在医学数据分析中的更复杂应用示例
python·数据分析·健康医疗
懒大王爱吃狼2 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍