TIL_220516_๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ ๊ธฐ์ด
- -
๋ฅ ๋ฌ๋์ด๋?
๋ฅ ๋ฌ๋ :
- ๋จธ์ ๋ฌ๋์ ํ ๋ถ์ผ
- ์ธต(Layer)์ ๊น๊ฒ(Deep) ์๋๋ค๊ณ ํด์ ๋ฅ๋ฌ๋
- ๋ฅ๋ฌ๋์ ๋ค๋ฅธ ๋จ์ด ํํ
- ๋ฅ๋ฌ๋(Deep learning)
- Deep neural networks
- Multilayer Perceptron(MLP)
- ๋ฅ๋ฌ๋์ ์ฃผ์ ๊ฐ๋
๊ณผ ๊ธฐ๋ฒ
- ๋ฐฐ์น ์ฌ์ด์ฆ์ ์ํญ
- ํ์ฑํ ํจ์
- ๊ณผ์ ํฉ๊ณผ ๊ณผ์์ ํฉ
- ๋ฐ์ดํฐ ์ฆ๊ฐ
- ๋๋์์
- ์์๋ธ
- ํ์ต๋ฅ ์กฐ์

๋ฅ๋ฌ๋์ ์ญ์ฌ
XOR ๋ฌธ์ :
๊ธฐ์กด์ ๋จธ์ ๋ฌ๋์ AND, OR ๋ฌธ์ ๋ก๋ถํฐ ์์

Perceptron(ํผ์ ํธ๋ก ) :


ํ์ง๋ง ํ์ต ์ํค๊ธฐ์๋ XOR๋ฌธ์ ๋ฅผ ํ์ง ๋ชปํ๋ค.
Multilayer Perceptrons (MLP)๋ผ๋ ๊ฐ๋ ์ ํตํด ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ ค๊ณ ํ์ผ๋ ์คํจ.

Backpropagation (์ญ์ ํ) :
1974๋ ์ ๋ฐํ๋ Paul Werbos(ํด)์ด๋ผ๋ ์ฌ๋์ ๋ฐ์ฌ ๋ ผ๋ฌธ์ ์์

- ์ฐ๋ฆฌ๋ W(weight)์ b(bias)๋ฅผ ์ด์ฉํด์ ์ฃผ์ด์ง ์ ๋ ฅ์ ๊ฐ์ง๊ณ ์ถ๋ ฅ์ ๋ง๋ค์ด ๋ผ ์ ์๋ค.
- ๊ทธ๋ฐ๋ฐ MLP๊ฐ ๋ง๋ค์ด๋ธ ์ถ๋ ฅ์ด ์ ๋ต๊ฐ๊ณผ ๋ค๋ฅผ ๊ฒฝ์ฐ W์ b๋ฅผ ์กฐ์ ํด์ผํ๋ค.
- ๊ทธ๊ฒ์ ์กฐ์ ํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ถ๋ ฅ์์ Error(์ค์ฐจ)๋ฅผ ๋ฐ๊ฒฌํ์ฌ ๋ค์์ ์์ผ๋ก ์ ์ฐจ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
' 1986๋ ์ Hinton ๊ต์๊ฐ ๋๊ฐ์ ๋ฐฉ๋ฒ์ ๋ ์์ ์ผ๋ก ๋ฐํ : ํต์ฌ๋ฐฉ๋ฒ์ ๋ฐ๋ก ์ญ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๊ฒฌ '

Deep Neural Networks ๊ตฌ์ฑ ๋ฐฉ๋ฒ
Layer(์ธต) ์๊ธฐ :
- Input layer(์ ๋ ฅ์ธต): ๋คํธ์ํฌ์ ์ ๋ ฅ ๋ถ๋ถ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ์ต์ํค๊ณ ์ถ์ x ๊ฐ์ ๋๋ค.
- Output layer(์ถ๋ ฅ์ธต): ๋คํธ์ํฌ์ ์ถ๋ ฅ ๋ถ๋ถ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ธกํ ๊ฐ, ์ฆ y ๊ฐ์ ๋๋ค.
- Hidden layers(์๋์ธต): ์ ๋ ฅ์ธต๊ณผ ์ถ๋ ฅ์ธต์ ์ ์ธํ ์ค๊ฐ์ธต์ ๋๋ค.
- ํ์ด์ผํ ๋ฌธ์ ์ ๋ฐ๋ฅธ ์ ๋ ฅ์ธต๊ณผ ์ถ๋ ฅ์ธต์ ๋ชจ์์ด ์ ํด์ง.
- ๋ํ์ ์ผ๋ก ์ ๊ฒฝ์จ์ผํ ์ธต์ ์๋์ธต : ์์ ์ฐ๊ฒฐ ๊ณ์ธต (Fully connected layer = Dense layer)

๊ธฐ๋ณธ์ ์ธ ๋ด๋ด ๋คํธ์ํฌ(Deep neural networks) ๊ตฌ์ฑ :
- ์ ๋ ฅ์ธต์ ๋ ธ๋ ๊ฐ์ 4๊ฐ
- ์ฒซ ๋ฒ์งธ ์๋์ธต ๋ ธ๋ ๊ฐ์ 8๊ฐ
- ๋ ๋ฒ์งธ ์๋์ธต ๋ ธ๋ ๊ฐ์ 16๊ฐ
- ์ธ ๋ฒ์งธ ์๋์ธต ๋ ธ๋๊ฐ์ 8๊ฐ
- ์ถ๋ ฅ์ธต ๋ ธ๋๊ฐ์ 3๊ฐ
- ํ์ฑํ ํจ์(activation function)๋ฅผ ๋ณดํธ์ ์ธ ๊ฒฝ์ฐ ๋ชจ๋ ์๋์ธต ๋ฐ๋ก ๋ค์ ์์น

๋คํธ์ํฌ์ Width(๋๋น)์ Depth(๊น์ด) ๊ฐ๋
Baseline model(๋ฒ ์ด์ค๋ผ์ธ ๋ชจ๋ธ) : ์ ๋นํ ์ ํ๋์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ
- ์ ๋ ฅ์ธต: 4
- ์ฒซ ๋ฒ์งธ ์๋์ธต: 8
- ๋ ๋ฒ์งธ ์๋์ธต: 4
- ์ถ๋ ฅ์ธต: 1
๊ธฐ๋ณธ์ ์ธ ์คํ(ํ๋)์ ์์
1) ๋คํธ์ํฌ์ ๋๋น๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ
- ์ ๋ ฅ์ธต: 4
- ์ฒซ ๋ฒ์งธ ์๋์ธต: 8 * 2 = 16
- ๋ ๋ฒ์งธ ์๋์ธต: 4 * 2 = 8
- ์ถ๋ ฅ์ธต: 1
2) ๋คํธ์ํฌ์ ๊น์ด๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ
- ์ ๋ ฅ์ธต: 4
- ์ฒซ ๋ฒ์งธ ์๋์ธต: 4
- ๋ ๋ฒ์งธ ์๋์ธต: 8
- ์ธ ๋ฒ์งธ ์๋์ธต: 8
- ๋ค ๋ฒ์งธ ์๋์ธต: 4
- ์ถ๋ ฅ์ธต: 1
3) ๋๋น์ ๊น์ด๋ฅผ ์ ๋ถ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ
- ์ ๋ ฅ์ธต: 4
- ์ฒซ ๋ฒ์งธ ์๋์ธต: 8
- ๋ ๋ฒ์งธ ์๋์ธต: 16
- ์ธ ๋ฒ์งธ ์๋์ธต: 16
- ๋ค ๋ฒ์งธ ์๋์ธต: 8
- ์ถ๋ ฅ์ธต: 1
์ค๋ฌด์์๋ ๋คํธ์ํฌ์ ๋๋น์ ๊น์ด๋ฅผ ๋ฐ๊พธ๋ฉด์ ์คํ์ ๋ง์ด ํจ. ๊ทธ๋งํผ ์๊ฐ๋ ๋ง์ด ๋ค๊ณ ์ง๋ฃจํ ์์ . ๊ณผ์ ํฉ๊ณผ ๊ณผ์์ ํฉ์ ํผํ๊ธฐ์ํด์๋ ๊ผญ ํ์ํ ๋ ธ๊ฐ๋ค์ด๋ค.
๋ฅ๋ฌ๋์ ์ฃผ์ ๊ฐ๋
Batch size, Epoch (๋ฐฐ์น ์ฌ์ด์ฆ, ์ํญ)
batch์ iteration
- ๋ฐ์ดํฐ์ ์ ์์ ๋จ์๋ก ์ชผ๊ฐ์ ํ์ต์ ์ํค๋๋ฐ ์ชผ๊ฐ๋ ๋จ์๋ฅผ ๋ฐฐ์น(Batch)
- ์ชผ๊ฐ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ ๊ฒ์ Iteration(์ดํฐ๋ ์ด์ )
epoch
- ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ๋ฒ ํ์ด๋ณด๋ ๊ณผ์ epochs(์ํญ)
- batch๋ฅผ ๋ช ๊ฐ๋ก ๋๋ ๋์๋์ ์๊ด ์์ด ์ ์ฒด ๋ฐ์ดํฐ์ ์ ํ ๋ฒ ๋ ๋ ํ epoch์ด ๋๋จ.
๋ฐ๋ผ์ 1์ฒ๋ง๊ฐ์ ๋ฐ์ดํฐ์ ์ 1์ฒ๊ฐ ๋จ์์ ๋ฐฐ์น๋ก ์ชผ๊ฐ๋ฉด, 1๋ง๊ฐ์ ๋ฐฐ์น๊ฐ ๋๊ณ , ์ด 1๋ง๊ฐ์ ๋ฐฐ์น๋ฅผ 100์ํญ์ ๋๋ค๊ณ ํ๋ฉด 1๋ง * 100 = 100๋ง๋ฒ์ ์ดํฐ๋ ์ด์ ์ ๋๋ ๊ฒ์ด ๋ฉ๋๋ค!

Activation functions (ํ์ฑํ ํจ์)
- ํ์ฑํ ํจ์๋ ๋น์ ํ ํจ์ : ์๊ทธ๋ชจ์ด๋ ํจ์
์ฐ๊ตฌ์๋ค์ ๋ด๋ฐ์ ์ ํธ์ ๋ฌ ์ฒด๊ณ๋ฅผ ํ๋ด๋ด๋ ํจ์๋ฅผ ์ํ์ ์ผ๋ก ๋ง๋ค์๋๋ฐ, ์ ๊ธฐ ์ ํธ์ ์๊ณ์น๋ฅผ ๋์ด์ผ ๋ค์ ๋ด๋ฐ์ด ํ์ฑํ ํ๋ค๊ณ ํด์ ํ์ฑํ ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.

- ๋ํ์ ์ธ ์ : ์๊ทธ๋ชจ์ด๋ ํจ์

- ํ์ฑํ ํจ์์ ์ฌ๋ฌ๊ฐ์ง ์ข ๋ฅ
- ๋ฅ๋ฌ๋์์ ๊ฐ์ฅ ๋ง์ด ๋ณดํธ์ ์ผ๋ก ์ฐ์ด๋ ํ์ฑํํจ์๋ ๋จ์ฐ ReLU(๋ ๋ฃจ)
- ๋ค๋ฅธ ํ์ฑํ ํจ์์ ๋นํด ํ์ต์ด ๋น ๋ฅด๊ณ , ์ฐ์ฐ ๋น์ฉ์ด ์ ๊ณ , ๊ตฌํ์ด ๊ฐ๋จ

Overfitting, Underfitting (๊ณผ์ ํฉ, ๊ณผ์์ ํฉ)
๊ณผ์ ํฉ ํ์(Overfitting)
- Training loss๋ ์ ์ ๋ฎ์์ง๋๋ฐ Validation loss๊ฐ ๋์์ง๋ ์์
- ๋ฌธ์ ์ ๋์ด๋์ ๋นํด ๋ชจ๋ธ์ ๋ณต์ก๋(Complexity)๊ฐ ํด ๊ฒฝ์ฐ ๊ฐ์ฅ ๋ง์ด ๋ฐ์ํ๋ ํ์
๊ณผ์์ ํฉ(Underfitting)
- ๋ฐ๋๋ก ์ฐ๋ฆฌ๊ฐ ํ์ด์ผํ๋ ๋ฌธ์ ์ ๋์ด๋์ ๋นํด ๋ชจ๋ธ์ ๋ณต์ก๋๊ฐ ๋ฎ์ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ํ์ง ๋ชปํ๋ ํ์

์ฐ๋ฆฌ๋ ์ ๋นํ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๋ชจ๋ธ์ ์ฐพ์์ผ ํ๊ณ ์์ญ๋ฒ์ ํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ์ต์ ํฉ(Best fit)์ ๋ชจ๋ธ์ ์ฐพ์์ผํ๋ค.
๊ณผ์ ํฉ(Overfitting)์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ชจ์ผ๊ธฐ, Data augmenation, Dropout ๋ฑ์ด ์๋ค.
๋ฅ๋ฌ๋์ ์ฃผ์ ์คํฌ
Data augmentation (๋ฐ์ดํฐ ์ฆ๊ฐ๊ธฐ๋ฒ)
- ๊ณผ์ ํฉ์ ํด๊ฒฐํ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ๋๋ฆฌ๋ ๋ฐฉ๋ฒ
- ๋ถ์กฑํ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ถฉํ๊ธฐ์ํด ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ์ฆ๊ฐ๊ธฐ๋ฒ์ด๋ผ๋ ๊ผผ์์๋ ๊ผผ์๋ฅผ ์ฌ์ฉ
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ถ์ผ์ ๋ฅ๋ฌ๋์์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๊ธฐ๋ฒ

Dropout (๋๋์์)
- ๊ณผ์ ํฉ์ ํด๊ฒฐํ ์ ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ
- ๊ฐ ๋ ธ๋๋ค์ด ์ด์ด์ง ์ ์ ๋นผ์ ์์ ๋ฒ๋ฆฐ๋ค๋ ์๋ฏธ
- ๊ฐ ๋ฐฐ์น๋ง๋ค ๋๋คํ ๋ ธ๋๋ฅผ ๋์ด๋ฒ๋ฆผ. ์ฆ ๋ค์ ๋ ธ๋๋ก ์ ๋ฌํ ๋ ๋๋คํ๊ฒ ์ถ๋ ฅ์ 0์ผ๋ก ๋ง๋ค์ด๋ฒ๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ๋ค.


Ensemble (์์๋ธ)
- ์ปดํจํ ํ์๋ง ์ถฉ๋ถํ๋ค๋ฉด ๊ฐ์ฅ ์๋ํด๋ณด๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ
- ์ฌ๋ฌ๊ฐ์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋ง๋ค์ด ๊ฐ๊ฐ ํ์ต์ํจ ํ ๊ฐ๊ฐ์ ๋ชจ๋ธ์์ ๋์จ ์ถ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ํฌํ๋ฅผ ํ๋ ๋ฐฉ๋ฒ
- ๋๋ค ํฌ๋ ์คํธ์ ๊ธฐ๋ฒ๊ณผ ๋น์ท
- ์ฌ๋ฌ๊ฐ์ ๋ชจ๋ธ์์ ๋์จ ์ถ๋ ฅ์์ ๋ค์๊ฒฐ๋ก ํฌํ(Majority voting)๋ฅผ ํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ , ํ๊ท ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ , ๋ง์ง๋ง์ ๊ฒฐ์ ํ๋ ๋ ์ด์ด๋ฅผ ๋ถ์ด๋ ๊ฒฝ์ฐ ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฉ์ด ๊ฐ๋ฅ
- ์์๋ธ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ต์ 2% ์ด์์ ์ฑ๋ฅ ํฅ์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค

Learning rate decay (Learning rate schedules)
- ์ค๋ฌด์์๋ ์์ฃผ ์ฐ๋ ๊ธฐ๋ฒ
- Local minimum์ ๋น ๋ฅด๊ฒ ๋๋ฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
- ์ผ์ชฝ(Decaying) : (์ ํธ) ํฐ ํญ์ผ๋ก ๊ฑด๋๋ฐ๊ณ ๋ท๋ถ๋ถ์ผ๋ก ๊ฐ ์๋ก ์ ์ ์กฐ๊ธ์ฉ ์์ง์ฌ์ ํจ์จ์ ์ผ๋ก Local minimum์ ์ฐพ๋ ๋ชจ์ต
- ์ค๋ฅธ์ชฝ(Decent) : Learning rate๋ฅผ ๊ณ ์ ์์ผฐ์ ๋์ ๋ชจ์ต
- Keras ์์ ์์ฃผ ์ฌ์ฉ : tf.keras.callbacks.LearningRateScheduler() ์ tf.keras.callbacks.ReduceLROnPlateau() ๋ก Learning rate๋ฅผ ์กฐ์


3์ฃผ์ฐจ ์์
'๋จธ์ ๋ฌ๋์์ ๊ฐ์ฅ ์ ๋ช ํ ๋ฐ์ดํฐ์ ์ค ํ๋์ธ MNIST ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ๋ถ์ํด๋ณด๋๋ก ํฉ์๋ค!'
MNIST ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์์ผ๋ก ์ด 0 ~ 9 ๊น์ง์ ์ซ์ ์ด๋ฏธ์ง ๋ชจ์์ด๋ผ๊ณ ํ๋ค.
์์ ์ด๋.. ๋ถ์ํด๋ณด๋๋ก ํ์.
๊ธฐ๋ณธ ํ
# ๋ฐ์ดํฐ์
๋ค์ด๋ก๋
!kaggle datasets download -d oddrationale/mnist-in-csv
!unzip mnist-in-csv.zip
# ํจํค์ง ๋ก๋
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
# ๋ฐ์ดํฐ์
๋ก๋
train_df = pd.read_csv('mnist_train.csv')
train_df.head()
test_df = pd.read_csv('mnist_test.csv')
test_df.head()
# ๋ผ๋ฒจ ๋ถํฌ
sns.countplot(train_df['label'])
plt.show()
# ์ ์ฒ๋ฆฌ
train_df = train_df.astype(np.float32)
# ์์์ float32 (๋นํธ) ๋ก ๋ฐ๊ฟ.
x_train = train_df.drop(columns=['label'], axis=1).values
# x ๊ฐ์๋ label ๋ง ๋นผ์ฃผ๊ณ , (().values) ๋ ๋ฐ์ดํฐํ๋ ์์์ np.array ๋ก ๋ณํ
y_train = train_df[['label']].values
# y ๊ฐ์๋ label ๋ง ๋ฃ์ด์ค.
test_df = test_df.astype(np.float32)
x_test = test_df.drop(columns=['label'], axis=1).values
y_test = test_df[['label']].values
print(x_train.shape, y_train.shape)
# ํธ๋ ์ด๋ : ๋ฐ์ดํฐ์
์ 27455, ์
๋ ฅ ๋
ธ๋์ ๊ฐ์ ํฝ์
์ ํฌ๊ธฐ : 784 / output ์ ๋
ธ๋์ ๊ฐ์ 1๊ฐ
print(x_test.shape, y_test.shape)
# ํ
์คํธ : ๋ฐ์ดํฐ์
์ 7172, ์
๋ ฅ ๋
ธ๋์ ๊ฐ์ ํฝ์
์ ํฌ๊ธฐ : 784 / output ์ ๋
ธ๋์ ๊ฐ์ 1๊ฐ
# ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
index = 1
plt.title(str(y_train[index]))
plt.imshow(x_train[index].reshape((28, 28)), cmap='gray')
# reshape ์ผ๋ก ์ด์ฐจ์์ผ๋ก ๋ณํ (x:28px, y:28px), cmap='gray' ๊ทธ๋ ์ด์ค์ผ์ผ ๋ณํ
plt.show()
# 6=G๋ฒ์ ํด๋นํ๋ (28, 28) ์ด๋ฏธ์ง
# ์ ์์ ์ผ๋ก ๋ณํ์ด ๋์๋์ง ํ์ธ ๋ฐฉ๋ฒ : One-hot encoding ํ ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฌ์คํ
# One-hot encoding
encoder = OneHotEncoder()
y_train = encoder.fit_transform(y_train).toarray()
# ๋ผ๋ฒจ ๊ฐ๋ง One-hot encoding ์ ์ฉ ํ array ํํ๋ก ๋ณํ
y_test = encoder.fit_transform(y_test).toarray()
print(y_train.shape)
# ์ ์์ ์ผ๋ก ๋ณํ์ด ๋์๋์ง ํ์ธ ๋ฐฉ๋ฒ : One-hot encoding ํ ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฌ์คํ
# ์ผ๋ฐํ
x_train = x_train / 255. # 0 ~ 255 ์ ๋ฐ์ดํฐ๋ฅผ 255 ๋ก ๋๋๋ฉด 0 ๊ณผ 1 ๋ฐ์ดํฐ๋ก ๊ตฌ๋ถ
# ์ด๋ฏธ์ง ๋ฐ์ดํฐ์ ์ต๋ ํฝ์
์ 255px
x_test = x_test / 255.
# 1๋ฒ ์ด์ ์คํ์์ผฐ์ ๊ฒฝ์ฐ 2๋ฒ์ ๋๋ ๊ฐ์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๊ผญ 1๋ฒ๋ง ์คํํ ๊ฒ.
# ๋คํธ์ํฌ ๊ตฌ์ฑ
input = Input(shape=(784,))
hidden = Dense(1024, activation='relu')(input)
hidden = Dense(512, activation='relu')(hidden)
hidden = Dense(256, activation='relu')(hidden)
output = Dense(10, activation='softmax')(hidden)
# output, Dense ์ํ๋ ๊ฐ์ ์ข
๋ฅ ์ 0~9๊ฐ 10๊ฐ
# shape ๋ก Dense ๊ฐ ํ์ธ
# activation='softmax' : ๋คํญ ๋
ผ๋ฆฌ ํ๊ท ์ฌ์ฉ
model = Model(inputs=input, outputs=output)
model.compile(loss='categorical_crossentropy',= optimizer=Adam(lr=0.001), metrics['acc'])
# ๋คํญ ๋
ผ๋ฆฌ ํ๊ท : categorical_crossentropy ์ฌ์ฉ
# metrics=['acc'] : 0 ~ 1 ์ฌ์ด๋ก ์ ํ๋๋ฅผ ํผ์ผํธ๋ก ๋ํ๋
model.summary()
# ํ์ต
history = model.fit(
x_train,
y_train,
validation_data=(x_test, y_test), # ๊ฒ์ฆ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ํ epoch์ด ๋๋ ๋๋ง๋ค ์๋์ผ๋ก ๊ฒ์ฆ
epochs=20 # epochs ๋ณต์ํ์ผ๋ก ์ฐ๊ธฐ!
)
# ํ์ต ๊ฒฐ๊ณผ ๊ทธ๋ํ
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
# .plot ๋ก ๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])โ
์๋ฌ ๋ ธํธ
์ด์ ์ค์ต๊ณผ ๋์ผํ ํผ์ผ๋ก ์์ ๋ค์ด๊ฐ ๋ด์ฉ์ ์์ ํ๊ณ ์คํํ๋ค.

์ฝ๊ฒ ๋์ด๊ฐ ์น๊ตฌ๊ฐ ์๋์ง ^^..
์ฒ์์ ์์ธ์ด ๋ญ์ง๋ฅผ ์๋จ์์ ์๋ฌ๊ฐ ๋๋ ๋ฌธ๊ตฌ๋ฅผ ๊ตฌ๊ธ๋งํ๋ฉฐ ์ฐพ์๋ดค์ง๋ง,
๋ต์ด ์ข์ฒ๋ผ ๋ณด์ด์ง ์์๋ค.
๊ทธ๋ฌ๋ค
๊ฐ์ ํ์์๊ฒ ๋ฌผ์ด๋ดค๋๋ฐ,
์๋ ์ ๊ฑธ ํ์์ ๊ฐ์ฅ ๋ฐ์ ์๋ฌ์ ๋ํ ๋ถ๋ถ์ ๊ฐ๋ฆฌํค๋ฉฐ 'Shapes' ์ ๋ํ ์ค๋ฅ๋ผ๊ณ ์๋ ค์ฃผ์๋ค.
์ด๋ ๊ฒ๋ง ๋ด์ Shapes ์ ๋ญ๊ฐ ์๋ชป๋๊ฑด์ง ๋ชฐ๋๋๋ฐ,

๊ผญ ์ด๋ฐ ์น๊ตฌ๋ค ์์ง ์์๊ฐ..
์ถ์ ๋ ๋ฌธ์ ๋ฅผ ์ฝ๊ณ ํด๋นํ๋ ๊ฐ์ ๊ตฌํ์์ค.
๋ถ๋ช 0 ~ 9 ๊น์ง์ ๊ฐ์ ์ฐพ์ผ๋ผ ํ๊ฑฐ๋
10(0~9)์ด ์๋ 24 ๋ผ๋ ๊ฐ์ ๋ฃ๊ณ ์ถ๋ ฅ์ด ์ ๋์์ฃผ๊ธธ ๋ฐ๋ผ๋ ๋ ์์ .. ์ ์ฃ..
๋ฐ๋ก 10 ์ผ๋ก ๊ณ ์ณ์ฐ๊ณ ์ฌ์คํ ํ๋๋ ๋๋ฌด ์ ๋์๋ค..

์ถ์ฒ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค