在推導反卷積之前,先推導一下卷積。
假設輸入為
將輸入矩陣轉成乙個
則 ,所以
用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。以一張...