深度学习(PyTorch)——shape、view、reshape用法及其区别

一、python中的view()函数的用法

初学者在使用pytorch框架定义神经网络时,经常会在代码中看到:

 这样的用法。

view()的作用相当于numpy中的reshape,重新定义矩阵的形状。

例1 普通用法:

import torch
v1 = torch.range(1, 16) 
v2 = v1.view(4, 4)  

其中v1为1*16大小的张量,包含16个元素。
v2为4*4大小的张量,同样包含16个元素。注意view前后的元素个数要相同,不然会报错。

例2 参数使用-1

import torch
v1 = torch.range(1, 16) 
v2 = v1.view(-1, 4)  

和图例中的用法一样,view中一个参数定为-1,代表动态调整这个维度上的元素个数,以保证元素的总数不变。因此两个例子的结果是相同的。

二、python中的shape()函数的用法

shape包含在numpy库,是矩阵(ndarray)的属性,可以获取矩阵的形状(例如二维数组的行列),获取的结果是一个元组,因此相关代码如下:
import numpy as np
x = np.array([[1,2,3,4,5],[6,7,8,9,10],[10,9,8,7,6],[5,4,3]])
#输出数组的行和列数
print (x.shape) #结果: (4, 5)
#只输出行数
print (x.shape[0]) #结果: 4
#只输出列数
print (x.shape[1]) #结果: 5

import torch
input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])

kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

print(input.shape)
print(kernel.shape)

输出结果为:

三、python中的reshape()函数的用法

 reshape新生成数组和原数组公用一个内存,不管改变哪个都会互相影响。

import torch
import torch.nn.functional as F
input = torch.tensor([[1,2,0,3,1],
                      [0,1,2,3,1],
                      [1,2,1,0,0],
                      [5,2,3,1,1],
                      [2,1,0,1,1]])

kernel = torch.tensor([[1,2,1],
                       [0,1,0],
                       [2,1,0]])

input = torch.reshape(input, (1,1,5,5)) # 变成batch_size=1,channel=1,高H=5,宽W=5
kernel = torch.reshape(kernel, (1,1,3,3)) # 变成batch_size=1,channel=1,高H=5,宽W=5

print(input.shape)
print(kernel.shape)

 运行结果为:

四、view和reshape的区别

torch的view()与reshape()方法都可以用来重塑tensor的shape,区别是使用的条件不一样。view()方法只适用于满足连续性条件的tensor,并且该操作不会开辟新的内存空间,只是产生了对原存储空间的一个新别称和引用,返回值是视图。而reshape()方法的返回值既可以是视图,也可以是副本,当满足连续性条件时返回view,否则返回副本[ 此时等价于先调用contiguous()方法在使用view() ]。因此当不确能否使用view时,可以使用reshape。如果只是想简单地重塑一个tensor的shape,那么就是用reshape,但是如果需要考虑内存的开销而且要确保重塑后的tensor与之前的tensor共享存储空间,那就使用view()。

总之,两者都是用来重塑tensor的shape的。view只适合对满足连续性条件(contiguous)的tensor进行操作,而reshape同时还可以对不满足连续性条件的tensor进行操作,具有更好的鲁棒性。view能干的reshape都能干,如果view不能干就可以用reshape来处理。

view的存在可以显示地表示对这个tensor的操作只能是视图操作而非拷贝操作。这对于代码的可读性以及后续可能的bug的查找比较友好。

### 深度学习中的 Reshape 操作 Reshape 是一种用于改变张量形状的操作,而不改变其数据。此操作允许开发者调整张量的维度以适应不同层的需求或优化计算效率。 #### PyTorch 中的 `reshape` 函数 在 PyTorch 中,`reshape()` 可用来重新排列张量的尺寸而不会影响底层数据[^1]。该函数接受新的形状作为参数,并返回一个新的具有指定形状的张量。如果希望保持某个维度不变,则可以在相应位置传入 `-1`,这会让 PyTorch 自动推断合适的大小。 ```python import torch # 创建一个随机初始化的 4D 张量 (batch_size=2, height=3, width=4, channels=5) tensor_4d = torch.rand((2, 3, 4, 5)) # 将上述张量重塑成二维矩阵形式 reshaped_tensor = tensor_4d.reshape(-1, 5) print(f'Original shape: {tensor_4d.shape}') print(f'Reshaped shape: {reshaped_tensor.shape}') ``` 对于更复杂的情况,比如 Vision Transformer 中处理图像嵌入时,可能需要将多维数组转换为特定的一维序列格式 `(n, h*w, c)`。此时可以利用 `reshape()` 或者类似的 `view()` 方法来简化这一过程[^2]: ```python image_tensor = torch.randn([4, 10, 10, 3]) flattened_image = image_tensor.reshape(image_tensor.size(0), -1, image_tensor.size(-1)) print(flattened_image.shape) # 输出应为 [4, 100, 3] ``` 值得注意的是,在某些情况下,直接修改张量的 `.size()` 属性并不总是安全的选择;因此推荐优先考虑使用 `reshape()` 来实现动态调整需求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值