임의의 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 :
'머신러닝,딥러닝 > 파이썬, 넘파이 구현' 카테고리의 다른 글
[파이썬 구현] one-hot encoding 구현(with 파이썬 문법) (0) | 2021.07.06 |
---|---|
[넘파이 기초] 차원 추가/축소/ 변경 완벽 정리 (0) | 2021.05.12 |
댓글