-
Notifications
You must be signed in to change notification settings - Fork 1
im2col()과 col2im() 작동 검증 방법
Choo sun sick edited this page Jul 30, 2020
·
11 revisions
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에서 같은 모양을 만들기 위해서는 위와 같이 노가다로 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
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=",")
더미 자료를 만들어서 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)
더미 자료를 만들어서 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])