Pytorch中的resize和reshape

torch.reshape()

官方文档的大致意思是:

返回与输入具有相同数据和元素数量的张量,但是具有指定形状。如果可能,返回的张量将是输入的视图,也就是说原本的tensor并没有被改变,如果想要改变那么就将改变的tensor赋值给原本的就行,即:tensor_temp = torch.reshape(tensor_temp, xxx))。

个人理解是给数组一个新的形状,数据和元素数量及顺序不变,按照形状截断、重新拼起来成为一个张量,可以使用reshape用来增加数组的维度。

代码示例:

python 复制代码
import torch
a=torch.tensor([[[1,2,3],[4,5,6]],
                [[7,8,9],[10,11,12]]])
print("a的shape:",a.shape)
b=torch.reshape(a,((4,3,1)))
print("b:",b)
print("b的shape:",b.shape)
python 复制代码
a的shape: torch.Size([2, 2, 3])
b: tensor([[[ 1],
         [ 2],
         [ 3]],

        [[ 4],
         [ 5],
         [ 6]],

        [[ 7],
         [ 8],
         [ 9]],

        [[10],
         [11],
         [12]]])
b的shape: torch.Size([4, 3, 1])

占位符-1:

python 复制代码
import torch
a=torch.tensor([[[1,2,3],[4,5,6]],
                [[7,8,9],[10,11,12]]])
b=torch.reshape(a,(-1,))
c=torch.reshape(a,(-1,1))
d=torch.reshape(a,((-1,1,1)))
e=torch.reshape(a,((-1,1,1,1)))
f=torch.reshape(a,((-1,3,4)))

# a的shape:torch.Size([2, 2, 3])
# b的shape:torch.Size([12])
# c的shape:torch.Size([12, 1])
# d的shape: torch.Size([12, 1, 1])
# e的shape: torch.Size([12, 1, 1, 1])
# f的shape: torch.Size([1, 3, 4])

-1表示表示其具体值由其他维度信息和元素总个数推断出来。

一个使用场景:

对于torch.nn.functional.conv2d这个函数

python 复制代码
torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation=1, groups=1)

其中参数input -- input tensor of shape (minibatch, in_channels, iH, iW)是一个4D张量,如果要把下面这样一个输入矩阵,变为4D张量,就可以使用reshape函数。

\[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\]

python 复制代码
input = torch.reshape(input,[1,1,5,5])

torch.transforms.Resize()

transforms.Resize()可以作为数据预处理管道中的一个步骤,用于将输入的图像按照指定的大小或缩放因子进行调整。这样可以确保输入的图像满足模型的输入要求,或者保持不同数据样本具有相同的输入尺寸,在训练或推理过程中方便批次处理。

用来调整PILImage对象 的尺寸,注意不能是用io.imread或者cv2.imread 读取的图片,这两种方法得到的是ndarray ,input只能是PIL Image or Tensor

python 复制代码
from torchvision import transforms

img_path = "xxx"
img = Image.open(img_path)

trans1 = transforms.Resize([h, w]) # 同时指定长宽,写为trans1 = transforms.Resize((h, w))也是可以的,transforms.Resize 接受的参数可以是整数、元组或列表。
trans2 = transforms.Resize(x) # 将图片短边缩放至x,长宽比保持不变

img1 = trans1(img)
img2 = trans2(img)

resize虽然会改变图片的长宽比,但是本身并没有发生裁切,仍可以通过resize方法返回原来的形状。

要注意的一点是PILImage对象size属性返回的是w, h,而resize的参数顺序是h, w。

参考:

https://blog.csdn.net/qq_51533157/article/details/122816008

https://blog.csdn.net/qq_35008185/article/details/118224044

https://segmentfault.com/a/1190000043683736

相关推荐
Blossom.11840 分钟前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
scdifsn2 小时前
动手学深度学习12.7. 参数服务器-笔记&练习(PyTorch)
pytorch·笔记·深度学习·分布式计算·数据并行·参数服务器
DFminer2 小时前
【LLM】fast-api 流式生成测试
人工智能·机器人
郄堃Deep Traffic2 小时前
机器学习+城市规划第十四期:利用半参数地理加权回归来实现区域带宽不同的规划任务
人工智能·机器学习·回归·城市规划
海盗儿3 小时前
Attention Is All You Need (Transformer) 以及Transformer pytorch实现
pytorch·深度学习·transformer
GIS小天3 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
阿部多瑞 ABU3 小时前
主流大语言模型安全性测试(三):阿拉伯语越狱提示词下的表现与分析
人工智能·安全·ai·语言模型·安全性测试
cnbestec3 小时前
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
人工智能·线性代数·触觉传感器
不爱写代码的玉子3 小时前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#
sbc-study4 小时前
PCDF (Progressive Continuous Discrimination Filter)模块构建
人工智能·深度学习·计算机视觉