Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

말랑코딩

7-4. 합성곱 계층 구현하기 본문

딥러닝

7-4. 합성곱 계층 구현하기

코랑이 2022. 1. 5. 15:48

im2col 함수를 사용해 합성곱 계층 구현하기

im2col을 사용한 연산 과정

위 그림에서, 입력데이터와 필터를 im2col 함수로 2차원으로 줄세움.

둘을 곱한 2차원 출력데이터를 reshape 함수를 이용해 3차원으로 다시 만들어줌.

 

  • im2col 함수 구현
    - 필터까지 적용하여 3차원 img를 2차원으로 바꿔주는 함수
    - stride, pad 옵션으로 지정 가능
def im2col(input_data, filter_h, filter_w, stride=1, pad=0): 
  N, C, H, W = input_data.shape 
  out_h = (H + 2 * pad - filter_h) // stride + 1 
  out_w = (W + 2 * pad - filter_w) // stride + 1 
  img = np.pad(input_data, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant', constant_values=0) 
  col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) 
  
  for y in range(filter_h): 
    y_max = y + stride * out_h  
    for x in range(filter_w): 
      x_max = x + stride * out_w 
      col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride] 

    col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N * out_h * out_w, -1) 
    return col

 

 

  • 입력데이터(1x3x7x7) * 필터(5x5) -> 출력데이터
    - 출력데이터는 3차원으로 reshape 이전 형태
    - 필터 5x5로 지정 시 입력데이터의 데이터수, 채널 수에 맞춰 자동으로 들어감.
import numpy as np

x1 = np.random.rand(1, 3, 7, 7) #데이터 수, 채널 수, 높이, 너비 
col1 = im2col(x1, 5, 5, stride = 1, pad = 0) #데이터 수, 필터 높이, 필터 너비, 스트라이드, 패딩) 
print(col1.shape)

x2 = np.random.rand(10, 3, 7, 7) #데이터 10개 
col2 = im2col(x2, 5, 5, stride = 1, pad = 0) 
print(col2.shape)

실행결과

 

 

  • 합성곱 계층 구현(im2col을 클래스로 만들어보기)
class Convolution:
  def __init__(self, W, b, stride =1, pad=0): 
    self.W = W 
    self.b = b 
    self.stride = stride 
    self.pad = pad 
    
  def forward(self, x): 
    FN, C, FH, FW = self.W.shape 
    N, C, H, W = x.shape 
    out_h = int(1+(H+2*self.pad-FH)/self.stride) 
    out_w = int(1+(W+2*self.pad-PW)/self.stride) 
    
    col = im2col(x, FH, FW, self.stride, self.pad) 
    col_W = self.W.reshape(FN, -1).T # 필터 전개 
    out = np.dot(col, col_W) + self.b 
    
    out = out.reshape(N, out_h, out_w, -1).transpose(0, 3, 1, 2) 
    
    return out

- 필터(가중치), 편향,스트라이드, 패딩을 인수로 받아 초기화

- 필터는 4차원(FN,C,FH,FW)

- 중요 코드 : im2col 함수 사용 후 필터 전개 및 연산(dot)하는 부분

 

 

 

 

요약

- 합성곱 계층에서는 입력데이터, 필터를 모두 2차원으로 만든 후 행렬곱해주어 출력데이터를 얻음.

- im2col 함수를 이용해도 되고 클래스로 만들어도 됨.

Comments