Max pooling
- 현재 view에서 최대의 값을 반환
- 탐지된 특징을 유지함.
im2col
- max pooling 연산은 필터 내의 최대 크기 1개를 선택하여 반환하는 것이기 때문에, im2col 연산을 이용할 수 있음.
def im2col(input, stride, padding, filter, output):
cnt = 0
input = np.pad(input, ((padding,padding),(padding,padding))
for h in range(output):
for w in range(output):
kernel = input[stride*h : stride*h+filter, stride*w:stride*w+filter]
out = np.reshape(kernel, (1, -1))
if cnt == 0:
outs = out.copy()
else:
outs = np.concatenate((outs, out), axis=0)
count += 1
return np.transpose(outs, (1,0))
순전파
- Pooling 연산 시에는 일반적으로 패딩을 하지 않음. (padding=0)
def Max_Pooling(inputs, stride, filter, output):
cnt = 0
for input in inputs:
im2col_input = im2col(input, stride, 0, filter, output)
max_pooling = np.max(im2col_input, axis=0, keepdims=True)
max_pooling = np.reshape(max_pooling, (output, output))
out = max_pooling[np.newaxis, :, :]
if cnt == 0:
outs = out.copy()
else:
outs = np.concatenate((outs, out))
cnt += 1
return outs
역전파
- 먼저, 입력 X가 [x1,x2,x3,x4]의 형태를 가진다면, x3 가 최댓값이라고 할 때, Max_Pooling(X)의 값은 x3가 된다.
이때, Max_Pooling의 gradient를 구하면,
dxdMaxPooling(X)=(∂x1∂,∂x2∂,∂x3∂,∂x4∂)×x3=(0,0,1,0)
이 된다.
- 즉, Max Pooling의 역전파는, 입력 이미지의 최댓값에선 1, 그외 나머지는 0이 전파되며 이루어진다.
- Pooling 전의 입력 이미지와 풀링 후의 값을 커널 간 비교하며, 일치하면 1, 그렇지 않으면 0을 반환하는 식으로 코드를 구현했다.
def backward_Max_Pooling(inputs, origins, stride, padding, filter, output, origin_size):
cnt = 0
for input, origin in zip(inputs, origins):
input = np.reshape(input, (1, -1))
repeat = np.tile(input, reps=[filter*filter,1])
origin_im2col = im2col(origin, stride, 0, filter, ouput)
grad_max_pooling = np.where(input==origin_im2col, 1, 0)
grad_max_pooling_col2im = col2im(grad_max_pooling, stride, padding, filter, output, origin_size)
out = grad_max_pooling_col2im(np.newaxis, :, :]
if cnt == 0:
outs = out.copy()
else:
outs = np.concatenate((outs,out))
return outs