๐์ด ํฌ์คํธ๋ Pooling Layer ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Pooling Layer๋ Convolution Layer์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ๋ Feature map์ ์ฌ์ด์ฆ๋ฅผ ๊ฐ์์ํค๋ฉด๋ฉด์๋ ํน์ง์ ๋ณด์กดํ๊ธฐ ์ํ ๊ณผ์ ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก Convolution Layer์ ํฉ์ฑ๊ณฑ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ก ๋์จ Feature map์ non-linearity ์ฑ์ง์ ์ฃผ๊ธฐ ์ํด ํ์ฑํ ํจ์ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
๊ทธ ๋ค์ Pooling Layer๊ฐ ์ฐ์ฐ๋ฉ๋๋ค.
def max_pooling(input, pooling_size):
# ์
๋ ฅ ๋ฐ์ดํฐ์ ํ๋ง ์์ญ ํฌ๊ธฐ
input_height, input_width = input.shape
pool_height, pool_width = pooling_size
# ํ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ฐฐ์ด ์์ฑ
out_height, out_width = input_height // pool_height, input_width // pool_width
output = np.zeros((out_height, out_width))
# Max pooling ์ํ
for i in range(out_height):
for j in range(out_width):
# ํ๋ง ์์ญ์์ ์ต๋๊ฐ ์ฐพ๊ธฐ
local = input[i*pool_height:(i+1)*pool_height, j*pool_width:(j+1)*pool_width]
output[i, j] = np.max(local)
return output
์ ์ฝ๋๋ Max Pooling์ low-level ์์ ๊ตฌํํ ์ฝ๋์
๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ input ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ Max Pooling ์ฌ์ด์ฆ๋ฅผ ๊ฒฐ์ ํด์ค๋๋ค.
columns, rows = 8, 8
pooling_filter = (2, 2)
input_array = np.zeros(64).reshape(columns, rows)
for i in range(columns):
for j in range(rows):
input_array[i][j] = np.random.randint(1, 100)
print(input_array)
๐ป ๊ฒฐ๊ณผ :
[[47. 95. 30. 66. 32. 16. 71. 54.]
[70. 28. 25. 66. 34. 81. 86. 50.]
[25. 71. 55. 38. 76. 18. 27. 55.]
[51. 11. 84. 73. 11. 71. 46. 20.]
[27. 56. 3. 28. 59. 68. 72. 60.]
[85. 47. 53. 92. 59. 89. 41. 54.]
[42. 2. 90. 81. 8. 7. 73. 91.]
[91. 48. 35. 6. 81. 78. 24. 4.]]
ํจ์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ณ์๋ก ์ ๋ ฅ
output_array = max_pooling(input_array, pooling_filter)
๐ป ๊ฒฐ๊ณผ :
[[95. 66. 81. 86.]
[71. 84. 76. 55.]
[85. 92. 89. 72.]
[91. 90. 81. 91.]]
๊ฐ ํ๋ง ํํฐ๊ฐ ์ํํ๋ฉด์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ถ์ถํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
def average_pooling(input, pooling_size):
# ์
๋ ฅ ๋ฐ์ดํฐ์ ํ๋ง ์์ญ ํฌ๊ธฐ
input_height, input_width = input.shape
pool_height, pool_width = pooling_size
# ํ๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ด์ ๋ฐฐ์ด ์์ฑ
out_height, out_width = input_height // pool_height, input_width // pool_width
output = np.zeros((out_height, out_width))
# Average pooling ์ํ
for i in range(out_height):
for j in range(out_width):
# ํ๋ง ์์ญ์์ ์ต๋๊ฐ ์ฐพ๊ธฐ
local = input[i*pool_height:(i+1)*pool_height, j*pool_width:(j+1)*pool_width]
output[i, j] = np.mean(local)
return output
์ ์ฝ๋๋ Average Pooling์ low-level ์์ ๊ตฌํํ ์ฝ๋์
๋๋ค.
input์ Pooling ์ฌ์ด์ฆ๋ Max Pooling ๋ ์ผ๋ ๋ณ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
output_array = average_pooling(input_array, pooling_filter)
print(output_array)
๐ป ๊ฒฐ๊ณผ :
[[60. 46.75 40.75 65.25]
[39.5 62.5 44. 37. ]
[53.75 44. 68.75 56.75]
[45.75 53. 43.5 48. ]]
๊ฐ ํ๋ง ํํฐ๊ฐ ์ํํ๋ฉด์ ํํฐ ๋ด์ ๋ชจ๋ ์ธ๋ฑ์ค์ ๊ฐ์ ํ๊ท ์ ๊ณ์ฐํด ์ถ์ถํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค. ์์ฃผ ์ฌ๊ฒ์ :)