말랑코딩
7-4. 합성곱 계층 구현하기 본문
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 함수를 이용해도 되고 클래스로 만들어도 됨.
'딥러닝' 카테고리의 다른 글
docker 에서 yolox 데모 실행해보기(ubuntu 18.04) (0) | 2022.02.09 |
---|---|
7-5. 풀링 계층 구현하기 (0) | 2022.01.05 |
7-3. 풀링 계층(Pooling layer) (0) | 2022.01.05 |
7-2. 합성곱 계층(convolutional layer) (0) | 2022.01.05 |
7-1. 합성곱 신경망(convolution neural network) 훑어보기 (0) | 2022.01.04 |
Comments