卷积的计算 - 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 = 1 W + 2 X + 5 Y + 6 Z b = 2 W + 3 X + 6 Y + 7 Z c = 3 W + 4 X + 7 Y + 8 Z d = 5 W + 6 X + 9 Y + 10 Z e = 6 W + 7 X + 10 Y + 11 Z f = 7 W + 8 X + 11 Y + 12 Z g = 9 W + 10 X + 13 Y + 14 Z h = 10 W + 11 X + 14 Y + 15 Z i = 11 W + 12 X + 15 Y + 16 Z \begin{equation} \begin{aligned} a &= 1W + 2X + 5Y + 6Z \\ b &= 2W + 3X + 6Y + 7Z \\ c &= 3W + 4X + 7Y + 8Z \\ d &= 5W + 6X + 9Y + 10Z \\ e &= 6W + 7X + 10Y + 11Z \\ f &= 7W + 8X + 11Y + 12Z \\ g &= 9W + 10X + 13Y + 14Z \\ h &= 10W + 11X + 14Y + 15Z \\ i &= 11W + 12X + 15Y + 16Z \end{aligned} \end{equation} abcdefghi=1W+2X+5Y+6Z=2W+3X+6Y+7Z=3W+4X+7Y+8Z=5W+6X+9Y+10Z=6W+7X+10Y+11Z=7W+8X+11Y+12Z=9W+10X+13Y+14Z=10W+11X+14Y+15Z=11W+12X+15Y+16Z

( 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.shape
    k_h, k_w = kernel_size
    s = stride
    out_h = (H - k_h)//s + 1
    out_w = (W - k_w)//s + 1
 
    col = torch.zeros((N, C, k_h, k_w, out_h, out_w))
 
    for y in range(k_h):
        h_lim = y + s * out_h
        for x in range(k_w):
            w_lim = x + s*out_w
            col[:, :, 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 col

image = 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.]])

参考
High Performance Convolutional Neural Networks forDocument Processing

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值