Max pooling의 순전파, 역전파 구현

서기현·2024년 2월 26일

DeepLearning

목록 보기
1/6

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


역전파

  • 먼저, 입력 XX[x1,x2,x3,x4][x_1,x_2,x_3,x_4]의 형태를 가진다면, x3x_3 가 최댓값이라고 할 때, Max_Pooling(XX)의 값은 x3x_3가 된다.
    이때, Max_Pooling의 gradient를 구하면,
    dMaxPooling(X)dx=(x1,x2,x3,x4)×x3=(0,0,1,0){{dMax_Pooling(X)} \over {dx}} = ({\partial \over \partial x_1}, {\partial \over \partial x_2},{\partial \over \partial x_3},{\partial \over \partial x_4}) \times x_3 = (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

0개의 댓글