๋ฐ์ํ
์ด๋ฒ์๋ Neural Network, ์ ๊ฒฝ๋ง์ ๋ฐํ์ฌ ์์๋ณด๊ฒ ์ต๋๋ค.
- Neural Network(์ ๊ฒฝ๋ง)์ ์ธ๊ณต์ง๋ฅ, ๋จธ์ ๋ฌ๋์์ ์ฌ์ฉ๋๋ ์ปดํจํ ์์คํ ์ ๋ฐฉ๋ฒ์ค ํ๋์ ๋๋ค.
- ์ธ๊ฐ ๋๋ ๋๋ฌผ์ ๋์ ์๋ ์๋ฌผํ์ ์ ๊ฒฝ๋ง์์ ์๊ฐ์ ๋ฐ์ ์ค๊ณ๋์์ต๋๋ค.
- ์๋ฌผํ์ ๋ด๋ฐ์ด ์๋ก๊ฐ์ ์ ํธ๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์์ ๋ชจ๋ฐฉํฉ๋๋ค.
Perceptron (ํผ์ ํธ๋ก )๊ณผ Neural Network(์ ๊ฒฝ๋ง)
Perceptron(ํผ์ ํธ๋ก )๊ณผ Neural Network(์ ๊ฒฝ๋ง)์ ๊ณตํต์ ์ด ๋ง์ต๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ์ ์ ์ค์ ์ผ๋ก ๋ณด๋ฉด์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
- ์ ๊ฒธ๋ง๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๋์ต๋๋ค.
- ๋งจ ์ผ์ชฝ์ Input Layer(์ ๋ ฅ์ธต), ์ค๊ฐ์ธต์ Hidden layer(์๋์ธต), ์ค๋ฅธ์ชฝ์ Output Layer(์ถ๋ ฅ์ธต)์ด๋ผ๊ณ ํฉ๋๋ค.
- Hidden layer(์๋์ธต)์ Neuron(๋ด๋ฐ)์ ์ฌ๋ ๋์๋ ๋ณด์ด์ง ์์์ '์๋' ์ด๋ผ๋ ํํ์ ์๋๋ค.
- ์์ ๊ทธ๋ฆผ์๋ ์ ๋ ฅ์ธต -> ์ถ๋ ฅ์ธต ๋ฐฉํฅ์ผ๋ก 0~2์ธต์ด๋ผ๊ณ ํฉ๋๋ค. ์ด์ ๋ Python ๋ฐฐ์ด Index๋ 0๋ถํฐ ์์ํ๋ฉฐ, ๋์ค์ ๊ตฌํํ ๋ ์ง์ง๊ธฐ ํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ ์ ๊ฒธ๋ง์ 3๊ฐ์ Layer(์ธต)์ผ๋ก ๊ตฌ์ฑ๋์ง๋ง, Weight(๊ฐ์ค์น)๋ฅผ ๊ฐ์ง๋ Layer(์ธต)๋ 2๊ฐ์ฌ์ '2์ธต ์ ๊ฒฝ๋ง' ์ด๋ผ๊ณ ํฉ๋๋ค.
* ์ด ๊ธ์์๋ ์ค์ ๋ก Weight(๊ฐ์ค์น)๋ฅผ ๊ฐ์ง๋ Layer(์ธต)์ ๊ฐ์ [Input Layer(์ ๋ ฅ์ธต), Hidden layer(์๋์ธต), Output Layer(์ถ๋ ฅ์ธต)
- ์ด๋ ๊ฒ ์ ๊ฒฝ๋ง์ ๋ฐํ ์ค๋ช ์ ๋๋ด๊ณ , ํ๋ฒ ์ ๊ฒฝ๋ง์์ ์ ํธ๋ฅผ ์ด๋ป๊ฒ ๋ณด๋ด๋์ง ๋ณด๊ฒ ์ต๋๋ค.
Perceptron(ํผ์ ํธ๋ก ) ๋ณต์ต
Neural Network(์ ๊ฒธ๋ง)์ ์ ํธ ์ ๋ฌ ๋ฐฉ๋ฒ์ ๋ณด๊ธฐ ์ ์ ํ๋ฒ ๋ค์ Perceptron(ํผ์ ํธ๋ก )์ ๋ณด๊ฒ์ต๋๋ค.
- ์์ Perceptron(ํผ์ ํธ๋ก )์ x1, x2๋ผ๋ ๋ ์ ํธ๋ฅผ ์ ๋ ฅ๋ฐ์์ y๋ฅผ ์ถ๋ ฅํ๋ Perceptron(ํผ์ ํธ๋ก ) ์ ๋๋ค.
- ์์ํ ํ๋ฉด ์๋์ ์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ๊ธฐ์ b๋ bias(ํธํฅ)์ ๋ํ๋ด๋ parameter(๋งค๊ฐ๋ณ์)์ด๋ฉฐ, Neuron(๋ด๋ฐ)์ด ์ผ๋ง๋ ํ์ฑํ๋๋๋๋ฅผ ์ ์ดํ๋ ์ญํ ์ ํฉ๋๋ค.
- w1, w2๋ ๊ฐ ์ ํธ์ Weight(๊ฐ์ค์น)๋ฅผ ๋ํ๋ด๋ ๋งค๊ฐ๋ณ์๋ก, ๊ฐ ์ ํธ์ ์ํฅ๋ ฅ์ ์ ์ดํ๋ ์ญํ ์ ํฉ๋๋ค.
- ๋ง์ฝ์ ์ฌ๊ธฐ์ bias(ํธํฅ)์ ํ์ํ๋ค๋ฉด ์๋์ ๊ทธ๋ฆผ๊ณผ ๋ํ๋ผ ์ ์์ต๋๋ค.
- ์์ Perceptron(ํผ์ ํธ๋ก )์ Weight(๊ฐ์ค์น)๊ฐ b์ด๊ณ , ์ ๋ ฅ์ด 1์ธ Neuron(๋ด๋ฐ)์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ์ด Perceptron(ํผ์ ํธ๋ก )์ ๋์์ x1, x2, 1์ด๋ผ๋ 3๊ฐ์ ์ ํธ๊ฐ Neuron(๋ด๋ฐ)์ ์ ๋ ฅ๋์ด, ๊ฐ ์ ํธ์ Weight(๊ฐ์ค์น)๋ฅผ ๊ณฑํ ํ, ๋ค์ Neuron(๋ด๋ฐ)์ ์ ๋ฌ๋ฉ๋๋ค.
- ๋ค์ Neuron(๋ด๋ฐ)์์๋ ์ด ์ ํธ๋ค์ ๊ฐ์ ๋ํ์ฌ, ๊ทธ ํฉ์ด 0์ ๋์ผ๋ฉด 1์ ์ถ๋ ฅํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํฉ๋๋ค.
- ์ฐธ๊ณ ๋ก, bias(ํธํฅ)์ input ์ ํธ๋ ํญ์ 1์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆผ์์๋ ํด๋น Neuron(๋ด๋ฐ)์ ๋ค๋ฅธ ๋ด๋ฐ์ ์์ ๋ค๋ฅด๊ฒ ํ์ฌ์ ๊ตฌ๋ณํ์ต๋๋ค.
- ์์ Perceptron(ํผ์ ํธ๋ก )์ ์์ํ ํ๋ฉด ์๋์ ์๊ณผ ๊ฐ์ต๋๋ค.
- ์์ ์ผ์ชฝ์ ์์ ์กฐ๊ฑด ๋ถ๊ธฐ์ ๋์ - 0์ ๋์ผ๋ฉด 1์ ์ถ๋ ฅ, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํ๋๊ฒ์ ํ๋์ ํจ์๋ก ๋ํ๋ด์์ต๋๋ค.
- ์ค๋ฅธ์ชฝ์ ์์ ์ผ์ชฝ์ ์์์ ํ๋์ ํจ์ h(x)๋ผ๊ณ ํ๊ณ , ์ ๋ ฅ ์ ํธ์ ์ดํฉ์ด ํจ์๋ฅผ ๊ฑฐ์ณ ๋ฐํ๋ํ, ๊ทธ ๋ณํ๋ ๊ฐ์ด y์ ์ถ๋ ฅ์ด ๋จ์ ๋ณด์ฌ์ค๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ํจ์์ ์ ๋ ฅ์ด 0์ ๋์ผ๋ฉด 1์ ์ถ๋ ฅ, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ ์ถ๋ ฅํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ์์์ด ํ๋์ผ์ ๊ฐ์ต๋๋ค.
Perceptron(ํผ์ ํธ๋ก ) ์์์ Activation Function(ํ์ฑํ ํจ์) ์ฒ๋ฆฌ๊ณผ์
- ์ ์ h(x)๋ผ๋ ํจ์๋ฅผ ๋ณด์ จ์ต๋๋ค. ์ด์ฒ๋ผ ์ ๋ ฅ์ ํธ์ ์ดํฉ์ ์ถ๋ ฅ ์ ํธ๋ก ๋ณํํ๋ ํจ์๋ฅผ Activation Function(ํ์ฑํ ํจ์)๋ผ๊ณ ํฉ๋๋ค.
- 'ํ์ฑํ ํจ์' ๋ ์ ๋ ฅ์ ํธ์ ์ดํฉ์ด ํ์ฑํ๋ฅผ ์ผ์ผํค๋์ง๋ฅผ ์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
- ์์ ์์์ Weight(๊ฐ์ค์น)๊ฐ ๊ณฑํด์ง ์ ๋ ฅ ์ ํธ์ ์ดํฉ์ ๊ณ์ฐํ๊ณ , ๊ทธ ํฉ์ Activation Function(ํ์ฑํ ํจ์)์ ์ ๋ ฅํด ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ 2๋จ๊ณ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๊ทธ๋์ ์ด ์์ 2๋จ๊ณ์ ์์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
- ์์ ์์์ค์ ์ฒซ๋ฒ์งธ ์(์์ ์)์ Weight(๊ฐ์ค์น)๊ฐ ๋ฌ๋ฆฐ ์ ๋ ฅ ์ ํธ์ Bias(ํธํฅ)์ ์ดํฉ์ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ 'a' ๋ผ๊ณ ํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ์(์๋์ ์)์ Weight(๊ฐ์ค์น)๊ฐ ๋ฌ๋ฆฐ ์ ๋ ฅ ์ ํธ์ Bias(ํธํฅ)์ ์ดํฉ์ ๊ณ์ฐํ ๊ฒฐ๊ณผ์ธ 'a'๋ฅผ ํจ์ h()์ ๋ฃ์ด y๋ฅผ ์ถ๋ ฅํ๋ ํ๋ฆ์ ๋๋ค.
- Perceptron(ํผ์ ํธ๋ก )์์ Neuron(๋ด๋ฐ)์ ํฐ ์์ผ๋ก ๋ณด๋ฉด ์ค๋ฅธ์ชฝ์ ์(ํ์ฑํ ํจ์์ ์์)์ ํฐ Neuron(๋ด๋ฐ)์์์์ ํ์ฑํ ํจ์์ ์์์ ํฐ Neuron(๋ด๋ฐ)์์ ์ฒ๋ฆฌ๊ณผ์ ์ ์๊ฐํ ํ์ต๋๋ค.
- ์ฆ, Weight(๊ฐ์ค์น) ์ ํธ๋ฅผ ์กฐํฉํ ๊ฒฐ๊ณผ๊ฐ a๋ผ๋ Node(๋ ธ๋), Activation Function(ํ์ฑํ ํจ์) h()๋ฅผ ํต๊ณผํ์ฌ y๋ผ๋ Node(๋ ธ๋)๋ก ๋ณํ๋๋ ๊ณผ์ ์ด ๋ํ๋ ์์ต๋๋ค.
Activation Function(ํ์ฑํ ํจ์)
- Activation Function(ํ์ฑํ ํจ์)๋ ์๊ณ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ถ๋ ฅ์ด ๋ด๋๋๋ค, ์ด๋ฐ ํจ์๋ฅผ Step Function(๊ณ์ฐ ํจ์)๋ผ๊ณ ํฉ๋๋ค.
- ๊ทธ๋์ Perceptron(ํผ์ ํธ๋ก )์์ Activation Function(ํ์ฑํ ํจ์)๋ก Step Function(๊ณ์ฐ ํจ์)์ ์ด์ฉํ๋ค๊ณ ํฉ๋๋ค.
- ์ฆ, Activation Function(ํ์ฑํ ํจ์)์ผ๋ก ์ธ์ ์๋ ์ฌ๋ฌํจ์์ค Step Function(๊ณ์ฐ ํจ์)๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋๋ฐ, ๊ทธ๋ฌ๋ฉด Step Function(๊ณ์ฐ ํจ์)์์ธ์ ๋ค๋ฅธ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ํ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)
- Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)๋ ์ ๊ฒฝ๋ง์์ ์์ฃผ ์ด์ฉํ๋ Activation Function(ํ์ฑํ ํจ์) ์ ๋๋ค.
- exp(-x)๋ e์ -x์น์ ๋ปํ๋ฉฐ, e๋ ์์ฐ์์ 2.7182....์ ๊ฐ์ ๊ฐ์ง๋ ์ค์์ ๋๋ค.
- ์ ๊ฒฝ๋ง์์๋ Activation Function(ํ์ฑํ ํจ์)๋ก Sigmoid ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ ํธ๋ฅผ ๋ณํํ๊ณ , ๊ทธ ๋ณํ๋ ์ ํธ๋ฅผ ๋ค์ ๋ด๋ฐ์ ์ ๋ฌํฉ๋๋ค.
- ์์์ ๋ณธ Perceptron(ํผ์ ํธ๋ก ) & ์์์ ๋ณธ ์ ๊ฒฝ๋ง์ ์ฃผ๋ ์ฐจ์ด๋ ์ด Activation Function(ํ์ฑํ ํจ์) ๋ฟ์ ๋๋ค.
- ๊ทธ ์ธ์ Neuron(๋ด๋ฐ)์ด ์ฌ๋ฌ์ธต์ผ๋ก ์ด์ด์ง๋ ๊ตฌ์กฐ์ ์ ํธ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ํผ์ ํธ๋ก ๊ณผ ๊ฐ์ต๋๋ค.
Step Function(๊ณ๋จ ํจ์) ๊ตฌํํ๊ธฐ
- ์ด๋ฒ์๋ ํ๋ฒ Step Function(๊ณ์ฐ ํจ์)์ ํ๋ฒ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
- ์ ๋ ฅ์ด 0์ ๋์ผ๋ฉด 1์ ์ถ๋ ฅํ๊ณ , ๊ทธ ์ธ์๋ 0์ ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค.
def step_function(x):
if x > 0:
return 1
else:
return 0
- ์์ ์ฝ๋์์๋ ์ธ์ x๋ Float(์ค์)ํ๋ง ๋ฐ์๋ค์ ๋๋ค. ๊ทธ๋์ numpy ๋ฐฐ์ด์ ์ธ์๋ ๋ฃ์์๊ฐ ์์ต๋๋ค.
- step_function(np.array([1.0, 2.0]))๋ ์๋ฉ๋๋ค. ๋ง์ฝ์ numpy ๋ฐฐ์ด๋ ์ง์ํ๊ธฐ ์ํด์๋ ์๋์ ์ฝ๋์ฒ๋ผ ์์ ํ ์ ์์ต๋๋ค.
# numpy๋ก step_function ๊ตฌํ
def step_function(x):
y = x > 0
return y.astype(np.int)
- ์๋์ ์ฝ๋๋ x๋ผ๋ Numpy ๋ฐฐ์ด์ ๋ถ๋ฑํธ ์ฐ์ฐ์ ์ํํฉ๋๋ค.
>>> import numpy as np
>>> x = np.array([-1.0, 1.0, 2.0)] # Numpy ๋ฐฐ์ด
>>> x
array([-1., 1., 2.])
>>> y = x > 0 # ๋ถ๋ฑํธ ์ฐ์ฐ ์ํ
>>> y
array([False, True, True], dtype=bool) # data type = boolํ
- Numpy ๋ฐฐ์ด์ ๋ถ๋ฑํธ ์ฐ์ฐ์ ์ํํ๋ฉด array ๋ฐฐ์ด์ ์์ ๊ฐ๊ฐ์ ๋ถ๋ฑํธ ์ฐ์ฐ์ ์ํํ bool ๋ฐฐ์ด์ด ์์ฑ๋ฉ๋๋ค.
- ์ฌ๊ธฐ์ ๋ฐฐ์ด x์ ์์ ๊ฐ๊ฐ์ด 0๋ณด๋ค ํฌ๋ฉด True, 0์ดํ๋ฉด False๋ก ๋ณํํ ์๋ก์ด ๋ฐฐ์ด y๊ฐ ์์ฑ๋ฉ๋๋ค. ์ฌ๊ธฐ์ y๋ bool ๋ฐฐ์ด์ ๋๋ค.
- ๊ทผ๋ฐ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ Step Function(๊ณ๋จ ํจ์)๋ 0 or 1์ 'intํ'์ ์ถ๋ ฅํ๋ ํจ์์ด๋ฏ๋ก ๋ฐฐ์ด y์ ์์๋ฅผ bool -> intํ์ผ๋ก ๋ด๊ฟ์ค๋๋ค.
>>> y = y.astype(np.int)
>>> y
array([0, 1, 1])
- Numpy ๋ฐฐ์ด์ ์๋ฃํ์ ๋ณํํ ๋๋ astype() Method๋ฅผ ์ด์ฉํฉ๋๋ค. ์ํ๋ ์๋ฃํ์ ์ธ์๋ก ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
- ๋ํ Python์์ boolํ์ intํ์ผ๋ก ๋ณํํ๋ฉด True๋ 1๋ก, False๋ 0์ผ๋ก ๋ณํ๋ฉ๋๋ค.
Step Function(๊ณ๋จ ํจ์)์ ๊ทธ๋ํ
- ์์์ ์ ์ํ Step Function(๊ณ์ฐ ํจ์)๋ฅผ ๊ทธ๋ํ๋ก ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ง๋๋ฒ์ ๋ดค์๋ Matplotlib ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# coding: utf-8
import numpy as np
import matplotlib.pylab as plt
def step_function(x):
return np.array(x > 0, dtype=np.int64)
X = np.arange(-5.0, 5.0, 0.1)
Y = step_function(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1) # y์ถ์ ๋ฒ์ ์ง์
plt.show()
- np.arange(-5.0, 5.0, 0.1)์ -5.0 ~ 5.0๊น์ง 0.1๊ฐ๊ฒฉ์ Numpy ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค. ์ฆ, [-5.0, -4.9 ~ 4.9]๋ฅผ ์์ฑํฉ๋๋ค.
- Step_function()์ ์ธ์๋ก ๋ฐ์ Numpy ๋ฐฐ์ด์ ์์๋ฅผ ๊ฐ๊ฐ ์ธ์๋ก Step function(๊ณ์ฐ ํจ์)๋ฅผ ์คํํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ฐฐ์ด๋ก ๋ฐ๊ณ , ๊ทธํ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ฉด - plot ๊ฒฐ๊ณผ๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
- ์์ ๊ทธ๋ฆผ์์ ๋ณด๋ฉด Step Function - ๊ณ๋จ ํจ์๋ 0์ ๊ฒฝ๊ณ๋ก ์ถ๋ ฅ์ด 0์์ 1, ๋๋ 1์์ 0์ผ๋ก ๋ด๋๋๋ค.
- ์ด๋ ๊ฒ ๋ด๋๋ ํํ๊ฐ ๊ณ๋จ์ฒ๋ผ ๋ณด์ฌ์ Step Function ์ด๋ผ๊ณ ํฉ๋๋ค.
Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์) ๊ตฌํํ๊ธฐ
- ํ๋ฒ Sigmoid Function์ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค. ํ๋ฒ Python์ผ๋ก ์ฝ๋๋ฅผ ํ๋ฒ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
def sigmoid(x):
return 1 / (1 + np.exp(-x))
- ์ฌ๊ธฐ์ np.exp(-x)๋ exp(-x) ์์์ ํด๋นํฉ๋๋ค.
- ์ธ์๊ฐ x๊ฐ Numpy ๋ฐฐ์ด์ด์ฌ๋ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค๋ ๊ฒ๋ง ๊ธฐ์ตํด๋ก๋๋ค.
>>> x = np.array([-1.0, 1.0, 2.0])
>>> sigmoid(x)
array([0.26894142, 0.73105858, 0.88079708])
- ์ด ํจ์๊ฐ Numpy ๋ฐฐ์ด๋ ์ฒ๋ฆฌํ ์ ์๋ ์ด์ ๋ Numpy์ Broadcast ๊ธฐ๋ฅ์ ์์ต๋๋ค.
- ์์์ ์ค๋ช ํ์ง๋ง ํ๋ฒ ๋ค์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
BroadCast (๋ธ๋ก๋์บ์คํธ)
- Numpy์์๋ ํ์์ด ๋ค๋ฅธ ๋ฐฐ์ด๋ผ๋ฆฌ๋ ๊ณ์ฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด์ 2 * 2 ํ๋ ฌ A์ Scaler๊ฐ 10์ ๊ณฑํ์ต๋๋ค. ์ด๋ 10์ด๋ผ๋ Scaler๊ฐ์ด 2 * 2 ํ๋ ฌ๋ก ํ๋๋ ํ ์ฐ์ฐ์ด ์ด๋ค์ง๋๋ค.
- ์ด๋ฌํ ๊ธฐ๋ฅ์ Broadcast (๋ธ๋ก๋์บ์คํธ)๋ผ๊ณ ํฉ๋๋ค.
# Broadcast Example
>>> A = np.array([[1, 2], [3, 4]])
>>> B = np.array([[10, 20]])
>>> A * B
array([[10, 40],
[30, 80]])
- ์์ Broadcast์ ์์๋ฅผ ๋ณด๋ฉด, 1์ฐจ์ ๋ฐฐ์ด์ธ B๊ฐ 2์ฐจ์ ๋ฐฐ์ด์ธ A์ ๋๊ฐ์ ํ์์ผ๋ก ๋ณํ๋ ํ ์์๋ณ ์ฐ์ฐ์ด ์งํ๋ฉ๋๋ค.
Numpy์ ์์ ์ ๊ทผ
- ์์์ Index๋ 0๋ถํฐ ์์ํฉ๋๋ค. Index๋ก ์์์ ์ ๊ทผํ๋ ์์๋ ์๋์ ์ฝ๋์ ๊ฐ์ต๋๋ค.
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> print(X)
[[51 55]
[14 19]
[0 4]
>>> X[0] # 0ํ
array([51, 55])
>>> X[0][1] #(0, 1) ์์น์ ์์
55
- for๋ฌธ์ผ๋ก๋ ๊ฐ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
>>> for row in X:
... print(row)
...
[51 55]
[14 19]
[0 4]
- ์๋๋ฉด Index๋ฅผ array(๋ฐฐ์ด)๋ก ์ง์ ํด์ ํ๋ฒ์ ์ฌ๋ฌ ์์์ ์ ๊ทผํ ์๋ ์์ต๋๋ค.
- ์ด ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ง ์ป์ ์ ์์ต๋๋ค.
>>> X = X.flatten() #x๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํธ๋(ํํํ)
>>> print(X)
[51 55 14 19 0 4]
>>> X[np.array([0, 2, 4])] # ์ธ๋ฑ์ค๊ฐ 0, 2, 4๋ฒ์งธ์ ์๋ ์์ ์ป๊ธฐ
array([51, 14, 0])
- ์๋์ ์ฝ๋๋ ๋ฐฐ์ด์์ X์์ 15 ์ด์์ธ ๊ฐ๋ง ๊ตฌํ ์ ์์ต๋๋ค.
>>> X > 15
array([True, True, False, True, False, False], dtype=bool)
>>> X[X>15]
array([51, 55, 19])
- Numpy ๋ฐฐ์ด์ ๋ถ๋ฑํธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๊ฒฐ๊ณผ๋ bool ๋ฐฐ์ด์ ๋๋ค. (์ฌ๊ธฐ์๋ X>15)
- ์ฌ๊ธฐ์๋ ์ด bool ๋ฐฐ์ด์ ์ฌ์ฉํด ๋ฐฐ์ด X์์ True์ ํด๋นํ๋ ์์, ์ฆ ๊ฐ์ด 15๋ณด๋ค ํฐ ์์๋ง ๊บผ๋ด๊ณ ์์ต๋๋ค.
Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์) ๊ทธ๋ํ ๋ง๋ค์ด๋ณด๊ธฐ
- ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ ์ฝ๋๋ ์ ์ ์ ๊ณ๋จ ํจ์ ๊ทธ๋ฆฌ๊ธฐ ์ฝ๋์ ๊ฑฐ์ด ๊ฐ์ต๋๋ค.
- ๋ค๋ฅธ ๋ถ๋ถ์ y๋ฅผ ์ถ๋ ฅํ๋ ํจ์๋ฅผ sigmoid ํจ์๋ก ๋ณ๊ฒฝํ ๊ณณ์ ๋๋ค.
X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)
plt.show()
- ์ฌ๊ธฐ์ Step Function(๊ณ๋จ ํจ์), Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)์ ์ฐจ์ด๋ฅผ ์ ๊น ์ค๋ช ํด๋ณด์๋ฉด
- Step Function(๊ณ๋จ ํจ์)๋ 0, 1 ๋์ค ํ๋์ ๊ฐ๋ง ๋๋ ค์ฃผ๋ ๋ฐ๋ฉด, Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)๋ ์ค์๋ฅผ ๋๋ ค์ค๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค.
Summary: Perceptron(ํผ์ ์คํค)์์๋ Neuron(๋ด๋ฐ)์ฌ์ด์ 0 or 1์ด ํ๋ฅด๋ฉด, Neural Network(์ ๊ฒฝ๋ง)์์๋ ์ฐ์์ ์ธ ์ค์๊ฐ ํ๋ฆ ๋๋ค.
- ๊ณตํต์ ์ ๋ณด์๋ฉด, ๋๋ค ์ ๋ ฅ์ด ์์๋์ ์ถ๋ ฅ์ 0์ ๊ฐ๊น์์ง๊ณ (์๋๋ฉด 0), ์ ๋ ฅ์ด ์ปค์ง๋ฉด 1์ ๊ฐ๊น์์ง๋ (์๋๋ฉด 1)์ด ๋๋ ๊ตฌ์กฐ์ ๋๋ค.
- ์ฆ, Step Function(๊ณ๋จ ํจ์)๊ณผ Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)๋ ์ ๋ ฅ์ด ์ค์ํ๋ฉด ํฐ๊ฐ, ์ค์ํ์ง ์์ผ๋ฉด ์์๊ฐ์ ์ถ๋ ฅํ๋ฉฐ, ์๋ฌด๋ฆฌ ์ ๋ ฅ์ด ์๊ฑฐ๋ ์ปค๋, ์ถ๋ ฅ์ 0~1 ์ฌ์ด์ ๋๋ค.
Non-Linear Function(๋น์ ํ ํจ์)
- ๊ทธ๋ฆฌ๊ณ Step Function(๊ณ๋จ ํจ์)๊ณผ Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)์ ๊ณตํต์ ์ด ๋ ์์ต๋๋ค. ๋๋ค Non-Linear Function(๋น์ ํ ํจ์)๋ผ๋ ๊ฒ์ ๋๋ค.
- Non-Linear Function(๋น์ ํ ํจ์)๋ ๋ฌธ์ ๊ทธ๋๋ก '์ ํ์ด ์๋' ํจ์ ์ด๋ฉฐ, ์ง์ 1๊ฐ๋ก ๊ทธ๋ฆด์ ์๋ ํจ์์ ๋๋ค.
- ์ ๊ฒฝ๋ง์์๋ Activation Function(๋น์ ํ ํจ์)๋ก Non-Linear Function(๋น์ ํ ํจ์)๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์ด์ ๋ Linear Function(์ ํ ํจ์)๋ฅผ ์ด์ฉํ๋ฉด Neural Network(์ ๊ฒฝ๋ง)์ ์ธต์ ๊น๊ฒ ํ๋ ์๋ฏธ๊ฐ ์์ด์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
- ์ด์ ๋ Linear Function(์ ํ ํจ์)์ ๋ฌธ์ ๋ ์ธต์ ์๋ฌด๋ฆฌ ๊น๊ฒ ํด๋ 'Hidden Layer(์๋์ธต)์ด ์๋ ๋คํธ์ํฌ'๋ก๋ ๋๊ฐ์ ๊ธฐ๋ฅ์ ํ ์ ์๋ค๋๋ฐ ์์ต๋๋ค. ์์์ ํ๋ฒ ๋ณด๋ฉด ์ ํํจ์์ธ h(x) = cx๋ฅผ ํ์ฑํ ํจ์๋ก ์ฌ์ฉํ 3์ธต ๋คํธ์ํฌ๋ก ์์๋ฅผ ๋ค์ด๋ณด๋ฉด
y(x) = h(h(h(x))) -> y(x) = c * c * c * x ์ด๋ ๊ฒ ๊ณฑ์ ์ 3๋ฒ ์ํํ์ง๋ง y(x) = ax์ ๊ฐ์ต๋๋ค. a = c์ 3์น์ด๋ผ๊ณ ํ๋ฉด ๋.
- ์ด๋ ๊ฒ Hidden Layer(์๋์ธต์ด ์๋ ๋คํธ์ํฌ)๊ฐ ๋๊ธฐ ๋๋ฌธ์ ์ ํํจ์๋ฅผ ์ด์ฉํ๋ฉด ์ฌ๋ฌ Layer(์ธต)์ผ๋ก ๊ตฌ์ฑํ๋ ์ด์ ์ ์ด๋ฆด ์ ์์ต๋๋ค.
- ๊ทธ๋์ Layer(์ธต)๋ฅผ ์๊ณ ์ถ์ผ๋ฉด Activation Function(ํ์ฑํ ํจ์)์ Non-Linear Function(๋น์ ํ ํจ์)๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
ReLU Function(ReLU ํจ์)
- ์ง๊ธ๊น์ง Activation Function(ํ์ฑํ ํจ์)๋ก์ Step Function(๊ณ๋จ ํจ์)๊ณผ Sigmoid Function(์๊ทธ๋ชจ์ด๋ ํจ์)๋ฅผ ์๊ฐํ์ต๋๋ค.
- ๊ทผ๋ฐ, ์ต๊ทผ์๋ Rectified Linear Unit, ReLUํจ์๋ฅผ ์ฃผ๋ก ์ด์ฉํฉ๋๋ค.
- ReLUํจ์๋ ์ ๋ ฅ์ด 0์ ๋์ผ๋ฉด ๊ทธ ์ ๋ ฅ์ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ณ , 0์ดํ๋ฉด 0์ ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค.
- ์์์ผ๋ก๋ ์๋์ ์์ฒ๋ผ ์ธ ์ ์์ต๋๋ค.
# ReLUํจ์ ์๊ฐํ ์ฝ๋
import numpy as np
import matplotlib.pyplot as plt
def relu(x):
return np.maximum(0, x) # ์
๋ ฅ x์ 0 ์ค ๋ ํฐ ๊ฐ์ ๋ฐํํฉ๋๋ค.
X = np.arange(-5.0, 5.0, 0.1)
Y = ReLU(X)
plt.plot(X, Y)
plt.ylim(-1.0, 6.0) # y์ถ์ ๋ฒ์๋ฅผ ์กฐ์ ํฉ๋๋ค.
plt.show() # ๊ทธ๋ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- ์์ ์ฝ๋์์๋ Numpy์ Maximum ํจ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค. Maximum ํจ์๋ ๋ ์ ๋ ฅ ์ค ํฐ ๊ฐ์ ์ ํํด ๋ฐํํ๋ ํจ์์ ๋๋ค.
๋ค์ฐจ์ ๋ฐฐ์ด์ ๊ณ์ฐ
- Numpy์ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ ๊ณ์ฐ๋ฒ์ ์๋ฌํ๋ฉด ์ ๊ฒฝ๋ง์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋ค์ฐจ์ ๋ฐฐ์ด๋ ๊ธฐ๋ณธ์ '์ซ์์ ์งํฉ'์ ๋๋ค. ์ซ์๋ฅผ ํ์ค, ์ง์ฌ๊ฐํ, 3์ฐจ์์ผ๋ก ๋์ฌ๋์๊ฒ๋ค๋ ๋ค ๋ค์ฐจ์ ๋ฐฐ์ด์ด๋ผ๊ณ ํฉ๋๋ค.
- ํ๋ฒ 1์ฐจ์ ๋ฐฐ์ด์ ์์๋ก ํ๋ฒ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1์ฐจ์ ๋ฐฐ์ด Example Code (by Python)
>>> import numpy as np
>>> A = np.array([1, 2, 3, 4])
>>> print(A)
[1 2 3 4]
>>> np.ndim(A) # ๋ฐฐ์ด์ ์ฐจ์ ์ ํ์ธ
(4, )
>>> A.shape[0]
4
- ๋ฐฐ์ด์ ์ฐจ์์๋ np.ndim() ํจ์๋ก ํ์ธํ ์ ์์ต๋๋ค. ๋ ๋ฐฐ์ด์ ํ์์ Instance ๋ณ์์ธ shape์ผ๋ก ์ ์ ์์ต๋๋ค.
- ์์ ์์์์๋ A๋ 1์ฐจ์ ๋ฐฐ์ด์ด๊ณ ์์ 4๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๊ทผ๋ฐ, A.shape์ด ํํ์ ๋ฐํํ๋๊ฒ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ์ด์ ๋ 1์ฐจ์ ๋ฐฐ์ด์ด๋ผ๋ ๋ค์ฐจ์ ๋ฐฐ์ด์ผ๋์ ํต์ผ๋ ํํ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- 2์ฐจ์ ๋ฐฐ์ด์ผ๋์ (4, 3), 3์ฐจ์ ๋ฐฐ์ด์ผ ๋๋ (4, 3, 2)๊ฐ์ ํํ์ ๋ฐํํฉ๋๋ค.
2์ฐจ์ ๋ฐฐ์ด Example Code (by Python)
>>> B = np.array([[1,2], [3,4], [5,6]])
>>> print(B)
[[1 2]
[3 4]
[5 6]]
>>> np.ndim(B)
2
>>> B.shape
(3, 2)
- ์ด๋ฒ์๋ '3 X 2' ๋ฐฐ์ด์ธ B๋ฅผ ์์ฑํ์ต๋๋ค. 3 X 2 ๋ฐฐ์ด์ ์ฒ์ Dimension(์ฐจ์)์๋ ์์๊ฐ 3๊ฐ, ๋ค์ ์ฐจ์์๋ ์์๊ฐ 2๊ฐ ์์ต๋๋ค.
- ์ด๋ ์ฒ์ ์ฐจ์์ 0๋ฒ์งธ ์ฐจ์, ๋ค์ ์ฐจ์์ 1๋ฒ์งธ ์ฐจ์์ ๋์ํฉ๋๋ค. (Python index๋ 0๋ถํฐ ์์)
- 2์ฐจ์ ๋ฐฐ์ด์ ํนํ ํ๋ ฌ Matrix์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ฐฐ์ด์ ๊ฐ๋ก ๋ฐฉํฅ์ Row(ํ), ์ธ๋ก ๋ฐฉํฅ์ Column(์ด) ์ด๋ผ๊ณ ํฉ๋๋ค.
ํ๋ ฌ์ ๊ณฑ ๊ณ์ฐ
- ํ๋ ฌ์ ๊ณฑ์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ์ ์๋ ๊ธ์ ์ฌ๋ผ์ ์์ผ๋๊น ์ฐธ๊ณ ๋ถํ๋๋ฆฝ๋๋ค!
์ ๊ฒฝ๋ง์์์ ํ๋ ฌ ๊ณฑ
- Numpy ํ๋ ฌ์ ์จ์ ํ๋ ฌ์ ๊ณฑ์ผ๋ก ์ ๊ฒฝ๋ง์ ํ๋ฒ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค. ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ๋จํ ์ ๊ฒฝ๋ง์ ๊ตฌ์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
- ์ด ๊ตฌํ์์๋ X, W, Y์ ํ์์ ์ฃผ์ํด์ ๋ด์ผํฉ๋๋ค.
- ํนํ X, W์ ๋์ํ๋ ์ฐจ์์ ์์ ์๊ฐ ๊ฐ์์ผ ํ๋ค๋ ๊ฑธ ์์ง ๋ง์์ผ ํฉ๋๋ค.
>>> X = np.array([1, 2])
>>> X.shape
(2,)
>>> W = np.array([[1, 3, 5], [2, 4, 6]])
>>> print(W)
[[1 3 5]
[2 4 6]]
>>> W.shape
(2, 3)
>>> Y = np.dot(X, W)
>>> print(Y)
[5 11 17]
- ๋ค์ฐจ์ ๋ฐฐ์ด์ Scaler๊ณฑ์ ๊ณฑํด์ฃผ๋ np.dot ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์ฒ๋ผ ๋จ๋ฒ์ ๊ฒฐ๊ณผ Y๋ฅผ ๊ณ์ฐ ํ ์ ์์ต๋๋ค. Y์ ๊ฐ์๊ฐ 100๊ฐ๋ , 1000๊ฐ๋ ...
- ๋ง์ฝ์ np.dot์ ์ฌ์ฉํ์ง ์์ผ๋ฉด Y์ ์์๋ฅผ ํ๋์ฉ ๋ฐ์ ธ๋ด์ผ ํฉ๋๋ค. ์๋๋ฉด for๋ฌธ์ ์ฌ์ฉํด์ ๊ณ์ฐํด์ผ ํ๋๋ฐ ๊ท์ฐฎ์ต๋๋ค..
- ๊ทธ๋์ ํ๋ ฌ์ ๊ณฑ์ผ๋ก ํ๊บผ๋ฒ์ ๊ณ์ฐํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ฒฝ๋ง์ ๊ตฌํํ ๋ ๋งค์ฐ ์ค์ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
3-Layer Neural Network(3์ธต ์ ๊ฒฝ๋ง) ๊ตฌํํ๊ธฐ
- ์ด๋ฒ์๋ 3์ธต ์ ๊ฒฝ๋ง์์ ์ํ๋๋ ์ ๋ ฅ๋ถํฐ ์ถ๋ ฅ๊น์ง์ ์ฒ๋ฆฌ(์๋ฐฉํฅ ์ฒ๋ฆฌ)๋ฅผ ๊ตฌํํ๊ฒ ์ต๋๋ค.
- ๊ทธ๋ด๋ ค๋ฉด Numpy & ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ Numpy ๋ฐฐ์ด์ ์ ์ฐ๋ฉด ์ ์ ์ฝ๋๋ก ์ ๊ฒฝ๋ง์ ์๋ฐฉํฅ ์ฒ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ ๊ฒฝ๋ง์์์ ํ๊ธฐ๋ฒ
- Weight(๊ฐ์ค์น)์ Hidden Layer(์๋์ธต) Neuron์ ์ค๋ฅธ์ชฝ ์์๋ '(1)' ์ด ๋ถ์ด์์ต๋๋ค.
- ์ด๋ 1์ธต์ Weight(๊ฐ์ค์น), 1์ธต์ Neuron(๋ด๋ฐ)์ ์๋ฏธํ๋ ๋ฒํธ์ ๋๋ค.
- ๋ํ Weight(๊ฐ์ค์น)์ ์ค๋ฅธ์ชฝ ์๋์ ๋ ์ซ์๋ ๋ค์์ธต์ "Neuron(๋ด๋ฐ)-๋ค์์ธต ๋ฒํธ, ์์ธต Neuron(๋ด๋ฐ)์ Index ์ซ์-์์ธต ๋ฒํธ" ์ ๋๋ค.
๊ฐ Layer(์ธต)์ ์ ํธ ์ ๋ฌ ๊ตฌํํ๊ธฐ
Input Layer(์ ๋ ฅ์ธต) -> 1์ธต
- ์์ ๊ทธ๋ฆผ์๋ Bias(ํธํฅ)์ ์๋ฏธํ๋ Neuron(๋ด๋ฐ)์ธ 1์ด ์ถ๊ฐ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Bias(ํธํฅ)์ ์ค๋ฅธ์ชฝ ์๋ Index๊ฐ ํ๋๋ฐ์ ์ ๋ค๋๊ฒ์ ์ฃผ์ํ์ธ์. ์ด๋ ์ ์ธต์ ํธํฅ ๋ด๋ฐ(1)์ด ํ๋๋ฟ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด์ ์๊ณ ์๋ ์ฌ์ค๋ค์ ๋ฐ์ํ์ฌ ์์์ผ๋ก ๋ํ๋ด๊ณ , ๊ฐ์ํ ํด๋ณด๊ฒ ์ต๋๋ค.
- Weight(๊ฐ์ค์น)๋ถ๋ถ์ ๊ฐ์ํ ํ์๋, ํ๋ ฌ A, X, B, W๋ ๊ฐ๊ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ทธ๋ฌ๋ฉด ์ด์ Numpy์ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํด์ ์ฝ๋๋ก ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
# ์
๋ ฅ ์ ํธ, ๊ฐ์ค์น, ํธํฅ์ ์ ๋นํ ๊ฐ์ผ๋ก ์ค์
X = np.array([1.0, 0.5])
W1 = np.array([0.1, 0.3, 0.5], [0.2, 0.4, 0.6])
B1 = np.array([0.1, 0.2, 0.3])
print(W1.shape) # (2,3)
print(X.shape) # (2,)
print(B1.shape) # (3,)
A1 = np.dot(X, W1) + B1
- ์ด ๊ณ์ฐ์ W1์ 2 * 3 ํ๋ ฌ, X๋ ์์๊ฐ 2๊ฐ์ธ 1์ฐจ์ ๋ฐฐ์ด์ ๋๋ค. ์ฌ๊ธฐ์๋ W1๊ณผ X์ ๋์ํ๋ ์ฐจ์์ ์์ ์๊ฐ ์ผ์นํ๊ณ ์์ต๋๋ค.
- Hidden Layer์์์ Weight(๊ฐ์ค์น)์ ํฉ(๊ฐ์ค ์ ํธ + ํธํฅ)์ a๋ก ํ๊ธฐํ๊ณ Activation Function(ํ์ฑํ ํจ์) h()๋ก ๋ณํ๋ ์ ๋ก๋ฅผ z๋ก ํ๊ธฐํฉ๋๋ค.
- ์ฌ๊ธฐ์ Activation Function(ํ์ฑํ ํจ์)์ Sigmoid ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Input Layer(์ ๋ ฅ์ธต) -> 1์ธต Python Code Example
Z1 = sigmoid(A1)
print(A1) # [0.3, 0.7, 1.1]
print(Z1) # [0.57444252, 0.66818777, 0.75026011]
1์ธต (Hidden Layer) -> 2์ธต (Hidden Layer)
- ์ฌ๊ธฐ์๋ 1์ธต์ Hidden Layer์ ์ถ๋ ฅ Z1์ด 2์ธต์ Hidden Layer์ Input์ด ๋๋ค๋์ ๋ง ์ ์ธํ๋ฉด ์์์์ ๊ตฌํ๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๋ ๊ฒ Numpy ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฉด Layer(์ธต) ์ฌ์ด์ ์ ํธ ์ ๋ฌ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
1์ธต (Hidden Layer) -> 2์ธต (Hidden Layer) Python Code Example
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
B2 = np.array([0.1, 0.2])
print(Z1.shape) # (3,)
print(W2.shape) # (3,2)
print(B2.shape) # (2,)
A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
2์ธต (Hidden Layer) -> ์ถ๋ ฅ์ธต (Output Layer)
- ์ฌ๊ธฐ์ ํญ๋ฑ ํจ์ identify_function()์ ์ ์ํ๊ณ , ์ด๋ฅผ Output Layer(์ถ๋ ฅ์ธต)์ Activation Function(ํ์ฑํ ํจ์)๋ก ์ด์ฉํ์ต๋๋ค.
- ํญ๋ฑ ํจ์๋ Input(์ ๋ ฅ)์ ๊ทธ๋๋ก ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค. ์์ ์์์์๋ ๊ทธ๋๋ก identify_function()์ ๊ตณ์ด ์ ์ํ ํ์๋ ์์ง๋ง, ํ๋ฆ์ ํต์ผํ๊ธฐ ์ํด์ ์ด๋ ๊ฒ ๊ตฌํํ์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Output Layer(์ถ๋ ฅ์ธต)์ Activation Function(ํ์ฑํ ํจ์)๋ '์๊ทธ๋ง' σ()๋ก ํ์ํด์ Hidden Layer(์๋์ธต)์ Activation Function(ํ์ฑํ ํจ์) h()์๋ ๋ค๋ฆ์ ๋ช ์ํ์ต๋๋ค.
2์ธต (Hidden Layer) -> ์ถ๋ ฅ์ธต (Output Layer) Python Code Example
def identity_function(x):
return x
W3 = np.array([[0.1, 0.3], [0.2, 0.4]])
B3 = np.array([0.1, 0.2])
A3 = np.dot(Z2, W3) + B3
Y = identity_function(A3)
๊ตฌํ ์ ๋ฆฌ
- ์ด์ 3์ธต ์ ๊ฒฝ๋ง์ ๋ฐํ ์ค๋ช ์ ๋๋ด๊ณ , ์ง๊ธ๊น์ง ๊ตฌํํ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
- ์ ๊ฒฝ๋ง ๊ตฌํ์ ๊ด๋ก์ ๋ฐ๋ผ Weight(๊ฐ์ค์น) W1๋ง ๋๋ฌธ์๋ก ์ฐ๊ณ , ๊ทธ ์ธ Bias(ํธํฅ)๊ณผ ์ค๊ฐ ๊ฒฐ๊ณผ ๋ฑ์ ๋ชจ๋ ์๋ฌธ์๋ก ์ผ์ต๋๋ค.
def init_network():
network = {}
network['W1'] = np.array([0.1, 0.3, 0.5], [0.2, 0.4, 0.6])
network['b1'] = np.array([0.1, 0.2, 0.3])
network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
network['b2'] = np.array([0.1, 0.2])
network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])
network['b3'] = np.array([0.1, 0.2])
return network
def forward(network, x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(x, W2) + b2
z2 = sigmoid(a1)
a3 = np.dot(z2, W3) + b3
y = identity_function(a3)
return y
network = init_network()
x = np.array([1.0, 0.5])
y = forward(network, x)
print(y)
- ์ฌ๊ธฐ์ Init_network()์ forward()๋ผ๋ ํจ์๋ฅผ ์ ์ํ์์ต๋๋ค.
- Init_network() ํจ์๋ Weight(๊ฐ์ค์น)์ Bias(ํธํฅ)์ ์ด๊ธฐํ ํ๊ณ , ์ด๋ค์ Dictionary ๋ณ์์ธ network์ ์ ์ฅํฉ๋๋ค.
- ์ด Dictionary ๋ณ์ network๋ ๊ฐ Layer(์ธต)์ ํ์ํ ๋งค๊ฐ๋ณ์(Weight & Bias)๋ฅผ ๋ชจ๋ ์ ์ฅํฉ๋๋ค.
- forward() ํจ์๋ ์ ๋ ฅ ์ ํธ๋ฅผ ์ถ๋ ฅ์ผ๋ก ๋ณํํ๋ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ชจ๋ ๊ตฌํํฉ๋๋ค.
- ๋ํ ํจ์ ์ด๋ฆ์ forward() ๋ผ๊ณ ํ๊ฑด ์ ํธ๊ฐ ์๋ฐฉํฅ (์ ๋ ฅ->์ถ๋ ฅ)์ผ๋ก ์ ๋ฌ๋จ(์์ ํ)์์ ์๋ฆฌ๊ธฐ ์ํจ์ ๋๋ค.
Output Layer(์ถ๋ ฅ์ธต) ์ค๊ณํ๊ธฐ
Neural Network(์ ๊ฒฝ๋ง)์ Classification(๋ถ๋ฅ), Regression(ํ๊ท)์ ๋ชจ๋ ์ด์ฉํ ์ ์์ต๋๋ค.
- ๋ค๋ง, ๋ ์ค ์ด๋ค ๋ฌธ์ ๋์ ๋ฐ๋ผ์ Output Layer(์ถ๋ ฅ์ธต)์์ ์ฌ์ฉํ๋ Activation Function(ํ์ฑํ ํจ์)์ด ๋ฌ๋ผ์ง๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก Regression(ํ๊ท)์๋ ํญ๋ฑํจ์๋ฅผ, Classification(๋ถ๋ฅ)์๋ Softmax ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Identify(ํญ๋ฑ) ํจ์ & Softmax ํจ์ ๊ตฌํํ๊ธฐ
- Identify Function(ํญ๋ฑํจ์)์ ์ ๋ ฅ์ ๊ทธ๋๋ก ์ถ๋ ฅํฉ๋๋ค.
- ์ ๋ ฅ, ์ถ๋ ฅ์ด ํญ์ ๊ฐ๋ค๋ ๋ป์ ํญ๋ฑ์ ๋๋ค. ๊ทธ๋์ Output Layer(์ถ๋ ฅ์ธต)์์ Identify Function(ํญ๋ฑ ํจ์)๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ ฅ ์ ํธ๊ฐ ๊ทธ๋๋ก ์ถ๋ ฅ ์ ํธ๊ฐ ๋ฉ๋๋ค.
- ํญ๋ฑ ํจ์์ ์ฒ๋ฆฌ๋ ์ ๊ฒฝ๋ง ๊ทธ๋ฆผ์ผ๋ก ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ฉ๋๋ค. ๋ํ Identify Function(ํญ๋ฑ ํจ์)์ ์ํ ๋ณํ์ Hidden Layer(์๋์ธต)์์์ Activation Function(ํ์ฑํ ํจ์)์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ดํ๋ก ๊ทธ๋ฆฝ๋๋ค.
- Classification(๋ถ๋ฅ)์์ ์ฌ์ฉํ๋ Softmax Function(์ํํธ๋งฅ์ค ํจ์)์ ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฌ๊ธฐ์ exp(x)๋ e์ x์น์ ๋ปํ๋ Exponential Function(์ง์ ํจ์)์ ๋๋ค. (์ฌ๊ธฐ์ e๋ ์์ฐ์์ ์ ๋๋ค)
- n์ ์ถ๋ ฅ์ธต์ ๋ด๋ฐ ์, yk๋ ๊ทธ์ค k๋ฒ์งธ ์ถ๋ ฅ์์ ๋ปํฉ๋๋ค.
- Softmax ํจ์์ ๋ถ์๋ ์ ๋ ฅ ์ ํธ ak์ ์ง์ํจ์, ๋ถ๋ชจ๋ ๋ชจ๋ ์ ๋ ฅ ์ ํธ์ ์ง์ ํจ์์ ํฉ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- Softmax์ ์ถ๋ ฅ์ ๋ชจ๋ ์ ๋ ฅ ์ ํธ๋ก๋ถํฐ ํ์ดํ๋ฅผ ๋ฐ์ต๋๋ค. ์์ ์์์ ๋ถ๋ชจ์์ ๋ณด๋ฉด, ์ถ๋ ฅ์ธต์ ๊ฐ ๋ด๋ฐ์ด ๋ชจ๋ ์ ๋ ฅ ์ ํธ์์ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด, ํ๋ฒ Softmax ํจ์๋ฅผ ํ๋ฒ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
>>> a = np.array([0.3, 2.9, 4.0])
>>> exp_a = np.exp(a) # ์ง์ ํจ์
[ 1.34985881 18.17414537 54.59815003]
>>> sum_exp_a = np.sum(exp_a) # ์ง์ ํจ์์ ํฉ
>>> print(sum_exp_a_
74.1221152102
>>> y = exp_a / sum_exp_a
>>> print(y)
[ 0.01821127 0.24519181 0.73659691 ]
- ์ด๋ฒ์๋ ์ด ํ๋ฆ์ Python ํจ์๋ก ์ ์ํด๋ณด๊ฒ ์ต๋๋ค.
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
Softmax ํจ์ ๊ตฌํ์ ์ฃผ์์
- softmax() ํจ์๋ ์ปดํจํฐ๋ก ๊ณ์ฐํ ๋ ๊ฒฐํจ์ด ์์ต๋๋ค. Overflow ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- softmax() ํจ์๋ ์ง์ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ง์ ํจ์๋ ๊ฒ์ด ์์ฃผ ํฐ ๊ฐ์ ๋ฑ์ต๋๋ค. e์ 10์น์ 20,000์ด ๋๊ณ , e์ 100์น์ 0์ด 40๊ฐ๊ฐ ๋๋ ํฐ ๊ฐ์ด ๋๊ณ , ๋ง์ฝ e์ 1000์น์ด ๋๋ฉด ๋ฌดํ๋๋ฅผ ์๋ฏธํ๋ inf๊ฐ ๋ฉ๋๋ค.
- ์ด๋ฐ ํฐ ๊ฐ์ ๋๋์ ์ ํ๋ฉด ๊ฒฐ๊ณผ ์์น๊ฐ '๋ถ์์ ' ํด์ง๋๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ Softmax ํจ์๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
- C๋ผ๋ ์๋ฏธ์ ์ ์๋ฅผ ๋ถ์์ ๋ถ๋ชจ ์์ชฝ์ ๊ณฑํ์ต๋๋ค. ๊ทธ ๋ค์์ผ๋ก C๋ฅผ ์ง์ ํจ์ exp()์์ผ๋ก ์ฎ๊ฒจ์ logC๋ก ๋ง๋ญ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ logC๋ฅผ ์๋ก์ด ๊ธฐํธ C๋ก ๋ด๊ฟ๋๋ค.
- ์ฌ๊ธฐ์ ๋งํ๋ ๊ฒ์ Softmax์ ์ง์ ํจ์๋ฅผ ๊ณ์ฐํ ๋ ์ด๋ค ์ ์๋ฅผ ๋ํด๋ ๊ฒฐ๊ณผ๋ ๋ด๋์ง ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ฅ ์ ํธ์ค ์ต๋๊ฐ์ ์ด์ฉํ๋๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค.
>>> = np. array([ 1010, 1000, 990])
>>> np.exp(a) / np.sum(np.exp(a)) # softmax ํจ์์ ๊ณ์ฐ
array([ nan, nan, nan]) # ์ ๋๋ก ๊ณ์ฐ์ด ๋์ง ์๋๋ค.
>>>
>>> c = np.max(a) #c = 1010 (์ต๋๊ฐ)
>>> a - c
array([ 0, - 10, - 20 ])
>>>
>>> np.exp(a-c) / np.sum(np.exp(a-c))
array([ 9.99954600e - 01, 4.53978686e - 05, 2.06106005e - 09])
- ์ฌ๊ธฐ์ ๋ณด๋๊ฒ ์ฒ๋ผ ์๋ฌด๋ฐ ์กฐ์น ์์ด ๊ทธ๋ฅ ๊ณ์ฐํ๋ฉด nan์ด ์ถ๋ ฅ๋ฉ๋๋ค. (nan์ not a number์ ์ฝ์์ ๋๋ค.)
- ํ์ง๋ง ์ ๋ ฅ ์ ํธ์ค ์ต๋๊ฐ(์ด ์์์๋ c)๋ฅผ ๋นผ์ฃผ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐํ ์ ์์ต๋๋ค. ์ด ๋ด์ฉ์ ๊ธฐ๋ฐํด์ ๋ค์ ๊ตฌํํ๋ฉด ์๋์ ํจ์์ ๊ฐ์ต๋๋ค.
def softmax(a):
c = np.max(a)
exp_a = np.exp(a-c) # ์ค๋ฒํ๋ก ๋์ฑ
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
Softmax ํจ์์ ํน์ง
- softmax() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ฒธ๋ง์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ ์ ์์ต๋๋ค.
>>> a = np.array([0.3, 2.9, 4.0])
>>> y = softmax(a)
>>> print(y)
[0.01821127, 0.24519181, 0.73659691]
>>> np.sum(y)
1.0
- Softmax ํจ์์ ์ถ๋ ฅ์ 0 ~ 1.0 ์ฌ์ด์ ์ค์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ ์ถ๋ ฅ์ ์ดํฉ์ 1์ ๋๋ค.
- ์ถ๋ ฅ ์ดํฉ์ด 1์ด ๋๋ค๋๊ฑด Softmax ํจ์์ ์ค์ํ ์ฑ์ง์ด๋ฉฐ, ์ด ์ฑ์ง ๋๋ถ์ Softmax ํจ์์ ์ถ๋ ฅ์ 'ํ๋ฅ '๋ก ํด์ํ ์ ์์ต๋๋ค.
- ํ๋ฅ ๋ก ํด์ํ ์๋ ์๋๋ฐ y[0]์ ํ๋ฅ ์ 1.8%, y[1]์ ํ๋ฅ ์ 24.5%, y[2]์ ํ๋ฅ ์ 73.7%๋ก ํด์ํ ์ ์์ต๋๋ค.
- ์ฌ๊ธฐ์ 2๋ฒ์งธ ์์์ ํ๋ฅ ์ด ๊ฐ์ฅ ๋์ผ๋ ๋ต์ 2๋ฒ์งธ ํด๋์ค๋ผ๊ณ ํ ์ ์์ต๋๋ค.
- ์ฆ, Softmax ํจ์๋ฅผ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผ ํ๋ฅ (ํต๊ณ)์ ์ผ๋ก ๋์ํ ์ ์์ต๋๋ค.
Output Layer(์ถ๋ ฅ์ธต)์ Neuron(๋ด๋ฐ) ์ ์ ํ๊ธฐ
- Output Layer(์ถ๋ ฅ์ธต)์ Neuron(๋ด๋ฐ)์๋ ํ๋ ค๋ ๋ฌธ์ ์ ๋ง๊ฒ ์ ์ ํ ์ ํด์ผ ํฉ๋๋ค.
- ๋ณดํต ํด๋์ค์ ์์ ๋ง๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ์ ๋ ฅ์ด๋ฏธ์ง๋ฅผ ์ซ์ 0~9์ค ํ๋๋ก ๋ถ๋ฅํ๋ ๋ฌธ์ ๋ฉด Output Layer(์ถ๋ ฅ์ธต)์ ๋ด๋ฐ์ 10๊ฐ๋ก ์ค์ ํฉ๋๋ค.
- ์์์ ๋ถํฐ ์ถ๋ ฅ์ธต ๋ด๋ฐ์ ์ฐจ๋ก๋ก ์ซ์ 0~9 ๊น์ง ๋์ํ๋ฉฐ, ๋ด๋ฐ์ ํ์ ๋๋๊ฐ ํด๋น ๋ด๋ฐ์ ์ถ๋ ฅ ๊ฐ์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ฌ๊ธฐ์๋ ์์ด ๊ฐ์ฅ ๊น์ y2 ๋ด๋ฐ์ด ๊ฐ์ฅ ํฐ ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค. ๊ทธ๋์ ์ด ์ ๊ฒฝ๋ง์์๋ y2, ์ ๋ ฅ ์ด๋ฏธ์ง์ ์ซ์ '2'๋ก ํ๋จํ์ต๋๋ค.
Example - Mnist Dataset
์ง๊ธ๊น์ง ์์๋ณธ ์ ๊ฒฝ๋ง์ ๋ฐํ ์์๋ฅผ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฐ๋ก Mnist ๋ผ๊ณ ํ๋ ์๊ธ์จ ์ซ์ ๋ถ๋ฅ์ ๋๋ค.
- ์ฌ๊ธฐ์๋ ์ด๋ฏธ ํ์ต๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ต ๊ณผ์ ์ ์๋ต๋ผ๊ณ , ์ถ๋ก ๊ณผ์ ๋ง ๊ตฌํํฉ๋๋ค.
- ์ฌ๊ธฐ์ ์ด ์ถ๋ก ๊ณผ์ ์ ์ ๊ฒฝ๋ง์ Forward Propagation(์์ ํ)๋ผ๊ณ ํฉ๋๋ค.
- Mnist Datasdet์ 0~9 ๊น์ง์ ์ซ์ ์ด๋ฏธ์ง๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, Training Image๊ฐ 60,000์ฅ, Test Image๊ฐ 10,000์ฅ์ด ์์ต๋๋ค.
- ์ด ํ๋ จ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ํ์ตํ๊ณ , ํ์ตํ ๋ชจ๋ธ๋ก ์คํ ์ด๋ฏธ์ง๋ฅผ ์ผ๋ง๋ ์ ํํ๊ฒ ๋ถ๋ฅํ๋์ง๋ฅผ ํ๊ฐํฉ๋๋ค.
- Mnist์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ 28 * 28์ ํ์์กฐ ์ด๋ฏธ์ง (1์ฑ๋)์ด๋ฉฐ, ๊ฐ ํฝ์ ์ 0์์ 255๊น์ง์ ๊ฐ์ ์ทจํฉ๋๋ค.
- ๋ํ ๊ฐ ์ด๋ฏธ์ง์๋ 7, 2, 1, 3, 5์ ๊ฐ์ด ๊ทธ ์ด๋ฏธ์ง๊ฐ ์ ์ ์๋ฏธํ๋ ์ซ์๊ฐ label๋ก ๋ถ์ด ์์ต๋๋ค.
- load_minst ํจ์๋ ์ฝ์ MNIST ๋ฐ์ดํฐ๋ฅผ "(ํ๋ จ์ด๋ฏธ์ง, ํ๋ จ๋ ์ด๋ธ), (์คํ์ด๋ฏธ์ง, ์คํ๋ ์ด๋ธ)" ํ์์ผ๋ก ๋ฐํํฉ๋๋ค.
- ์ธ์๋ก๋ normalize, flatten, one_hot_label 3๊ฐ๊ฐ ์๋๋ฐ ์ธ์ธ์ ๋ชจ๋ bool๊ฐ์
๋๋ค.
- normalize๋ ์ด๋ฏธ์ง์ ํฝ์ ๊ฐ์ 0.0~1.0 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ ๊ทํ ํ ์ง๋ฅผ ์ ํฉ๋๋ค. False๋ฉด ์ ๋ ฅ ์ด๋ฏธ์ง์ ํฝ์ ๊ฐ์ 0~255์ฌ์ด์ ์๋๊ฐ์ ์ ์งํฉ๋๋ค.
- flatten์ ์ ๋ ฅ ์ด๋ฏธ์ง๋ฅผ 1์ฐจ์ ๋ฐฐ์ด๋ก ๋ง๋ค์ง๋ฅผ ์ ํ๋ฉฐ, False๋ก ํ๋ฉด 1 * 28 * 28, 3์ฐจ์ ๋ฐฐ์ด, True๋ก ํ๋ฉด 784๊ฐ์ ์์๋ก ์ด๋ฃจ์ด์ง 1์ฐจ์ ๋ฐฐ์ด๋ก ์ ์ฅํฉ๋๋ค. (28 * 28 = 784)
- one_hot_label์ label์ one_hot_encoding ํํ๋ก ์ ์ฅํ ์ง๋ฅผ ์ ํฉ๋๋ค.
- ์์๋ฅผ ๊ฐ๋จํ๊ฒ ๋ค์ด๋ณด๋ฉด [0,0,0,0,1,0,0] ์ด๋ฌ๋ฉด ์ ๋ต์ ๋ปํ๋ ์์๋ '1'์ด๊ณ ๋๋จธ์ง๋ '0'์ธ ๋ฐฐ์ด์ ๋๋ค.
- ๋ง์ฝ label์ด False๋ฉด '7', '2'๊ฐ์ด ์ซ์ ํํ์ label์ ์ ์ฅํ๊ณ , True์ด๋ฉด label์ one_hot_encodingํ์ฌ ์ ์ฅํฉ๋๋ค.
import sys
import os
import pickle
import numpy as np
sys.path.append(os.pardir) # ๋ถ๋ชจ ๋๋ ํฐ๋ฆฌ์ ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ์ค์
from dataset.mnist import load_mnist
from PIL import Image
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train), (x_test, t_test) = \
load_mnist(flatten=True, normalize=False)
img = x_train[0]
label = t_train[0]
print(label) # 5
print(img.shape) # (784,)
img = img.reshape(28, 28) # ์๋ ์ด๋ฏธ์ง์ ๋ชจ์์ผ๋ก ๋ณํ
print(img.shape) # (28, 28)
img_show(img)
- ์ด ์ฝ๋์์ ์์์ผํ๋๊ฑด flatten=True๋ก ์ค์ ํด ์ฝ์ด ๋ค์ธ ์ด๋ฏธ์ง๋ 1์ฐจ์ ๋ํ์ด ๋ฐฐ์ด๋ก ์ ์ฅ๋์ด ์์ต๋๋ค.
- ๊ทธ๋์ ์ด๋ฏธ์ง๋ฅผ ํ์ํ ๋๋ ์๋ ํ์์ธ 28 * 28 ํฌ๊ธฐ๋ก ๋ณํํด์ผ ํฉ๋๋ค. ์ด๋, reshape() Method์ ์ํ๋ ํ์์ ์ธ์๋ก ์ง์ ํ๋ฉด ๋ํ์ด ๋ฐฐ์ด์ ํ์์ ๋ด๊ฟ์ ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ Numpy๋ก ์ ์ฅ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ PIL์ฉ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ก ๋ณํํด์ผ ํ๋ฉฐ, ์ด๋ฏธ์ง ๋ณํ์ Image.fromarray() ํจ์๊ฐ ์ํํฉ๋๋ค.
์ ๊ฒฝ๋ง์ ์ถ๋ก ์ฒ๋ฆฌ
- ์ฌ๊ธฐ์ Input Layer Neuron(์ ๋ ฅ์ธต ๋ด๋ฐ)์ 784๊ฐ, Output Layer Neuron(์ถ๋ ฅ์ธต ๋ด๋ฐ)์ 10๊ฐ๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ์ ๋ ฅ์ธต ๋ด๋ฐ์ ๊ฐ์๊ฐ 784๊ฐ์ธ ์ด๋ด๋ ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ 28*28=784์ด๊ธฐ ๋๋ฌธ์ด๊ณ , ์ถ๋ ฅ์ธต ๋ด๋ฐ์ด 10๊ฐ์ธ ์ด์ ๋ 0์์ 9๊น์ง์ ์ซ์๋ฅผ ๊ตฌ๋ถํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
- Hidden Layer(์๋์ธต)์ 2๊ฐ๋ก, ์ฒซ๋ฒ์งธ๋ 50๊ฐ, ๋๋ฒ์งธ๋ 100๊ฐ์ ๋ด๋ฐ์ ๋ฐฐ์นํฉ๋๋ค.
def get_data():
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=True, one_hot_label=False)
return x_test, t_test
def init_network():
with open("sample_weight.pkl", 'rb') as f:
# ํ์ต๋ ๊ฐ์ค์น ๋งค๊ฐ๋ณ์๊ฐ ๋ด๊ธด ํ์ผ
# ํ์ต ์์ด ๋ฐ๋ก ์ถ๋ก ์ ์ํ
network = pickle.load(f)
return network
def predict(network, x):
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x, W1) + b1
z1 = sigmoid(a1)
a2 = np.dot(z1, W2) + b2
z2 = sigmoid(a2)
a3 = np.dot(z2, W3) + b3
y = softmax(a3)
return y
- init_network() ํจ์์์๋ pickle ํ์ผ์ธ sample_weight.pkl์ ์ ์ฅ๋ 'ํ์ต๋ ๊ฐ์ค์น ๋งค๊ฐ๋ณ์'ํ์ผ์ ์ฝ์ต๋๋ค.
- ์ด ํ์ผ ์์๋ Weight(๊ฐ์ค์น), Bias(ํธํฅ) ๋งค๊ฐ๋ณ์๊ฐ Dictionary ๋ณ์๋ก ์ ์ฅ๋์ด ์์ต๋๋ค.
x, t = get_data()
network = init_network()
accuracy_cnt = 0
for i in range(len(x)):
y = predict(network, x[i])
p = np.argmax(y) # ํ๋ฅ ์ด ๊ฐ์ฅ ๋์ ์์์ ์ธ๋ฑ์ค๋ฅผ ์ป๋๋ค.
if p == t[i]:
accuracy_cnt += 1
print("Accuracy:" + str(float(accuracy_cnt) / len(x))) # Accuracy: 0.9352
- ์์ ์ฝ๋๋ ์ ํ๋๋ฅผ ํ๋จํ๋ ์ฝ๋์ ๋๋ค.
- ๋ฐ๋ณต๋ฌธ์ ๋๋ฉด์ x์ ์ ์ฅ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ 1์ฅ์ฉ ๊บผ๋ด์ predict() ํจ์๋ก ๋ถ๋ฅํ๊ณ , ๊ฐ label์ ํ๋ฅ ์ numpy ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ np.argmax() ํจ์๋ก ์ด ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ(ํ๋ฅ ๊ฐ์ด ์ ์ผ ๋์) ์์์ index๋ฅผ ๊ตฌํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ ๊ฒฝ๋ง์ด predict(์์ธก)ํ ๋ต๋ณ๊ณผ ์ ๋ต label์ ๋น๊ตํ์ฌ ๋งํ ์ซ์(accuracy_cnt)๋ฅผ ์ธ๊ณ , ์ด๋ฅผ ์ ์ฒด ์ด๋ฏธ์ง ์ซ์๋ก ๋๋ ์ ํ๋๋ฅผ ๊ตฌํฉ๋๋ค.
๋ฐฐ์น ์ฒ๋ฆฌ
- ์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉฐ๋ ์์ 784๊ฐ๋ก ๊ตฌ์ฑ๋ 1์ฐจ์ ๋ฐฐ์ด (์๋๋ 28 * 28์ธ 2์ฐจ์ ๋ฐฐ์ด)์ด ์ ๋ ฅ๋์ด ๋ง์ง๋ง์๋ ์์๊ฐ 10๊ฐ์ธ 1์ฐจ์ ๋ฐฐ์ด์ด ์ถ๋ ฅ๋๋ ํ๋ฆ์ ๋๋ค. ์ด๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ 1์ฅ๋ง ์ ๋ ฅํ์ ๋์ ํ๋ฆ์ ๋๋ค.
- ๊ทธ๋ฌ๋ฉด ๋ง์ฝ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฌ๊ฐ๋ฅผ ํ๊บผ๋ฒ์ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ๋ ๊น์? ์ด๋ฏธ์ง 100๊ฐ๋ฅผ ๋ฌถ์ด์ predict() ํจ์์ ํ๋ฒ์ ๋๊น๋๋ค. x์ ํ์์ 100 * 784๋ก ๋ด๊ฟ์ 100์ฅ ๋ถ๋์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ก ํํํ๋ฉด ๋ฉ๋๋ค. ์๋์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ฉ๋๋ค.
- ์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ ๋ ฅ ๋ฐ์ดํฐ์ ํ์์ 100 * 784, ์ถ๋ ฅ ๋ฐ์ดํฐ์ ํ์์ 100 * 10 ์ ๋๋ค.
- ์ด๋ 100์ฅ ๋ถ๋ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๊ฒฐ๊ณผ๊ฐ ํ ๋ฒ์ ์ถ๋ ฅ๋จ์ ๋ํ๋ ๋๋ค. x[0], y[0]์ ์๋ 0๋ฒ์งธ ์ด๋ฏธ์ง์ ๊ทธ ์ถ๋ก ๊ฒฐ๊ณผ๊ฐ x[1]๊ณผ y[1]์๋ 1๋ฒ์งธ์ ์ด๋ฏธ์ง์ ๊ทธ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋๋ ์์ ๋๋ค.
- ์ด๋ ๊ฒ ํ๋๋ก ๋ฌถ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ Batch(๋ฐฐ์น)๋ผ๊ณ ํฉ๋๋ค.
x, t = get_data()
network = init_network()
batch_size = 100 # ๋ฐฐ์น ํฌ๊ธฐ
accuracy_cnt = 0
for i in range(0, len(x), batch_size):
x_batch = x[i:i+batch_size]
y_batch = predict(network, x_batch)
p = np.argmax(y_batch, axis=1)
accuracy_cnt += np.sum(p == t[i:i+batch_size])
print("Accuracy:" + str(float(accuracy_cnt) / len(x))) # Accuracy:0.9352
- ์์์ range() ํจ์๋ (start, end)์ฒ๋ผ ์ธ์๋ฅผ 2๊ฐ ์ง์ ํด์ ํธ์ถํ๋ฉด start์์ end-1 ๊น์ง์ ์ ์๋ฅผ ์ฐจ๋ก๋ก ๋ฐํํ๋ Iterator(๋ฐ๋ณต์)๋ฅผ ๋๋ ค์ค๋๋ค.
- ๋ range(start, end, step)์ฒ๋ผ ์ธ์๋ฅผ 3๊ฐ ์ง์ ํ๋ฉด start์์ end-1 ๊น์ง step ๊ฐ๊ฒฉ์ผ๋ก ์ฆ๊ฐํ๋ ์ ์๋ฅผ ๋ฐํํ๋ ๋ฐ๋ณต์๋ฅผ ๋๋ ค์ค๋๋ค.
- ์ด range() ํจ์๊ฐ ๋ฐ๋ณตํ๋ ๋ฐ๋ณต์๋ฅผ ๋ฐํ์ผ๋ก x[i:i+batch_size]์์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ต๋๋ค.
- x[i:i+batch_size]์ ์ ๋ ฅ ๋ฐ์ดํฐ์ i๋ฒ์งธ ๋ถํฐ i+batch_size๋ฒ์งธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
- ์ฌ๊ธฐ์๋ batch_size๊ฐ 100์ด๋ฏ๋ก x[0:100], x[100:200] ์ฒ๋ผ ์์์ ๋ถํฐ 100์ฅ์ฉ ๋ฌถ์ด ๊บผ๋ด๊ฒ ๋ฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ argmax()๋ ์ต๋๊ฐ์ index๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก '==' ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ Numpy ๋ฐฐ์ด๊ณผ ๋น๊ตํ์ฌ True, False๋ก ๊ตฌ์ฑ๋ Bool ๋ฐฐ์ด๋ก ๋ง๋ค๊ณ , ์ด ๊ฒฐ๊ณผ ๋ฐฐ์ด์์ True๊ฐ ๋ช๊ฐ์ธ์ง ์๋๋ค.
Summary
- ์ ๊ฒฝ๋ง์์ ํ์ฑํ ํจ์๋ก ์๊ทธ๋ชจ์ด๋ ํจ์, ReLU ํจ์ ๊ฐ์ด ๋งค๋๋ฝ๊ฒ ๋ณํํ๋ ํจ์๋ฅผ ์ด์ฉํ๋ค.
- Numpy์ ๋ค์ฐจ์ ๋ฐฐ์ด์ ์ ์ฌ์ฉํ๋ฉด ์ ๊ฒฝ๋ง์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
- Maching Learning ๋ฌธ์ ๋ ํฌ๊ฒ ํ๊ท์ ๋ถ๋ฅ๋ก ๋๋์ ์๋ค.
- ์ถ๋ ฅ์ธต์ ํ์ฑํ ํจ์ - ํ๊ท์์๋ ์ฃผ๋ก ํญ๋ฑ ํจ์, ๋ถ๋ฅ์์๋ Softmax ํจ์๋ฅผ ์ด์ฉํ๋ค.
- ๋ถ๋ฅ์์๋ ์ถ๋ ฅ์ธ ์ผ์ด ๋ด๋ฐ ์๋ฅผ ๋ถ๋ฅํ๋ ค๋ ํด๋์ค ์์ ๊ฐ๊ฒ ์ค์ ํ๋ค.
- ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๋ฌถ์ ๊ฒ์ ๋ฐฐ์น๋ผ๊ณ ํ๋ฉฐ, ์ถ๋ก ์ฒ๋ฆฌ๋ฅผ ์ด ๋ฐฐ์น ๋จ์๋ก ์งํํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํจ์ฌ ๋น ๋ฅด๊ฒ ์ป์ ์ ์๋ค.
๋ฐ์ํ
'๐ฅ๏ธ Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DL] Gradient (๊ธฐ์ธ๊ธฐ), Training Algorithm(ํ์ต ์๊ณ ๋ฆฌ์ฆ) (0) | 2024.03.23 |
---|---|
[DL] Neural Network Training (์ ๊ฒฝ๋ง ํ์ต) (0) | 2024.03.21 |
[DL] Perceptron (ํผ์ ํธ๋ก ) (0) | 2024.03.12 |
[DL] Matplotlib ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐํ์ฌ ์์๋ณด๊ธฐ (0) | 2024.03.05 |
[DL] Gradient Vanishing, Exploding - ๊ธฐ์ธ๊ธฐ ์์ค, ํญํ (0) | 2024.01.26 |