002.PyTorch的张量拼接和变换

PyTorch的张量拼接和变换

在深度学习中,张量是数据的基本单位。PyTorch 提供了一系列强大的张量操作,让我们在构建神经网络时能够更加轻松地进行数据处理和转换。本文将介绍一些常用的张量索引、调整形状与合并操作,并展示如何在 PyTorch 中应用这些技巧。

张量索引

当你需要选择或者修改张量中的特定元素时,张量索引非常有用。假设我们有一个顺序排列的1D张量t

import torch

t = torch.arange(1,10)  # 创建一个从1到9的张量

要获取张量中的第一个元素:

print(t[0])  # 输出第一个元素

同样,如果你想提取第2到第8个元素,可以使用切片操作:

print(t[1:8])  # 输出第2到第8个元素

如果你想每隔一个元素提取一次:

print(t[1::2])  # 从第2个元素开始每隔一个提取

对于高维张量,索引操作同样适用。例如,我们定义一个3x3的张量:

t = torch.arange(1,10).reshape(3,3)

访问第1行第2列的元素可以使用如下方式:

print(t[0,1])  # 输出第1行,第2列的元素

及选择所有行的特定几列:

print(t[:,[0,2]])  # 选择全部行,第1和第3列

如果想用索引向量直接选取特定维度的多个元素,可使用torch.index_select方法:

indices = torch.tensor([1,2])
selected = torch.index_select(t, 0, indices)
print(selected)

# 输出
# tensor([[4, 5, 6],
#        [7, 8, 9]])

视图和变形

通过变换张量的形状,我们可以获得视图(view),它允许我们以不同的维度来解读相同的数据:

t = torch.arange(1,7).reshape(2,3)
print(t.view(3,2))  # 改变形状为3x2

# 删除单一维度
t = t.reshape(1,1,1,2,3)
print(t.squeeze())  # 删除所有单一维度,等同于 torch.squeeze(t)

# 新增维度
t = torch.arange(1,7).reshape(2,3)
print(t.unsqueeze(dim=0))  # 在第0维新增一个维度

分块

将大的张量分成小的块可以方便地进行小批量的操作:

t = torch.arange(0,12).reshape(4,3)

# 第0维度切分成4块
chunks = torch.chunk(t, 4, dim=0)
for chunk in chunks:
    print(chunk)

# 按给定的大小切分
splits = torch.split(t,[1,3],dim=0)
for split in splits:
    print(split)

值得注意的是torch.chunk返回的是原始张量的视图,并不是新对象。

拼接和堆叠

合并不同的张量可以帮助我们构建更大的数据集:

a = torch.ones([2,3])
b = torch.zeros([2,3])

# 第0维拼接(追加行)
print(torch.cat([a,b]))

# 第1维拼接(列拼接)
print(torch.cat([a,b],1))

# 堆叠生成新的维度
print(torch.stack([a,b]))

当我们使用torch.stack时,需要保证所有堆叠的张量尺寸相同。

通过掌握以上技巧,你已经能够有效地操纵和变换张量,这将极大地帮助你在实际项目中灵活地处理数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王辉辉的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值