pytorch 反卷積 視覺化 手推反卷積

2021-10-14 14:24:49 字數 1913 閱讀 2577

在推導反卷積之前,先推導一下卷積。

假設輸入為

將輸入矩陣轉成乙個

則 ,所以

用pytorch驗證一下結果

import torch

import torch.nn.functional as f

x = torch.tensor([[[[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15]]]])

c = torch.tensor([[[[0,1,2],[3,4,5],[6,7,8]]]])

y = f.conv2d(x, c)

print(y)

>>tensor([[[[258., 294.],

[402., 438.]]]])

預熱做完了,下面進入正題。反卷積可看作是卷積的逆過程,輸出大小的計算公式為完全可以按照卷積輸出的公式倒推

若輸入為

,卷積核為

,當 時,輸出大小為

將輸入矩陣擴充套件並做轉置,得到

的矩陣,將卷積核轉成

則,所以

用pytorch驗證一下結果

import torch

import torch.nn.functional as f

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

c = torch.tensor([[[[5,6],[7,8]]]])

y = f.conv_transpose2d(x, c, stride=2,padding=0)

print(y)

>>tensor([[[[ 5., 10., 6., 12.],

[ 15., 20., 18., 24.],

[ 7., 14., 8., 16.],

[ 21., 28., 24., 32.]]]])

若輸入為

,卷積核為

,當 時,同樣,計算出輸出大小為

將輸入矩陣擴充套件並做轉置,得到

的矩陣,將卷積核轉成

則,所以

用pytorch驗證一下結果

import torch

import torch.nn.functional as f

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

c = torch.tensor([[[[5,6],[7,8]]]])

y = f.conv_transpose2d(x, c, stride=1,padding=0)

print(y)

>>tensor([[[[ 5., 16., 12.],

[22., 60., 40.],

[21., 52., 32.]]]])

若輸入為

,卷積核為

,當 時,計算出輸出大小為

由於反卷積可以看做卷積的逆過程,所以padding=1即意味著將輸入矩陣最外層的元素砍掉,直接上圖更清晰。

將輸入矩陣擴充套件並做轉置,得到

的矩陣,將卷積核轉成

則,所以

用pytorch驗證一下結果

import torch

import torch.nn.functional as f

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

c = torch.tensor([[[[5,6],[7,8]]]])

y = f.conv_transpose2d(x, c, stride=1,padding=1)

print(y)

>>tensor([[[[60.]]]])

碼字不易,看完記得點讚哦~

卷積視覺化

影象卷積操作的應用沒有嚴格的數學推導,即沒有數學推導表明每一層究竟表示什麼。為了了解卷積神經網路中每一層與原有影象的對應關係,文章visualizing and understanding convolutional networks通過反向卷積的方式實現了該過程。那具體如何操作的呢?得到的h1與真...

卷積視覺化瞎掰

首先讀取一張1271273的rgb影象,然後把讀到的影象轉換成tensor 13127127 執行11卷積 把卷積後得到的tensor轉換成numpy 再把numpy轉換成能生成的那種格式 1 127 127大小 卷積之前 crop z tensor.size conv2 torch.nn.conv...

PyTorch 視覺化特徵

這個也可以參考 這篇部落格主要記錄了如何提取特定層的特徵,然後對它進行視覺化 處理單張作為網路輸入。根據給定的layer層,獲取該層的輸出結果features。考慮到features的形狀為 batch size,filter nums,h,w 提取其中的第乙個過濾器得到的結果feature。以一張...