本文主要是介绍卷积的计算 - im2col 1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
卷积的计算 - im2col 1
flyfish
输入
input: [[[[ 1 2 3 4][ 5 6 7 8][ 9 10 11 12][13 14 15 16]]]]
中间过程
tensor([[[[[[ 1., 2., 3.],[ 5., 6., 7.],[ 9., 10., 11.]],[[ 2., 3., 4.],[ 6., 7., 8.],[10., 11., 12.]]],[[[ 5., 6., 7.],[ 9., 10., 11.],[13., 14., 15.]],[[ 6., 7., 8.],[10., 11., 12.],[14., 15., 16.]]]]]])
最后
tensor([[ 1., 2., 3., 5., 6., 7., 9., 10., 11.],[ 2., 3., 4., 6., 7., 8., 10., 11., 12.],[ 5., 6., 7., 9., 10., 11., 13., 14., 15.],[ 6., 7., 8., 10., 11., 12., 14., 15., 16.]])
( a b c d e f g h i ) ⊤ = ( 1 W + 2 X + 5 Y + 6 Z 2 W + 3 X + 6 Y + 7 Z 3 W + 4 X + 7 Y + 8 Z 5 W + 6 X + 9 Y + 10 Z 6 W + 7 X + 10 Y + 11 Z 7 W + 8 X + 11 Y + 12 Z 8 W + 9 X + 12 Y + 13 Z 10 W + 11 X + 14 Y + 15 Z 11 W + 12 X + 15 Y + 16 Z ) ⊤ {\begin{align} \left( \begin{array}{c} a \\ b \\ c \\ d \\ e \\ f \\ g \\ h \\ i \end{array} \right)^{\top} &= \left( \begin{array}{c} 1W + 2X + 5Y + 6Z \\ 2W + 3X + 6Y + 7Z \\ 3W + 4X + 7Y + 8Z \\ 5W + 6X + 9Y + 10Z \\ 6W + 7X + 10Y + 11Z \\ 7W + 8X + 11Y + 12Z \\ 8W + 9X + 12Y + 13Z \\ 10W + 11X + 14Y + 15Z \\ 11W + 12X + 15Y + 16Z \end{array} \right)^{\top} \end{align} } abcdefghi ⊤= 1W+2X+5Y+6Z2W+3X+6Y+7Z3W+4X+7Y+8Z5W+6X+9Y+10Z6W+7X+10Y+11Z7W+8X+11Y+12Z8W+9X+12Y+13Z10W+11X+14Y+15Z11W+12X+15Y+16Z ⊤
拆开
( a b c d e f g h i ) ⊤ = ( W X Y Z ) ( 1 2 3 5 6 7 9 10 11 2 3 4 6 7 8 10 11 12 5 6 7 9 10 11 13 14 15 6 7 8 10 11 12 14 15 16 ) = ( 1 W + 2 X + 5 Y + 6 Z 2 W + 3 X + 6 Y + 7 Z 3 W + 4 X + 7 Y + 8 Z 5 W + 6 X + 9 Y + 10 Z 6 W + 7 X + 10 Y + 11 Z 7 W + 8 X + 11 Y + 12 Z 8 W + 9 X + 12 Y + 13 Z 10 W + 11 X + 14 Y + 15 Z 11 W + 12 X + 15 Y + 16 Z ) ⊤ {\begin{align} \left( \begin{array}{c} a \\ b \\ c \\ d \\ e \\ f \\ g \\ h \\ i \end{array} \right)^{\top} &= \left( \begin{array}{cccc} W & X & Y & Z \end{array} \right) \left( \begin{array}{ccccccccc} 1 & 2 & 3 & 5 & 6 & 7 & 9 & 10 & 11 \\ 2 & 3 & 4 & 6 & 7 & 8 & 10 & 11 & 12 \\ 5 & 6 & 7 & 9 & 10 & 11 & 13 & 14 & 15 \\ 6 & 7 & 8 & 10 & 11 & 12 & 14 & 15 & 16 \end{array} \right) \\ &= \left( \begin{array}{c} 1W + 2X + 5Y + 6Z \\ 2W + 3X + 6Y + 7Z \\ 3W + 4X + 7Y + 8Z \\ 5W + 6X + 9Y + 10Z \\ 6W + 7X + 10Y + 11Z \\ 7W + 8X + 11Y + 12Z \\ 8W + 9X + 12Y + 13Z \\ 10W + 11X + 14Y + 15Z \\ 11W + 12X + 15Y + 16Z \end{array} \right)^{\top} \end{align} } abcdefghi ⊤=(WXYZ) 1256236734785691067101178111291013141011141511121516 = 1W+2X+5Y+6Z2W+3X+6Y+7Z3W+4X+7Y+8Z5W+6X+9Y+10Z6W+7X+10Y+11Z7W+8X+11Y+12Z8W+9X+12Y+13Z10W+11X+14Y+15Z11W+12X+15Y+16Z ⊤
import numpy as np
import torch# k = kernel
# s = stride
def im2col(img, kernel_size, stride=1,padding=0):N, C, H, W = img.shapek_h, k_w = kernel_sizes = strideout_h = (H - k_h)//s + 1out_w = (W - k_w)//s + 1col = torch.zeros((N, C, k_h, k_w, out_h, out_w))for y in range(k_h):h_lim = y + s * out_hfor x in range(k_w):w_lim = x + s*out_wcol[:, :, y, x, :, :] = img[:, :, y:h_lim:s, x:w_lim:s]print(col)col = col.permute(1, 2, 3, 0, 4, 5 ).contiguous().reshape(C * k_h * k_w,N * out_h * out_w)return colimage = np.arange(1, 17).reshape(-1, 1, 4, 4)#模拟PyTorch用的NCHW
print("input:",image)
x = torch.tensor(image)
# 测试
print(im2col(x,(2,2)))
其他方式的展开
col = col.permute(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)
tensor([[ 1., 2., 5., 6.],[ 2., 3., 6., 7.],[ 3., 4., 7., 8.],[ 5., 6., 9., 10.],[ 6., 7., 10., 11.],[ 7., 8., 11., 12.],[ 9., 10., 13., 14.],[10., 11., 14., 15.],[11., 12., 15., 16.]])
这篇关于卷积的计算 - im2col 1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!