PyTorch中的squeeze()和unsqueeze()解析與應用案例
附上官網地址:
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()解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
references:
[1] 陳云.深度學習框架之PyTorch入門與實踐.北京:電子工業(yè)出版社,2018.
相關文章
Python使用re模塊實現okenizer(表達式分詞器)
這篇文章主要介紹了Python使用re模塊實現okenizer,我們這里講解用正則表達式構建簡單的表達式分詞器(tokenizer),它能夠將表達式字符串從左到右解析為標記(tokens)流,需要的朋友可以參考下2022-04-04
python-Web-flask-視圖內容和模板知識點西寧街
在本篇文章里小編給大家分享了關于python-Web-flask-視圖內容和模板的相關知識點內容,有需要的朋友們參考學習下。2019-08-08
termux中matplotlib無法顯示中文問題的解決方法
這篇文章主要介紹了termux中matplotlib無法顯示中文問題的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01

