im2col()과 col2im() 작동 검증 방법 - LOPES-HUFS/DeepLearningFromForR GitHub Wiki

im2col() 작동 검증 방법

python에서 im2col() 작동 확인 방법 및 검증 자료 만들기

python에서 다음과 같이 자료를 만든다. 2차원 자료를 만들어서 4차원으로 만든다. 현재 m2col()을 만드는 이유가 CNN을 원할하게 작동하기 위한 것이기 때문에 채널을 따로 만들지 않고 2차원으로 만든 것을 3개 붙여서 3 채널을 만들고, 배치에서 사용하기 위하여 이것을 2개 붙여서 4차원을 만든다.

input = np.array([
[1,2,3,4,5,6,7],
 [8,9,10,11,12,13,14],
 [15,16,17,18,19,20,21],
 [22,23,24,25,26,27,28],
 [29,30,31,32,33,34,35],
 [36,37,38,39,40,41,42]
])
input_3d = np.array([input, input, input])
input_4d = np.array([input_3d, input_3d])

아래는 실제 코드를 입력한 화면이다.

>>> import numpy as np
>>> input = np.array([
... [1,2,3,4,5,6,7],
...  [8,9,10,11,12,13,14],
...  [15,16,17,18,19,20,21],
...  [22,23,24,25,26,27,28],
...  [29,30,31,32,33,34,35],
...  [36,37,38,39,40,41,42]
... ])
>>> input.shape
(6, 7)
>>> input_3d = np.array([input, input, input])
>>> input_4d = np.array([input_3d, input_3d])
>>> input_4d.shape
(2, 3, 6, 7)
>>> 

그런 다음 다음과 같이 im2col()으로 계산을 한다.

im2col(input_4d, 3, 3, 2, 1)

그러면 다음과 같은 결과가 나온다. shape는 (24, 27)가 나온다.

im2col(input_4d, 3, 3, 2, 1)

array([[ 0.,  0.,  0.,  0.,  1.,  2.,  0.,  8.,  9.,  0.,  0.,  0.,  0.,
         1.,  2.,  0.,  8.,  9.,  0.,  0.,  0.,  0.,  1.,  2.,  0.,  8.,
         9.],
       [ 0.,  0.,  0.,  2.,  3.,  4.,  9., 10., 11.,  0.,  0.,  0.,  2.,
         3.,  4.,  9., 10., 11.,  0.,  0.,  0.,  2.,  3.,  4.,  9., 10.,
        11.],
       [ 0.,  0.,  0.,  4.,  5.,  6., 11., 12., 13.,  0.,  0.,  0.,  4.,
         5.,  6., 11., 12., 13.,  0.,  0.,  0.,  4.,  5.,  6., 11., 12.,
        13.],
       [ 0.,  0.,  0.,  6.,  7.,  0., 13., 14.,  0.,  0.,  0.,  0.,  6.,
         7.,  0., 13., 14.,  0.,  0.,  0.,  0.,  6.,  7.,  0., 13., 14.,
         0.],
       [ 0.,  8.,  9.,  0., 15., 16.,  0., 22., 23.,  0.,  8.,  9.,  0.,
        15., 16.,  0., 22., 23.,  0.,  8.,  9.,  0., 15., 16.,  0., 22.,
        23.],
       [ 9., 10., 11., 16., 17., 18., 23., 24., 25.,  9., 10., 11., 16.,
        17., 18., 23., 24., 25.,  9., 10., 11., 16., 17., 18., 23., 24.,
        25.],
       [11., 12., 13., 18., 19., 20., 25., 26., 27., 11., 12., 13., 18.,
        19., 20., 25., 26., 27., 11., 12., 13., 18., 19., 20., 25., 26.,
        27.],
       [13., 14.,  0., 20., 21.,  0., 27., 28.,  0., 13., 14.,  0., 20.,
        21.,  0., 27., 28.,  0., 13., 14.,  0., 20., 21.,  0., 27., 28.,
         0.],
       [ 0., 22., 23.,  0., 29., 30.,  0., 36., 37.,  0., 22., 23.,  0.,
        29., 30.,  0., 36., 37.,  0., 22., 23.,  0., 29., 30.,  0., 36.,
        37.],
       [23., 24., 25., 30., 31., 32., 37., 38., 39., 23., 24., 25., 30.,
        31., 32., 37., 38., 39., 23., 24., 25., 30., 31., 32., 37., 38.,
        39.],
       [25., 26., 27., 32., 33., 34., 39., 40., 41., 25., 26., 27., 32.,
        33., 34., 39., 40., 41., 25., 26., 27., 32., 33., 34., 39., 40.,
        41.],
       [27., 28.,  0., 34., 35.,  0., 41., 42.,  0., 27., 28.,  0., 34.,
        35.,  0., 41., 42.,  0., 27., 28.,  0., 34., 35.,  0., 41., 42.,
         0.],
       [ 0.,  0.,  0.,  0.,  1.,  2.,  0.,  8.,  9.,  0.,  0.,  0.,  0.,
         1.,  2.,  0.,  8.,  9.,  0.,  0.,  0.,  0.,  1.,  2.,  0.,  8.,
         9.],
       [ 0.,  0.,  0.,  2.,  3.,  4.,  9., 10., 11.,  0.,  0.,  0.,  2.,
         3.,  4.,  9., 10., 11.,  0.,  0.,  0.,  2.,  3.,  4.,  9., 10.,
        11.],
       [ 0.,  0.,  0.,  4.,  5.,  6., 11., 12., 13.,  0.,  0.,  0.,  4.,
         5.,  6., 11., 12., 13.,  0.,  0.,  0.,  4.,  5.,  6., 11., 12.,
        13.],
       [ 0.,  0.,  0.,  6.,  7.,  0., 13., 14.,  0.,  0.,  0.,  0.,  6.,
         7.,  0., 13., 14.,  0.,  0.,  0.,  0.,  6.,  7.,  0., 13., 14.,
         0.],
       [ 0.,  8.,  9.,  0., 15., 16.,  0., 22., 23.,  0.,  8.,  9.,  0.,
        15., 16.,  0., 22., 23.,  0.,  8.,  9.,  0., 15., 16.,  0., 22.,
        23.],
       [ 9., 10., 11., 16., 17., 18., 23., 24., 25.,  9., 10., 11., 16.,
        17., 18., 23., 24., 25.,  9., 10., 11., 16., 17., 18., 23., 24.,
        25.],
       [11., 12., 13., 18., 19., 20., 25., 26., 27., 11., 12., 13., 18.,
        19., 20., 25., 26., 27., 11., 12., 13., 18., 19., 20., 25., 26.,
        27.],
       [13., 14.,  0., 20., 21.,  0., 27., 28.,  0., 13., 14.,  0., 20.,
        21.,  0., 27., 28.,  0., 13., 14.,  0., 20., 21.,  0., 27., 28.,
         0.],
       [ 0., 22., 23.,  0., 29., 30.,  0., 36., 37.,  0., 22., 23.,  0.,
        29., 30.,  0., 36., 37.,  0., 22., 23.,  0., 29., 30.,  0., 36.,
        37.],
       [23., 24., 25., 30., 31., 32., 37., 38., 39., 23., 24., 25., 30.,
        31., 32., 37., 38., 39., 23., 24., 25., 30., 31., 32., 37., 38.,
        39.],
       [25., 26., 27., 32., 33., 34., 39., 40., 41., 25., 26., 27., 32.,
        33., 34., 39., 40., 41., 25., 26., 27., 32., 33., 34., 39., 40.,
        41.],
       [27., 28.,  0., 34., 35.,  0., 41., 42.,  0., 27., 28.,  0., 34.,
        35.,  0., 41., 42.,  0., 27., 28.,  0., 34., 35.,  0., 41., 42.,
         0.]])

R에서 im2col() 작동 확인 방법 및 검증 자료 만들기

R에서 같은 모양을 만들기 위해서는 위와 같이 노가다로 2차원 array를 만들지 않고 바로 만들었다.

> temp <- c(t(array(c(1:42), dim=c(7,6))))
> input_4d <- array(c(temp, temp, temp, temp, temp, temp), dim = c(6,7,3,2))
> dim(input_4d)
[1] 6 7 3 2
> input_4d
, , 1, 1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    8    9   10   11   12   13   14
[3,]   15   16   17   18   19   20   21
[4,]   22   23   24   25   26   27   28
[5,]   29   30   31   32   33   34   35
[6,]   36   37   38   39   40   41   42

, , 2, 1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    8    9   10   11   12   13   14
[3,]   15   16   17   18   19   20   21
[4,]   22   23   24   25   26   27   28
[5,]   29   30   31   32   33   34   35
[6,]   36   37   38   39   40   41   42

, , 3, 1

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    8    9   10   11   12   13   14
[3,]   15   16   17   18   19   20   21
[4,]   22   23   24   25   26   27   28
[5,]   29   30   31   32   33   34   35
[6,]   36   37   38   39   40   41   42

, , 1, 2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    8    9   10   11   12   13   14
[3,]   15   16   17   18   19   20   21
[4,]   22   23   24   25   26   27   28
[5,]   29   30   31   32   33   34   35
[6,]   36   37   38   39   40   41   42

, , 2, 2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    8    9   10   11   12   13   14
[3,]   15   16   17   18   19   20   21
[4,]   22   23   24   25   26   27   28
[5,]   29   30   31   32   33   34   35
[6,]   36   37   38   39   40   41   42

, , 3, 2

     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    2    3    4    5    6    7
[2,]    8    9   10   11   12   13   14
[3,]   15   16   17   18   19   20   21
[4,]   22   23   24   25   26   27   28
[5,]   29   30   31   32   33   34   35
[6,]   36   37   38   39   40   41   42

R에서 검증하는 새로운 방법

파이썬에서 더미 자료를 만들어서 im2col()를 적용한 결괏값을 저장하는 법

test = np.arange(100 * 30 * 24 * 24).reshape(100, 30, 24, 24)
test.shape
test_im2col = im2col(test, 2, 2, 2, 0)
test_im2col.shape
np.savetxt("im2col_100_30_24_24.csv", test_im2col, delimiter=",")
test = np.arange(100 * 3 * 28 * 28).reshape(100, 3, 28, 28)
test.shape
test_im2col = im2col(test, 5, 5, 1, 0)
np.savetxt("im2col_100_3_28_28.csv", test_im2col, delimiter=",")

위에서 만든 결괏값을 R로 가져와 R에서 작성한 im2col()을 검증하기

더미 자료를 만들어서 im2col()를 적용한다.

test <- c(0:((100 * 30 * 24 * 24)-1))
test <- array(test ,c(24, 24, 30, 100))
test <- aperm(test, c(2, 1, 3, 4))
test_im2col <- im2col(test, 2, 2, 2, 0)

파이썬에서 저장한 결괏값을 가져오기

im2col_100_30_24_24 <- read.csv("im2col_100_30_24_24.csv", header=FALSE)
dim(im2col_100_30_24_24)

같은지 확인하기

all(im2col_100_30_24_24 == test_im2col)

위에서 만든 결괏값을 R로 가져와 R에서 작성한 col2im()을 검증하기

더미 자료를 만들어서 col2im()를 적용한다.

test <- c(0:((14400 * 120)-1))
test <- array(test ,c(120, 14400))
test <- t(test)
temp_col2im <- col2im(test, c(24, 24, 30, 100), 2, 2, 2, 0)

파이썬에서 저장한 결괏값을 가져온다. csv포멧으로는 2차원 이상 처리 하기 어렵기 때문에 첫번째 2차원만 입력했다.

col2im_14400_120_0_0_1_1 <- read.csv("col2im_14400_120_0_0_1_1.csv", header=FALSE)
> dim(col2im_14400_120_0_0_1_1)
[1] 24 24

같은지 확인하기

all(col2im_14400_120_0_0_1_1) == temp_col2im[ , , 1,1])