무효 클릭 IP 추적 중...
머신러닝,딥러닝/파이썬, 넘파이 구현

[파이썬 구현] Average Pooling(파이썬 문법으로 구현하기)

꼬예 2021. 7. 21.

임의의 10개의 랜덤한 수를 생성하고  window size =3 을 기준으로 Average pooling 을 실시하는 코드를 구현해보도록 하겠습니다.

 

아래 그림은 윈도우 1칸씩 이동하는 그림을 순서대로 그려본것입니다.

1칸 이동할때 연산되는 숫자는 3개이며 이 3개의 숫자의 평균 구하는것이 Average Pooling 연산입니다.

 

연산을 하고 난 뒤에 새롭게 생긴 숫자의 배열 크기는 8이 됩니다. 

머리로 연상이 되시지 않으면 아래 공식을 외우셔도 좋습니다!

전체열(10) - window size(3) +1 = 8 

코드로 구현하며 자세히 알아보겠습니다.

import random
pool_size = 3
data = [random.randint(0,10) for _ in range(10)] # 10
data_len = len(data)
print("Input data:", data)
print("Length of data: {}\n".format(len(data)))
valid_len = data_len - (pool_size - 1)

output :

 

먼저 window size를 3 으로 하기 위해 pool_size 라는 변수에 3이라는 값을 담아줍니다.

그 후 연산을 할 10개의 랜덤한 값을 리스트에 담아줍니다. 

 

valid_len 은 전체 데이터 개수에서 pool_size 를 빼주고 1을 더해준 형태로, 연산이 끝나고 난 뒤의 최종 크기를 의미합니다.

 

for pool_loc in range(valid_len):
  window = list()
  for window_val_idx in range(pool_size):
    window.append(data[pool_loc + window_val_idx])

  window_sum = 0
  for val in window:
    window_sum+=val

  pooled.append(window_sum / pool_size)
print("Pooled data: ", pooled)
print("Length of pooled data: ", len(pooled))

valid_len, 즉 최종 배열의 크기를 나타내는 값이기 때문에 

그 수만큼 for loop을 돕니다. 

 

아래에는 다시 for loop을 돌게 되는데요. 이때는 윈도우 크기 , 3만큼을 다시 돌게 됩니다.  

 

연산과정을 글로 적어보자면,

첫번째 for loop 에서 0이 들어오게 되고 이 0값과  두번째 for loop 에서 나오는 0 1 2 가 순서대로 더해지게 됩니다.

이 말은 0 + 0 = 0 , 0 + 1 = 1 , 0 + 2 = 2  가 되게 되고 이 값을 우리가 최초 만들었던 data 의 인덱스로 사용합니다. 

 

즉 아래 상황을 의미하게 되는것이죠.

 

우선 연산을 편하게 하기 위해 인덱싱을 통해 얻은  각각의 값들을 리스트에 넣어주어야 합니다. 

우리 코드에서는 window 라는 리스트를 만들었습니다. 

 

그 후 리스트에 담긴 평균을 구하기 위해선 전체를 다 더한후 3으로 나눠줘야 겠지요?

크 코드가 바로 이어지는 코드가 되겠습니다. 

 

마지막으로

pooled.append(window_sum / pool_size)

는 앞서 구한 평균값들을 제일 위에 지정해놓은 pooled 라는 리스트에 넣어줍니다.

해당 평균값은 valid_len 만큼 for loop을 돌기 때문에  우리가 최초 정한 valid_len으 크기와 같겠죠?

 

output :

 

 

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글