PyTorch中的squeeze()和unsqueeze()解析与应用案例

目录
  • 1.torch.squeeze
  • 2.torch.unsqueeze
  • 3.例子

附上官网地址:

https://pytorch.org/docs/stable/index.html

1.torch.squeeze

squeeze的用法主要就是对数据的维度进行压缩或者解压。

先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行。squeeze(a)就是将a中所有为1的维度删掉。不为1的维度没有影响。a.squeeze(N) 就是去掉a中指定的维数为一的维度。还有一种形式就是b=torch.squeeze(a,N) a中去掉指定的定的维数为一的维度。

换言之:

表示若第arg维的维度值为1,则去掉该维度,否则tensor不变。(即若tensor.shape()[arg] == 1,则去掉该维度)

例如:

一个维度为2x1x2x1x2的tensor,不用去想它长什么样儿,squeeze(0)就是不变,squeeze(1)就是变成2x2x1x2。(0是从最左边的维度算起的)

>>> x = torch.zeros(2, 1, 2, 1, 2)
>>> x.size()
torch.Size([2, 1, 2, 1, 2])
>>> y = torch.squeeze(x)
>>> y.size()
torch.Size([2, 2, 2])
>>> y = torch.squeeze(x, 0)
>>> y.size()
torch.Size([2, 1, 2, 1, 2])
>>> y = torch.squeeze(x, 1)
>>> y.size()
torch.Size([2, 2, 1, 2])

2.torch.unsqueeze

torch.unsqueeze()这个函数主要是对数据维度进行扩充。给指定位置加上维数为一的维度,比如原本有个三行的数据(3),在0的位置加了一维就变成一行三列(1,3)。a.squeeze(N) 就是在a中指定位置N加上一个维数为1的维度。还有一种形式就是b=torch.squeeze(a,N) a就是在a中指定位置N加上一个维数为1的维度。

>>> x = torch.tensor([1, 2, 3, 4])
>>> torch.unsqueeze(x, 0)
tensor([[ 1,  2,  3,  4]])
>>> torch.unsqueeze(x, 1)
tensor([[ 1],
        [ 2],
        [ 3],
        [ 4]])

3.例子

给一个使用上述两个函数,并进行一次卷积的例子:

from torchvision.transforms import  ToTensor
import torch as t
from torch import nnimport cv2
import numpy as np
import cv2
to_tensor = ToTensor()
# 加载图像
lena = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('lena', lena)
# input = to_tensor(lena) 将ndarray转换为tensor,自动将[0,255]归一化至[0,1]。
input = to_tensor(lena).unsqueeze(0)
# 初始化卷积参数
kernel = t.ones(1, 1, 3, 3)/-9
kernel[:, :, 1, 1] = 1
conv = nn.Conv2d(1, 1, 3, 1, padding=1, bias=False)
conv.weight.data = kernel.view(1, 1, 3, 3)
# 输出
out = conv(input)
out = out.squeeze(0)
print(out.shape)
out = out.unsqueeze(3)
print(out.shape)
out = out.squeeze(0)
print(out.shape)
out = out.detach().numpy()# 缩放到0~最大值
cv2.normalize(out, out, 1.0, 0, cv2.NORM_INF)
cv2.imshow("lena-result", out)
cv2.waitKey()

结果图如下:

到此这篇关于PyTorch中的squeeze()unsqueeze()解析与应用案例的文章就介绍到这了,更多相关squeeze()和unsqueeze()解析内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

references:
[1] 陈云.深度学习框架之PyTorch入门与实践.北京:电子工业出版社,2018.

(0)

相关推荐

  • 详解pytorch中squeeze()和unsqueeze()函数介绍

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行.squeeze(a)就是将a中所有为1的维度删掉.不为1的维度没有影响.a.squeeze(N) 就是去掉a中指定的维数为一的维度.还有一种形式就是b=torch.squeeze(a,N) a中去掉指定的定的维数为一的维度. 再看torch.unsque

  • 基于python介绍pytorch保存和恢复参数

    目录 一.读写文件 1.加载和保存张量 2.加载和保存模型 一.读写文件 1.加载和保存张量 import torch from torch import nn from torch.nn import functional as F import os path = os.path.join(os.getcwd(), "") x = torch.arange(4) torch.save(x, path + "x-file") 现在我们可以将存储在文件中的数据读回内

  • 加速 PyTorch 模型训练的 9 个技巧(收藏)

    目录 Pytorch-Lightning 1.DataLoaders 2.DataLoaders中的workers的数量 3.Batchsize 4.梯度累加 5.保留的计算图 6.单个GPU训练 7.16-bit精度 8.移动到多个GPUs中 9.多节点GPU训练 10.福利!在单个节点上多GPU更快的训练 对模型加速的思考 让我们面对现实吧,你的模型可能还停留在石器时代.我敢打赌你仍然使用32位精度或GASP甚至只在一个GPU上训练. 我明白,网上都是各种神经网络加速指南,但是一个check

  • PyTorch中的squeeze()和unsqueeze()解析与应用案例

    目录 1.torch.squeeze 2.torch.unsqueeze 3.例子 附上官网地址: https://pytorch.org/docs/stable/index.html 1.torch.squeeze squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的数去掉第一个维数为一的维度之后就变成(3)行.squeeze(a)就是将a中所有为

  • pytorch中的squeeze函数、cat函数使用

    1 squeeze(): 去除size为1的维度,包括行和列. 至于维度大于等于2时,squeeze()不起作用. 行.例: >>> torch.rand(4, 1, 3) (0 ,.,.) = 0.5391 0.8523 0.9260 (1 ,.,.) = 0.2507 0.9512 0.6578 (2 ,.,.) = 0.7302 0.3531 0.9442 (3 ,.,.) = 0.2689 0.4367 0.6610 [torch.FloatTensor of size 4x1x

  • 对Pytorch中Tensor的各种池化操作解析

    AdaptiveAvgPool1d(N) 对一个C*H*W的三维输入Tensor, 池化输出为C*H*N, 即按照H轴逐行对W轴平均池化 >>> a = torch.ones(2,3,4) >>> a[0,1,2] = 0 >>>> a tensor([[[1., 1., 1., 1.], [1., 1., 0., 1.], [1., 1., 1., 1.]], [[1., 1., 1., 1.], [1., 1., 1., 1.], [1.,

  • Pytorch中torch.stack()函数的深入解析

    目录 一. torch.stack()函数解析 1. 函数说明: 2. 代码举例 总结 一. torch.stack()函数解析 1. 函数说明: 1.1 官网:torch.stack(),函数定义及参数说明如下图所示: 1.2 函数功能 沿一个新维度对输入一系列张量进行连接,序列中所有张量应为相同形状,stack 函数返回的结果会新增一个维度.也即是把多个2维的张量凑成一个3维的张量:多个3维的凑成一个4维的张量…以此类推,也就是在增加新的维度上面进行堆叠. 1.3 参数列表 tensors

  • 解析Pytorch中的torch.gather()函数

    参数说明 以官方说明为例,gather()函数需要三个参数,输入input,维度dim,以及索引index input必须为Tensor类型 dim为int类型,代表从哪个维度进行索引 index为LongTensor类型 举例说明 input=torch.tensor([[1,2,3],[4,5,6]]) #作为输入 index1=torch.tensor([[0,1,1],[0,1,1]]) #作为索引矩阵 # dim=0时,按列进行索引 print (torch.gather(input,

  • pytorch中函数tensor.numpy()的数据类型解析

    目录 函数tensor.numpy()的数据类型 tensor数据和numpy数据转换中注意的一个问题 函数tensor.numpy()的数据类型 今天写代码的时候,要统计一下标签数据里出现的类别总数和要分类的分类数是不是一致的. 我的做法是把tensor类型的数据转变成list,然后用Counter函数做统计. 代码如下: from collections import Counter List_counter = Counter(List1) #List1就是待统计的数据,是一维的列表.生成

  • Pytorch中Tensor与各种图像格式的相互转化详解

    前言 在pytorch中经常会遇到图像格式的转化,例如将PIL库读取出来的图片转化为Tensor,亦或者将Tensor转化为numpy格式的图片.而且使用不同图像处理库读取出来的图片格式也不相同,因此,如何在pytorch中正确转化各种图片格式(PIL.numpy.Tensor)是一个在调试中比较重要的问题. 本文主要说明在pytorch中如何正确将图片格式在各种图像库读取格式以及tensor向量之间转化的问题.以下代码经过测试都可以在Pytorch-0.4.0或0.3.0版本直接使用. 对py

  • 浅谈pytorch中stack和cat的及to_tensor的坑

    初入计算机视觉遇到的一些坑 1.pytorch中转tensor x=np.random.randint(10,100,(10,10,10)) x=TF.to_tensor(x) print(x) 这个函数会对输入数据进行自动归一化,比如有时候我们需要将0-255的图片转为numpy类型的数据,则会自动转为0-1之间 2.stack和cat之间的差别 stack x=torch.randn((1,2,3)) y=torch.randn((1,2,3)) z=torch.stack((x,y))#默

  • pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作

    F.avg_pool1d()数据是三维输入 input维度: (batch_size,channels,width)channel可以看成高度 kenerl维度:(一维:表示width的跨度)channel和输入的channel一致可以认为是矩阵的高度 假设kernel_size=2,则每俩列相加求平均,stride默认和kernel_size保持一致,越界则丢弃(下面表示1,2列和3,4列相加求平均) input = torch.tensor([[1,1,1,1,1],[1,1,1,1,1],

随机推荐