PyTorch 反摺積運算(一)
反摺積是一種特殊的正向卷積操作, 通過補零的方式擴大輸入影像的尺寸, 接著翻轉卷積核, 和普通卷積一樣進行正向卷積, 由於前期補充了大量的零, 即便進行了卷積運算, 輸出影像的尺寸依然比輸入影像大, 這樣就達到了向上取樣的目的
下面展示一些例項, 使用 PyTorch 計算反摺積
示例-1: 輸入輸出通道數都是1, 步長也為1
輸入資料 1*1*3*3(Batch 和 Channel 均為 1)
In [1]: import torch
In [2]: from torch import nn
In [3]: torch.manual_seed(0)
Out[3]: <torch._C.Generator at 0x7f17986464b0>
In [4]: x = torch.randint(5, size=(1,1,3,3), dtype=torch.float)
In [5]: x
Out[5]:
tensor([[[[4., 4., 3.],
[0., 3., 4.],
[2., 3., 2.]]]])
卷積核 1*1*2*2
In [6]: w = torch.tensor([[1,2],[0,1]], dtype=torch.float).view(1,1,2,2)
In [7]: w
Out[7]:
tensor([[[[1., 2.],
[0., 1.]]]])
建立反摺積層, 不使用偏置(方便計算)
In [8]: layer = nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=2, stride=1, padding=0, bias=False)
In [9]: layer.weight = nn.Parameter(w)
In [10]: layer.eval()
Out[10]: ConvTranspose2d(1, 1, kernel_size=(2, 2), stride=(1, 1), bias=False)
手動計算
- 翻轉卷積核
- 填充零
對於正常卷積 oup = (inp + 2*padding - kernel_size) / stride + 1
, 反摺積可以看做普通卷積的映象操作, 反摺積的輸入對應正向卷積的輸出, 令 oup=3
, 得 inp=4
(padding=0, kernel_size=2, stride=1), 所以輸出尺寸為 4*4
步長為 1 時, 僅在四周補零, 為了得到 4*4 的輸出, 需要補一圈零
- 正向卷積
使用 PyTorch 計算
# 無需正向傳播
In [17]: with torch.no_grad():
...: y = layer(x)
...:
In [18]: y
Out[18]:
tensor([[[[ 4., 12., 11., 6.],
[ 0., 7., 14., 11.],
[ 2., 7., 11., 8.],
[ 0., 2., 3., 2.]]]])
修改反摺積層, 額外設定 padding=1
# padding=1
In [30]: layer_2 = nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=2, stride=1, padding=1, bias=False)
In [31]: layer_2.weight = nn.Parameter(w)
In [32]: layer_2.eval()
Out[32]: ConvTranspose2d(1, 1, kernel_size=(2, 2), stride=(1, 1), padding=(1, 1), bias=False)
根據 oup = (inp + 2*padding - kernel_size) / stride + 1
, 代入 oup=3, padding=1, kernel_size=2, stride=1, 得 inp=2, 反摺積後特徵圖尺寸為 2*2, 此時無需填充零, 計算過程為
使用 PyTorch 驗證
In [33]: with torch.no_grad():
...: y = layer_2(x)
...:
In [34]: y
Out[34]:
tensor([[[[ 7., 14.],
[ 7., 11.]]]])
相關文章
- 【小白學PyTorch】10 pytorch常見運算詳解PyTorch
- 深入淺出PyTorch(運算元篇)PyTorch
- pytorch基礎七(矩陣運算)PyTorch矩陣
- verilog實現矩陣卷積運算矩陣卷積
- 卷積運算元的矩陣向量乘積表示&一維離散降質模型卷積矩陣模型
- 一文搞明白位運算、補碼、反碼、原碼
- 用 Pytorch 理解卷積網路PyTorch卷積
- 值得收藏 | 深度剖析 TensorCore 卷積運算元實現原理卷積
- pytorch(1)梯度計算PyTorch梯度
- [PyTorch 學習筆記] 3.2 卷積層PyTorch筆記卷積
- NumPy 舍入小數、對數、求和和乘積運算詳解
- Spark常用Transformations運算元(一)SparkORM
- opencv 開運算、閉運算OpenCV
- PyTorch入門-殘差卷積神經網路PyTorch卷積神經網路
- 分組卷積+squeezenet+mobilenet+shufflenet的引數及運算量解析卷積
- onnx模型視覺化以及pytorch運算元與onnx節點對應關係模型視覺化PyTorch
- 使用運算元控制公式運算公式
- 邏輯、集合運算上的卷積一覽(FMT、FWT,……)卷積
- spark一些常用運算元Spark
- PCL 計算點雲的面積和體積
- 容積單位換算
- 向量點積計算javaJava
- PyTorch 實戰:計算 Wasserstein 距離PyTorch
- 使用位運算進行加法運算
- 使用位運算、值交換等方式反轉java字串-共四種方法Java字串
- matlab對不定積分和定積分的計算Matlab
- 二進位制、位運算、位移運算
- spark-運算元-分割槽運算元Spark
- day14.邏輯運算,位運算
- 一文了解有趣的位運算(&、|、^、~、>>、<<)
- 一個與運算引發的事故
- 圖卷積神經網路分類的pytorch實現卷積神經網路PyTorch
- Pytorch中自定義神經網路卷積核權重PyTorch神經網路卷積
- Pytorch筆記(一)PyTorch筆記
- 位運算
- 運算器
- 模運算
- 運算元