說明
一個代碼里涉及到了unfold的操作,看了半天官網都沒整明白維度怎么變化的,參考這個鏈接搞明白了:
https://blog.csdn.net/ViatorSun/article/details/119940759
https://zhuanlan.zhihu.com/p/361140988
維度計算
輸入( N, C, H, W)
輸出(N,C×∏(kernel_size),L)
L 是通過卷積核 滑動裁剪 后,得到的區塊的數量。
C×∏(kernel_size)是怎么來的?
從第一個參考鏈接的圖可以看到,就是窗口滑動的時候,把窗口同一個位置的值放在了一個通道,所以窗口有多少個像素,就變成了多少個通道。
用參考博客的代碼做一個示例:
inputs = torch.randn(1, 2, 4, 4)
print(inputs.size())
print(inputs)
unfold = torch.nn.Unfold(kernel_size=(2, 2), stride=2)
patches = unfold(inputs)
print(patches.size())
print(patches)
輸出結果
torch.Size([1, 2, 4, 4])
tensor([[[[ 0.4448, -1.8525, -1.8243, -1.0243],[ 0.0224, -1.2402, -0.7154, -1.2538],[-0.6515, -0.6022, 0.2263, -1.6286],[ 0.2067, 0.8257, -1.9318, 1.0372]],[[ 2.4799, -0.5248, -0.3170, 1.5934],[-0.3643, 1.1624, -1.5762, -0.1827],[-0.0553, 0.1629, -1.3280, -0.8468],[ 0.0671, 1.6328, 1.1706, 1.7891]]]])
torch.Size([1, 8, 4])
tensor([[[ 0.4448, -1.8243, -0.6515, 0.2263],[-1.8525, -1.0243, -0.6022, -1.6286],[ 0.0224, -0.7154, 0.2067, -1.9318],[-1.2402, -1.2538, 0.8257, 1.0372],[ 2.4799, -0.3170, -0.0553, -1.3280],[-0.5248, 1.5934, 0.1629, -0.8468],[-0.3643, -1.5762, 0.0671, 1.1706],[ 1.1624, -0.1827, 1.6328, 1.7891]]])
用兩個窗口的情況來舉例,每個位置對應的結果情況如下: