python pytorch 维度调整

本文演示了如何使用NumPy和PyTorch进行张量操作,包括形状转换和扩展。首先,通过NumPy创建一个三维数组,并从中提取最后一维;然后,将NumPy数组转换为PyTorch张量,进行unsqueeze操作以增加维度,最后通过expand方法将张量扩展到特定大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

import numpy as np
import torch

a = np.arange(24).reshape(2,3,4)
b = a[:,-1,:]
print(b.shape)

x = torch.from_numpy(a)
y = x[:,-1,:].unsqueeze(1)
print(y.size())
z = y.expand(2,4,4)
print(z.size())

输出

(2, 4)
torch.Size([2, 1, 4])
torch.Size([2, 4, 4])
### PyTorch 中的张量维度转换方法 在 PyTorch 中,可以使用多种方法来改变张量的形状或排列顺序。以下是几种常见的操作: #### 使用 `view` 方法 `view` 是一种常用的重塑张量的方法,它返回一个新的具有相同数据但不同大小的张量。 ```python import torch tensor = torch.randn(4, 4) reshaped_tensor = tensor.view(-1) # 将多维数组展平成一维向量 print(f"Original shape: {tensor.shape}, Reshaped to: {reshaped_tensor.shape}") ``` 这种方法适用于当知道目标尺寸时,并且原始张量中的元素总数应等于新尺寸下的乘积[^2]。 #### 利用 `reshape` 与 `view` 类似,`reshape` 函数也可以用来调整张量的结构;不过,在某些情况下更灵活一些因为即使内存布局不连续也能工作得很好。 ```python new_shape = (8, 2) transformed_tensor = tensor.reshape(new_shape) print(f"After reshaping with reshape():\n{transformed_tensor}\nShape is now:{transformed_tensor.size()}") ``` 对于上述例子而言,如果原矩阵是 `[batch_size, channels, height, width]` 形式的图像,则可以通过指定新的 batch size 或者 channel 数目来进行变换。 #### 应用 `permute` 为了重新排列给定张量轴的位置,可采用 `permute()` 。这对于像卷积神经网络这样的场景特别有用,其中输入可能需要特定的通道优先级。 ```python input_tensor = torch.rand((3, 5, 5)) transposed_tensor = input_tensor.permute(1, 2, 0) # 这里我们将原本的第一维度移到最后一位 print(f"Permuted dimensions from ({input_tensor.dim()}D): \nBefore permute:\n{input_tensor}\ \nAfter applying permute():\n{transposed_tensor}") ``` 此函数接收一个整数元组作为参数列表,表示各个维度的新索引位置。 #### 调用 `unsqueeze` 和 `squeeze` 有时会遇到增加单例维度的需求(即长度为 1 的额外维度),这时可以用到 `unsqueeze(dim)` ,而相反地移除这些多余的单一维度则通过调用 `squeeze([dim])` 实现。 ```python single_dim_added = transformed_tensor.unsqueeze(0) # 添加一个批次维度 reduced_dims = single_dim_added.squeeze() # 移除所有大小为1的维度 print(f"With unsqueeze added a singleton dim at start.\nResulting Tensor Shape after squeeze(): {reduced_dims.shape}") ``` 以上就是在 PyTorch 当中处理张量维度变化的一些基本方式及其应用实例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值