Fixed
Browse files
README.md
CHANGED
@@ -1,293 +1,293 @@
|
|
1 |
-
---
|
2 |
-
license: apache-2.0
|
3 |
-
---
|
4 |
-
|
5 |
-
์๋
ํ์ธ์ Oneclick AI ์
๋๋ค!!
|
6 |
-
์ค๋์, CNN ๋ชจ๋ธ์ ๋ํด์ ๊น๊ฒ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊น ํฉ๋๋ค.
|
7 |
-
|
8 |
-
๋ฅ๋ฌ๋์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ ์ด์ ๊ฐ ๋ฐ๋ก CNN์ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง (Convolutional Neural Network, CNN) ๋๋ถ์ธ๋ฐ์, ์ค๋์ ์ด ์ ๊ฒฝ๋ง์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, CNN์ ์ด๋ป๊ฒ ์ฌ์ง ์์ ์ซ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋์ง ์์๋ด
์๋ค.
|
9 |
-
|
10 |
-
---
|
11 |
-
|
12 |
-
## ๋ชฉ์ฐจ
|
13 |
-
1. CNN ํต์ฌ ์๋ฆฌ ํ์
ํ๊ธฐ
|
14 |
-
- ์ ์ด๋ฏธ์ง์ CNN์ ์ฌ์ฉํ ๊น?
|
15 |
-
- CNN์ ํต์ฌ : ์ง์ญ ์์ฉ ์์ญ๊ณผ ํ๋ผ๋ฏธํฐ ๊ณต์
|
16 |
-
- CNN์ ์ฃผ์ ๊ตฌ์ฑ ์์
|
17 |
-
2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
18 |
-
- keras๋ก ๊ตฌํํ CNN ๋ชจ๋ธ ์ํคํ
์ณ
|
19 |
-
- model.summary()๋ก ๊ตฌ์กฐ ํ์ธํ๊ธฐ
|
20 |
-
3. ์ง์ CNN ๊ตฌํํด ๋ณด๊ธฐ
|
21 |
-
- 1๋จ๊ณ :
|
22 |
-
- 2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ
|
23 |
-
- 3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ
|
24 |
-
- 4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅํ๊ธฐ
|
25 |
-
- 5๋จ๊ณ : ๋ชจ๋ธ ์ฌ์ฉํ๊ธฐ
|
26 |
-
4. ๋๋ง์ CNN ๋ชจ๋ธ ๋ง๋ค์ด๋ณด๊ธฐ
|
27 |
-
- ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋
|
28 |
-
- ๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝํ๊ธฐ
|
29 |
-
- ์ ์ดํ์ต์ผ๋ก ์ฑ๋ฅ ๊ทน๋ํ ํ๊ธฐ
|
30 |
-
5. ๊ฒฐ๋ก
|
31 |
-
---
|
32 |
-
|
33 |
-
## 1. CNN ํต์ฌ์๋ฆฌ ํ์
ํ๊ธฐ
|
34 |
-
๋ค์ด๊ฐ๊ธฐ ์์, CNN ์ด ์ด๋ค ์๋ฆฌ๋ก ์ด๋ฏธ์ง๋ฅผ ์ดํดํ๋์ง ๋จผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
|
35 |
-
|
36 |
-
**์ ์ด๋ฏธ์ง์ CNN์ ์ฌ์ฉํ ๊น??**
|
37 |
-
๋จ์ํ ์ ๊ฒฝ๋ง(Fully Connected Layer)์ ์ด๋ฏธ์ง๋ฅผ ์
๋ ฅํ๋ ค๋ฉด, 2์ฐจ์์ธ ์ด๋ฏธ์ง๋ฅผ 1์ฐจ์์ ๊ธด ๋ฐ์ดํฐ๋ก ํผ์น๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ๊ผญ ํ์ํฉ๋๋ค.
|
38 |
-
์ด ๊ณผ์ ์์ ํฝ์
๊ฐ์ ๊ณต๊ฐ์ ์ธ ์ ๋ณด๊ฐ ์ ๋ถ ํ๊ดด๋ฉ๋๋ค.
|
39 |
-
์ด๋ ์ด๋ค ํฝ์
์ด ์๋ก ์ด์ํด ์๋์ง ์ ์ ์์ด์ ธ์ ๋์ด ์ฝ ์์ ์๋ค๋ ์์น์ ๋ณด ๊ฐ์ ๋ด์ฉ์ด ๊ฐ๋ผ์ ๋ฒ๋ฆฐ๋ค๋ ์๋ฏธ ์
๋๋ค.
|
40 |
-
CNN์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๊ฐ์ ์์ ๊ฒฝ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฐฉํ์ฌ ์ค๊ณ๋์์ต๋๋ค.
|
41 |
-
|
42 |
-
**CNN์ ํต์ฌ ์์ด๋์ด**
|
43 |
-
์ด๊ฒ์ด ๋ฐ๋ก ์ง์ญ์ ์์ฉ์์ญ๊ณผ ํ๋ผ๋ฏธํฐ ๊ณต์ ์
๋๋ค.
|
44 |
-
- ์ง์ญ์ ์์ฉ ์์ญ(Local Receptive Fields)
|
45 |
-
์ ๊ฒฝ๋ง์ ๊ฐ ๋ด๋ฐ์ด ์ด๋ฏธ์ง ์ ์ฒด๊ฐ ์๋, ์์ ์ผ๋ถ์๋ง ์ฐ๊ฒฐ๋ฉ๋๋ค.
|
46 |
-
์ด๋ ์ ์ฒด ํฝ์
์ ๋ํด์๊ฐ ์๋ ์์๋ฅผ ๋ค๋ฉด 3 * 3 ํฝ์
์๋ง ์ ์ฉ๋๋ ๋ฐฉ์์ธ๋ฐ์, ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ ์ด๋ฏธ์ง์ ์ ์ฒด ๋งฅ๋ฝ๋ณด๋ค ์ , ๋ชจ์๋ฆฌ, ์ง๊ฐ๊ณผ ๊ฐ์ ์ง์ญ์ ์ธ ํจํด์ ๋จผ์ ํ์ตํ๊ฒ ๋ฉ๋๋ค.
|
47 |
-
|
48 |
-
- ํ๋ผ๋ฏธํฐ ๊ณต์ (Parameter Sharing)
|
49 |
-
CNN์ ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ํํฐ๋ฅผ ํตํด์ ์ค์บํ๋ ๋๋์ผ๋ก ํ์ตํฉ๋๋ค.
|
50 |
-
๋ฐ๋ผ์, ํ๋ฒ ์ด๋ฏธ์ง์ ํน์ง์ ํ์ตํ๋ฉด, ์ด๋ฏธ์ง์ ๋ชจ๋ ์์น์์ ํด๋น ํน์ง์ ๊ฐ์งํ ์ ์์ต๋๋ค.
|
51 |
-
์ด๋ฅผ ํตํด์ ํ์ตํ ํ๋ผ๋ฏธํฐ ์๋ฅผ ๋ง์ด ์ค์ผ ์ ์์ต๋๋ค.
|
52 |
-
|
53 |
-
**CNN์ ์ฃผ์ ๊ตฌ์ฑ ์์**
|
54 |
-
์์ ์์ด๋์ด๋ฅผ ๋ฐํ์ผ๋ก, CNN์ ๋ค์ 3๊ฐ์ง์ ๊ณ์ธต์ ์กฐํฉํด์ ๋ง๋ญ๋๋ค.
|
55 |
-
- ํฉ์ฑ๊ณฑ ๊ณ์ธต (Convolutional Layer)
|
56 |
-
ํ์ต ๊ฐ๋ฅํ ํํฐ๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง์ ํน์ง์ ์ถ์ถํด ๋
๋๋ค.
|
57 |
-
edge, corner ๋ฑ์ ์ถ์ถํ์ฌ ์ป๋ ๊ฒฐ๊ณผ๋ฌผ์ ํน์ง ๋งต(Feature Map) ์ด๋ผ๊ณ ํฉ๋๋ค.
|
58 |
-
|
59 |
-
- ํ๋ง ๊ณ์ธต (Pooling Layer)
|
60 |
-
์์ ๋ง๋ ๋งต์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์์ฝ๋จ๊ณ ์
๋๋ค.
|
61 |
-
์ต๋ ํ๋ง(Max Pooling)์ ํน์ ์์ญํค์ ๊ฐ์ฅ ์ค์ํ ํน์ง(๊ฐ์ฅ ํฐ ๊ฐ)๋ง ๋จ๊ฒจ ๊ณ์ฐ๋์ ์ค์ด๊ณ , ๋ชจ๋ธ์ด ํน์ง์ ๋ฏธ์ธํ ์์น ๋ณํ์ ๋ ๋ฏผ๊ฐํด ํ๋๋ก ๋ง๋ญ๋๋ค.
|
62 |
-
|
63 |
-
- ์์ ์ฐ๊ฒฐ ๊ณ์ธต (Dense Layer)
|
64 |
-
์ถ์ถ๋ ํน์ง๋ค์ ์ข
ํฉํ์ฌ ์ต์ข
์ ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ์ด๋ค ํด๋์ค์ ์ํ๋์ง ๋ถ๋ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
|
65 |
-
|
66 |
-
---
|
67 |
-
|
68 |
-
## 2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
69 |
-
์ด์ , ์์ ์ค๋ช
ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก, ์ค์ TensorFlow Keras ์ฝ๋๋ฅผ ํตํด์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๊ฐํด ๋ด
์๋ค.
|
70 |
-
๋ค์์, Keras๋ก ๊ตฌํํ CNN ๋ชจ๋ธ ์ํคํ
์ณ ์
๋๋ค.
|
71 |
-
```python
|
72 |
-
import tensorflow as tf
|
73 |
-
from tensorflow import keras
|
74 |
-
|
75 |
-
# ๋ชจ๋ธ ์ํคํ
์ฒ ์ ์
|
76 |
-
model = keras.Sequential([
|
77 |
-
# Input: (28, 28, 1) ์ด๋ฏธ์ง
|
78 |
-
# ์ฒซ ๋ฒ์งธ Conv-Pool ๋ธ๋ก
|
79 |
-
keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)),
|
80 |
-
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
81 |
-
|
82 |
-
# ๋ ๋ฒ์งธ Conv-Pool ๋ธ๋ก
|
83 |
-
keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
|
84 |
-
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
85 |
-
|
86 |
-
# ๋ถ๋ฅ๊ธฐ(Classifier)
|
87 |
-
keras.layers.Flatten(),
|
88 |
-
keras.layers.Dropout(0.5),
|
89 |
-
keras.layers.Dense(10, activation="softmax"),
|
90 |
-
])
|
91 |
-
```
|
92 |
-
์ด์ , ์์ ์ค๋ช
ํ๋ ์ด๋ก ์ด ์ด ์ฝ๋์ ์ด๋ป๊ฒ ๋
น์์๋์ง ์์๋ด
์๋ค.
|
93 |
-
|
94 |
-
- **ํฉ์ฑ๊ณฑ ๊ณ์ธต(Conv2D)**
|
95 |
-
```python
|
96 |
-
keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1))
|
97 |
-
```
|
98 |
-
์ด ์ฝ๋๋ฅผ ํตํด์, ํฉ์ฑ๊ณฑ ๊ณ์ธต์ ํ์ฑ, ๋ค์
|
99 |
-
1. ์ง์ญ ์์ฉ์์ญ
|
100 |
-
```kernel_size(3, 3)```์ ํตํด์ ์ด๋ฏธ์ง ์ ์ฒด๊ฐ ์๋ 3 * 3 ํฌ๊ธฐ์ ์์ ์์ญ๋ง ๋ณด๋๋ก ๋ง๋ญ๋๋ค.
|
101 |
-
์ด๋ ๊ฒ, ์ง์ญ์ ์์ฉ์์ญ์ ๋ง๋ญ๋๋ค
|
102 |
-
|
103 |
-
2. ํ๋ผ๋ฏธํฐ ๊ณต์
|
104 |
-
```Conv2D``` ๊ณ์ธต์ 32๊ฐ์ ํํฐ๋ฅผ ์์ฑํฉ๋๋ค.
|
105 |
-
3 * 3ํํฐ๋ ๊ณ ์ ํ ํ๋ผ๋ฏธํฐ(๊ฐ์ค์น)์ธํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด ํํฐ ํ๋๊ฐ ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ์ค์บํฉ๋๋ค.
|
106 |
-
๋ง์ฝ, ํ๋ผ๋ฏธํฐ ๊ณต์ ๊ฐ ์๋ค๋ฉด, ๊ฐ 3 * 3 ์์น๋ง๋ค ๋ณ๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ํฌ๊ธฐ๊ฐ ์์ฒญ ์ปค์ง๋๋ค.
|
107 |
-
ํ์ง๋ง, ํ๋ผ๋ฏธํฐ ๊ณต์ ๋๋ถ์, ์ด ๊ฒฝ์ฐ์์ ```(3 * 3 * 1 +1) * 32 = 320``` ๊ฐ์ ํ๋ผ๋ฏธํฐ ๋ง์ผ๋ก ์ด๋ฏธ์ง ์ ์ฒด์ ํน์ง์ ์ถ์ถํ ์ ์์ต๋๋ค.
|
108 |
-
|
109 |
-
- **ํ๋ง ๊ณ์ธต(MaxPooling2D)**
|
110 |
-
```python
|
111 |
-
keras.layers.MaxPooling2D(pool_size=(2, 2))
|
112 |
-
```
|
113 |
-
์์ ํฉ์ฑ๊ณฑ ๊ณ์ธต์ด ์์ฑํ ํน์ง๋งต์ 2* 2 ํฌ๊ธฐ์ ์์ญ์ผ๋ก ๋๋๊ณ , ๊ฐ ์์ญ์์ ๊ฐ์ฅ ํฐ ๊ฐ๋ง
|
114 |
-
์ด๋ฅผ ํตํด ๋งต ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋๋ **๋ค์ด ์ํ๋ง**์ด ์ผ์ด๋๊ณ , ๊ณ์ฐ ํจ์จ์ฑ์ด ๋์์ ธ ๋ชจ๋ธ ํ์ต์ด ๋ ๊ฐ๋ฒผ์ ์ง๋๋ค.
|
115 |
-
|
116 |
-
- **์์ ์ฐ๊ฒฐ ๊ณ์ธต(Dense Layer)**
|
117 |
-
```python
|
118 |
-
keras.layers.Flatten()
|
119 |
-
keras.layers.Dense(10, activation="softmax")
|
120 |
-
```
|
121 |
-
์ต์ข
๋ถ๋ฅ๊ธฐ ์ด๋ฉฐ, ์์ ์ฐ๊ฒฐ๊ณ์ธต ์
๋๋ค.
|
122 |
-
1. ```keras.layers.Flatten()```
|
123 |
-
์์ ์ฐ๊ฒฐ๊ณ์ธต์ 1์ฐจ์ ๋ฐฑํฐ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์, Flastten ๊ณ์ธต์ด ๋จผ์ ๋ค์ด์ 2์ฐจ์ ํํ์ ํน์ง ๋งต์ ํ ์ค๋ก ํผ์ณ์ค๋๋ค.
|
124 |
-
|
125 |
-
2. ```keras.layers.Dense(10, activation="softmax")```
|
126 |
-
์ด ์ฝ๋๊ฐ ์์ ์ฐ๊ฒฐ๊ณ์ธต์ด๋ฉฐ, ๋ณดํต Dense Layer ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
|
127 |
-
ํน์ง๋ฐฑํฐ๋ฅผ ์
๋ ฅ๋ฐ์ 10๊ฐ์ ํด๋์ค ์ค ์ด๋ ํด๋์ค์ ํ ๋นํ ์ง ์ต์ข
์ ์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค.
|
128 |
-
```activation="softmax"```๋ ๊ฐ ํด๋์ค์ ๋ํ ์์ธก๊ฐ์ 0 ๊ณผ 1 ์ฌ์ด์ ํ๋ฅ ๊ฐ์ผ๋ก ํ๊ฒ ํ์ฌ ๋ชจ๋ ํ๋ฅ ์ ํฉ์ด
|
129 |
-
|
130 |
-
---
|
131 |
-
|
132 |
-
## 3. ์ง์ CNN ๊ตฌํํด ๋ณด๊ธฐ
|
133 |
-
์ด์ , ์ง์ CNN ํ์ต ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ตฌํํด ๋ด
์๋ค.
|
134 |
-
|
135 |
-
**1๋จ๊ณ. ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ**
|
136 |
-
๋ชจ๋ธ์ด ํ์ตํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ค๋๋ค.
|
137 |
-
์ด๋ฒ์, ์ฝ๊ฒ ๋ถ๋ฌ์ฌ ์ ์๋ MNIST ์๊ธ์จ ์ซ์ ๋ฐ์ดํฐ์
์ ๊ฐ์ ธ์ ์ ์ ํ ํํ๋ก ์ ์ฒ๋ฆฌ ํ๊ฒ ์ต๋๋ค.
|
138 |
-
|
139 |
-
```python
|
140 |
-
import numpy as np
|
141 |
-
import tensorflow as tf
|
142 |
-
from tensorflow import keras
|
143 |
-
from keras import layers
|
144 |
-
|
145 |
-
# Keras ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด MNIST ๋ฐ์ดํฐ์
์ ์์ฝ๊ฒ ๋ถ๋ฌ์ต๋๋ค.
|
146 |
-
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
|
147 |
-
|
148 |
-
# ์ ๊ทํ: ํฝ์
๊ฐ์ ๋ฒ์๋ฅผ 0~255์์ 0~1 ์ฌ์ด๋ก ์กฐ์ ํ์ฌ ํ์ต ์์ ์ฑ ๋ฐ ์๋๋ฅผ ๋์
๋๋ค.
|
149 |
-
x_train = x_train.astype("float32") / 255.0
|
150 |
-
x_test = x_test.astype("float32") / 255.0
|
151 |
-
|
152 |
-
# ์ฑ๋ ์ฐจ์ ์ถ๊ฐ: ํ๋ฐฑ ์ด๋ฏธ์ง(์ฑ๋ 1)์ ์ฐจ์์ ๋ช
์์ ์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
|
153 |
-
x_train = np.expand_dims(x_train, -1)
|
154 |
-
x_test = np.expand_dims(x_test, -1)
|
155 |
-
|
156 |
-
# ๋ ์ด๋ธ ์-ํซ ์ธ์ฝ๋ฉ: ์ซ์ '5'๋ฅผ [0,0,0,0,0,1,0,0,0,0] ํํ์ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค.
|
157 |
-
num_classes = 10
|
158 |
-
y_train = keras.utils.to_categorical(y_train, num_classes)
|
159 |
-
y_test = keras.utils.to_categorical(y_test, num_classes)
|
160 |
-
```
|
161 |
-
|
162 |
-
**2๋จ๊ณ. ๋ชจ๋ธ ์ปดํ์ผ**
|
163 |
-
๋ชจ๋ธ ์ํคํ
์ณ๋ฅผ ์ ์ํ๊ณ ๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ต์ํฌ์ง์ ๋ํด ์ ํฉ๋๋ค.
|
164 |
-
```python
|
165 |
-
model = keras.Sequential([
|
166 |
-
keras.Input(shape=(28, 28, 1)), # ์
๋ ฅ ๋ ์ด์ด
|
167 |
-
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
|
168 |
-
layers.MaxPooling2D(pool_size=(2, 2)),
|
169 |
-
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
|
170 |
-
layers.MaxPooling2D(pool_size=(2, 2)),
|
171 |
-
layers.Flatten(),
|
172 |
-
layers.Dropout(0.5),
|
173 |
-
layers.Dense(num_classes, activation="softmax")
|
174 |
-
])
|
175 |
-
|
176 |
-
model.compile(
|
177 |
-
# ์์ค ํจ์(Loss Function): ๋ชจ๋ธ์ ์์ธก์ด ์ ๋ต๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ธก์ ํฉ๋๋ค.
|
178 |
-
loss="categorical_crossentropy",
|
179 |
-
# ์ตํฐ๋ง์ด์ (Optimizer): ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
|
180 |
-
optimizer="adam",
|
181 |
-
# ํ๊ฐ์งํ(Metrics): ํ๋ จ ๊ณผ์ ์ ๋ชจ๋ํฐ๋งํ ์งํ๋ก, ์ ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
|
182 |
-
metrics=["accuracy"]
|
183 |
-
)
|
184 |
-
```
|
185 |
-
|
186 |
-
**3๋จ๊ณ. ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ**
|
187 |
-
```model.fit()```ํจ์๋ฅผ ํตํด์ ํ์ต์ ์์ํ๊ณ , ํ์ต์ด ๋๋ ํ ```model.evaluate()```๋ก ์ต์ข
์ฑ๋ฅ์ ํ์ธํฉ๋๋ค.
|
188 |
-
```python
|
189 |
-
batch_size = 128
|
190 |
-
epochs = 15
|
191 |
-
|
192 |
-
# ๋ชจ๋ธ ํ์ต ์คํ
|
193 |
-
history = model.fit(
|
194 |
-
x_train, y_train,
|
195 |
-
batch_size=batch_size,
|
196 |
-
epochs=epochs,
|
197 |
-
validation_data=(x_test, y_test)
|
198 |
-
)
|
199 |
-
|
200 |
-
# ํ์ต ์๋ฃ ํ ์ต์ข
์ฑ๋ฅ ํ๊ฐ
|
201 |
-
score = model.evaluate(x_test, y_test, verbose=0)
|
202 |
-
print(f"\nTest loss: {score[0]:.4f}")
|
203 |
-
print(f"Test accuracy: {score[1]:.4f}")
|
204 |
-
```
|
205 |
-
|
206 |
-
**4๋จ๊ณ. ํ์ต๋ ๋ชจ๋ธ ์ ์ฅํ๊ธฐ**
|
207 |
-
๋ชจ๋ธ์ ์ ์ฅํ๊ณ , ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํฉ๋๋ค.
|
208 |
-
```python
|
209 |
-
# ๋ชจ๋ธ์ ๊ตฌ์กฐ,
|
210 |
-
model.save("my_keras_model.keras")
|
211 |
-
print("\nModel saved to my_keras_model.keras")
|
212 |
-
```
|
213 |
-
|
214 |
-
์ ๋จ๊ณ๋ฅผ ์ ๋ถ ์ํํ ๋ชจ๋ธ์ด ์ง๊ธ ์ด ํ๊น
ํ์ด์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ด์๋ ๋ชจ๋ธ์
๋๋ค. ์ด์ด์, ๋ชจ๋ธ์ ์ฌ์ฉํด ๋ณผ ๋, ์ ์ฝ๋๋ฅผ์ ์ง์ ์คํํ์ง ๋ง๊ณ , ๋ค์ ์ฝ๋๋ฅผ ์คํ์์ผ ์ฃผ์ธ์!
|
215 |
-
๋ง์ผ, ์ ์ฝ๋๋ฅผ ํตํด ์ง์ ๋ฅ๋ฌ๋์ ์์ผญ๊ณ ์ถ์ผ์๋ค๋ฉด, Files์
|
216 |
-
train.py๋ฅผ ์คํ์์ผ ์ฃผ์ธ์!
|
217 |
-
|
218 |
-
**5๋จ๊ณ. ๋ชจ๋ธ ์ฌ์ฉํด ๋ณด๊ธฐ**
|
219 |
-
์์ ๋จ๊ณ๋ค์ ๊ฑฐ์ณ ์์ฑํ ๋ชจ๋ธ์ด ์ด ํ๊น
ํ์ด์ค ํ์ด์ง์ ์ฌ๋ผ๊ฐ ์์ต๋๋ค.
|
220 |
-
์ด์ , ์ด ํ๊น
ํ์ด์ค ํ์ด์ง์ ๋ชจ๋ธ์ ๋ถ๋ฌ์์, ์ง์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
|
221 |
-
Files์ test.py๋ฅผ ์คํ์์ผ ๋ณด์ธ์!!
|
222 |
-
์ง์ ์ค๋นํ ์ซ์ ์๊ธ์จ๋ฅผ ๋ชจ๋ธ์ ์
๋ ฅ์ผ๋ก ๋ฃ์ผ๋ฉด, ๊ทธ ์ซ์๊ฐ ์ด๋ค ์ซ์์ธ์ง ๋ง์ถฐ์ค ๊ฒ๋๋ค!!
|
223 |
-
์ฝ๋ ์คํ์ ์ํด์, ์ด ์ข
์์ฑ์ ์ค์นํด์ผ ํฉ๋๋ค.
|
224 |
-
cmd ์ฐฝ์ ์ด๊ณ , ์ด ์ฝ๋๋ฅผ ๋ฃ๊ณ ์คํํ์ฌ ๋จผ์ ์ข
์์ฑ์ ๋ฐ์์ฃผ์ธ์
|
225 |
-
```bash
|
226 |
-
pip install tensorflow huggingface_hub Pillow numpy
|
227 |
-
```
|
228 |
-
## 4. ๋๋ง์ CNN ๋ชจ๋ธ ๋ง๋ค๊ธฐ
|
229 |
-
์ด์ , ์ฑ๋ฅ์ ๋ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ํด, ๋ ์ํ๋ ๋ชฉ์ ์ ๋ง๊ฒ ๋ชจ๋ธ์ ์์ ํ ์ฐจ๋ก์
๋๋ค.
|
230 |
-
|
231 |
-
- **ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋**
|
232 |
-
๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ batch_size, epochs, ์ตํฐ๋์ด์ ์ leaarning_rate๋ฑ์ ์กฐํฉํ์ฌ ์ต์ ํ ํฉ๋๋ค.
|
233 |
-
๋ค์ ์ฝ๋๋ฅผ ๊ฑด๋๋ ค์ ์์ ํฉ๋๋ค.
|
234 |
-
```python
|
235 |
-
# ์: Adam ์ตํฐ๋ง์ด์ ์ ํ์ต๋ฅ (learning_rate)์ ์ง์ ์ค์
|
236 |
-
optimizer = keras.optimizers.Adam(learning_rate=0.001)
|
237 |
-
model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"])
|
238 |
-
```
|
239 |
-
|
240 |
-
- **๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ**
|
241 |
-
๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ํด์, ```Conv2D-MaxPooling2D``` ๋ธ๋ก์ ๋ ๊น๊ฒ, ```Conv2D``` ๊ณ์ธต์ ํํฐ ์๋ฅผ ๋๋ ค ๋ ํ๋ถํ๊ฒ ํ ์ ์์ต๋๋ค.
|
242 |
-
```python
|
243 |
-
model = keras.Sequential([
|
244 |
-
keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)),
|
245 |
-
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
246 |
-
# ๋ธ๋ก ์ถ๊ฐ!
|
247 |
-
keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
|
248 |
-
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
249 |
-
# ํํฐ ์๋ฅผ ๋๋ฆฐ ๋ธ๋ก ์ถ๊ฐ!
|
250 |
-
keras.layers.Conv2D(128, kernel_size=(3, 3), activation="relu"),
|
251 |
-
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
252 |
-
|
253 |
-
keras.layers.Flatten(),
|
254 |
-
keras.layers.Dense(128, activation='relu'), # Dense ์ธต ์ถ๊ฐ
|
255 |
-
keras.layers.Dropout(0.5),
|
256 |
-
keras.layers.Dense(10, activation="softmax"),
|
257 |
-
])
|
258 |
-
```
|
259 |
-
|
260 |
-
- **์ ์ดํ์ต**
|
261 |
-
์์ฃผ ํฐ ๋ฐ์ดํฐ์
์ผ๋ก ํ์ต๋ ์ด๋ฏธ ๊ฐ๋ ฅํ ๋ชจ๋ธ์ ๊ฐ์ ธ์, ๊ทธ ๋ชจ๋ธ์ด ํ์ตํ ์ด๋ฏธ์ง ํน์ง์ถ์ถ๋ฅ๋ ฅ๋ง ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์
๋๋ค.
|
262 |
-
์ ์ ๋ฐ์ดํฐ๋ก๋ ๋์ ์ฑ๋ฅ์ ๋ผ ์ ์์ต๋๋ค.
|
263 |
-
```python
|
264 |
-
# Keras์์ ์ ๊ณตํ๋ ์ฌ์ ํ์ต๋ VGG16 ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ (๋ถ๋ฅ๊ธฐ๋ ์ ์ธ)
|
265 |
-
base_model = keras.applications.VGG16(
|
266 |
-
weights='imagenet', # ImageNet์ผ๋ก ์ฌ์ ํ์ต๋ ๊ฐ์ค์น ์ฌ์ฉ
|
267 |
-
include_top=False, # ๋ถ๋ฅ๊ธฐ(Dense ์ธต)๋ ์ ์ธ
|
268 |
-
input_shape=(32, 32, 3) # VGG16์ ์ต์ 32x32 ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์
|
269 |
-
)
|
270 |
-
|
271 |
-
# ๋ถ๋ฌ์จ ๋ชจ๋ธ์ ๊ฐ์ค์น๋ ๊ณ ์ (freeze)
|
272 |
-
base_model.trainable = False
|
273 |
-
|
274 |
-
# ์๋ก์ด ๋ถ๋ฅ๊ธฐ ์ถ๊ฐ
|
275 |
-
model = keras.Sequential([
|
276 |
-
base_model,
|
277 |
-
keras.layers.Flatten(),
|
278 |
-
keras.layers.Dense(256, activation='relu'),
|
279 |
-
keras.layers.Dropout(0.5),
|
280 |
-
keras.layers.Dense(10, activation='softmax') # ๋์ ๋ฌธ์ ์ ๋ง๋ ์ถ๋ ฅ์ธต
|
281 |
-
])
|
282 |
-
|
283 |
-
# ์๋ก ์ถ๊ฐํ ๋ถ๋ฅ๊ธฐ ๋ถ๋ถ๋ง ํ์ต
|
284 |
-
model.compile(...)
|
285 |
-
model.fit(...)
|
286 |
-
```
|
287 |
-
|
288 |
-
## 5. ๊ฒฐ๋ก
|
289 |
-
์ค๋์, ์ด๋ ๊ฒ CNN ๋ชจ๋ธ์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ดค์ต๋๋ค.
|
290 |
-
์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ํนํ๋ CNN์ ๋์ค์ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ์ด ๋์ค๋ฉด์ Vit๋ผ๋ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง๋๋ฐ ํฐ ๊ธฐ์ฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
|
291 |
-
์ด๋ ๋ฏ ๊ทผ๋ณธ ๋์น๋ CNN ๋ง์ด ์ฌ๋ํด ์ฃผ์ธ์!!
|
292 |
-
๋ค์์๋ RNN๋ชจ๋ธ๋ก ๋์์ค๊ฒ ์ต๋๋ค
|
293 |
์ค๋๋ ์ข์ํ๋ฃจ ๋ณด๋ด์ธ์ฉ!!
|
|
|
1 |
+
---
|
2 |
+
license: apache-2.0
|
3 |
+
---
|
4 |
+
|
5 |
+
์๋
ํ์ธ์ Oneclick AI ์
๋๋ค!!
|
6 |
+
์ค๋์, CNN ๋ชจ๋ธ์ ๋ํด์ ๊น๊ฒ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊น ํฉ๋๋ค.
|
7 |
+
|
8 |
+
๋ฅ๋ฌ๋์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ ์ด์ ๊ฐ ๋ฐ๋ก CNN์ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง (Convolutional Neural Network, CNN) ๋๋ถ์ธ๋ฐ์, ์ค๋์ ์ด ์ ๊ฒฝ๋ง์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, CNN์ ์ด๋ป๊ฒ ์ฌ์ง ์์ ์ซ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋์ง ์์๋ด
์๋ค.
|
9 |
+
|
10 |
+
---
|
11 |
+
|
12 |
+
## ๋ชฉ์ฐจ
|
13 |
+
1. CNN ํต์ฌ ์๋ฆฌ ํ์
ํ๊ธฐ
|
14 |
+
- ์ ์ด๋ฏธ์ง์ CNN์ ์ฌ์ฉํ ๊น?
|
15 |
+
- CNN์ ํต์ฌ : ์ง์ญ ์์ฉ ์์ญ๊ณผ ํ๋ผ๋ฏธํฐ ๊ณต์
|
16 |
+
- CNN์ ์ฃผ์ ๊ตฌ์ฑ ์์
|
17 |
+
2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
18 |
+
- keras๋ก ๊ตฌํํ CNN ๋ชจ๋ธ ์ํคํ
์ณ
|
19 |
+
- model.summary()๋ก ๊ตฌ์กฐ ํ์ธํ๊ธฐ
|
20 |
+
3. ์ง์ CNN ๊ตฌํํด ๋ณด๊ธฐ
|
21 |
+
- 1๋จ๊ณ : ๏ฟฝ๏ฟฝ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ
|
22 |
+
- 2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ
|
23 |
+
- 3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ
|
24 |
+
- 4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅํ๊ธฐ
|
25 |
+
- 5๋จ๊ณ : ๋ชจ๋ธ ์ฌ์ฉํ๊ธฐ
|
26 |
+
4. ๋๋ง์ CNN ๋ชจ๋ธ ๋ง๋ค์ด๋ณด๊ธฐ
|
27 |
+
- ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋
|
28 |
+
- ๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝํ๊ธฐ
|
29 |
+
- ์ ์ดํ์ต์ผ๋ก ์ฑ๋ฅ ๊ทน๋ํ ํ๊ธฐ
|
30 |
+
5. ๊ฒฐ๋ก
|
31 |
+
---
|
32 |
+
|
33 |
+
## 1. CNN ํต์ฌ์๋ฆฌ ํ์
ํ๊ธฐ
|
34 |
+
๋ค์ด๊ฐ๊ธฐ ์์, CNN ์ด ์ด๋ค ์๋ฆฌ๋ก ์ด๋ฏธ์ง๋ฅผ ์ดํดํ๋์ง ๋จผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
|
35 |
+
|
36 |
+
**์ ์ด๋ฏธ์ง์ CNN์ ์ฌ์ฉํ ๊น??**
|
37 |
+
๋จ์ํ ์ ๊ฒฝ๋ง(Fully Connected Layer)์ ์ด๋ฏธ์ง๋ฅผ ์
๋ ฅํ๋ ค๋ฉด, 2์ฐจ์์ธ ์ด๋ฏธ์ง๋ฅผ 1์ฐจ์์ ๊ธด ๋ฐ์ดํฐ๋ก ํผ์น๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ๊ผญ ํ์ํฉ๋๋ค.
|
38 |
+
์ด ๊ณผ์ ์์ ํฝ์
๊ฐ์ ๊ณต๊ฐ์ ์ธ ์ ๋ณด๊ฐ ์ ๋ถ ํ๊ดด๋ฉ๋๋ค.
|
39 |
+
์ด๋ ์ด๋ค ํฝ์
์ด ์๋ก ์ด์ํด ์๋์ง ์ ์ ์์ด์ ธ์ ๋์ด ์ฝ ์์ ์๋ค๋ ์์น์ ๋ณด ๊ฐ์ ๋ด์ฉ์ด ๊ฐ๋ผ์ ๋ฒ๋ฆฐ๋ค๋ ์๋ฏธ ์
๋๋ค.
|
40 |
+
CNN์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๊ฐ์ ์์ ๊ฒฝ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฐฉํ์ฌ ์ค๊ณ๋์์ต๋๋ค.
|
41 |
+
|
42 |
+
**CNN์ ํต์ฌ ์์ด๋์ด**
|
43 |
+
์ด๊ฒ์ด ๋ฐ๋ก ์ง์ญ์ ์์ฉ์์ญ๊ณผ ํ๋ผ๋ฏธํฐ ๊ณต์ ์
๋๋ค.
|
44 |
+
- ์ง์ญ์ ์์ฉ ์์ญ(Local Receptive Fields)
|
45 |
+
์ ๊ฒฝ๋ง์ ๊ฐ ๋ด๋ฐ์ด ์ด๋ฏธ์ง ์ ์ฒด๊ฐ ์๋, ์์ ์ผ๋ถ์๋ง ์ฐ๊ฒฐ๋ฉ๋๋ค.
|
46 |
+
์ด๋ ์ ์ฒด ํฝ์
์ ๋ํด์๊ฐ ์๋ ์์๋ฅผ ๋ค๋ฉด 3 * 3 ํฝ์
์๋ง ์ ์ฉ๋๋ ๋ฐฉ์์ธ๋ฐ์, ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ ์ด๋ฏธ์ง์ ์ ์ฒด ๋งฅ๋ฝ๋ณด๋ค ์ , ๋ชจ์๋ฆฌ, ์ง๊ฐ๊ณผ ๊ฐ์ ์ง์ญ์ ์ธ ํจํด์ ๋จผ์ ํ์ตํ๊ฒ ๋ฉ๋๋ค.
|
47 |
+
|
48 |
+
- ํ๋ผ๋ฏธํฐ ๊ณต์ (Parameter Sharing)
|
49 |
+
CNN์ ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ํํฐ๋ฅผ ํตํด์ ์ค์บํ๋ ๋๋์ผ๋ก ํ์ตํฉ๋๋ค.
|
50 |
+
๋ฐ๋ผ์, ํ๋ฒ ์ด๋ฏธ์ง์ ํน์ง์ ํ์ตํ๋ฉด, ์ด๋ฏธ์ง์ ๋ชจ๋ ์์น์์ ํด๋น ํน์ง์ ๊ฐ์งํ ์ ์์ต๋๋ค.
|
51 |
+
์ด๋ฅผ ํตํด์ ํ์ตํ ํ๋ผ๋ฏธํฐ ์๋ฅผ ๋ง์ด ์ค์ผ ์ ์์ต๋๋ค.
|
52 |
+
|
53 |
+
**CNN์ ์ฃผ์ ๊ตฌ์ฑ ์์**
|
54 |
+
์์ ์์ด๋์ด๋ฅผ ๋ฐํ์ผ๋ก, CNN์ ๋ค์ 3๊ฐ์ง์ ๊ณ์ธต์ ์กฐํฉํด์ ๋ง๋ญ๋๋ค.
|
55 |
+
- ํฉ์ฑ๊ณฑ ๊ณ์ธต (Convolutional Layer)
|
56 |
+
ํ์ต ๊ฐ๋ฅํ ํํฐ๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง์ ํน์ง์ ์ถ์ถํด ๋
๋๋ค.
|
57 |
+
edge, corner ๋ฑ์ ์ถ์ถํ์ฌ ์ป๋ ๊ฒฐ๊ณผ๋ฌผ์ ํน์ง ๋งต(Feature Map) ์ด๋ผ๊ณ ํฉ๋๋ค.
|
58 |
+
|
59 |
+
- ํ๋ง ๊ณ์ธต (Pooling Layer)
|
60 |
+
์์ ๋ง๋ ๋งต์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์์ฝ๋จ๊ณ ์
๋๋ค.
|
61 |
+
์ต๋ ํ๋ง(Max Pooling)์ ํน์ ์์ญํค์ ๊ฐ์ฅ ์ค์ํ ํน์ง(๊ฐ์ฅ ํฐ ๊ฐ)๋ง ๋จ๊ฒจ ๊ณ์ฐ๋์ ์ค์ด๊ณ , ๋ชจ๋ธ์ด ํน์ง์ ๋ฏธ์ธํ ์์น ๋ณํ์ ๋ ๋ฏผ๊ฐํด ํ๋๋ก ๋ง๋ญ๋๋ค.
|
62 |
+
|
63 |
+
- ์์ ์ฐ๊ฒฐ ๊ณ์ธต (Dense Layer)
|
64 |
+
์ถ์ถ๋ ํน์ง๋ค์ ์ข
ํฉํ์ฌ ์ต์ข
์ ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ์ด๋ค ํด๋์ค์ ์ํ๋์ง ๋ถ๋ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
|
65 |
+
|
66 |
+
---
|
67 |
+
|
68 |
+
## 2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
69 |
+
์ด์ , ์์ ์ค๋ช
ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก, ์ค์ TensorFlow Keras ์ฝ๋๋ฅผ ํตํด์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๊ฐํด ๋ด
์๋ค.
|
70 |
+
๋ค์์, Keras๋ก ๊ตฌํํ CNN ๋ชจ๋ธ ์ํคํ
์ณ ์
๋๋ค.
|
71 |
+
```python
|
72 |
+
import tensorflow as tf
|
73 |
+
from tensorflow import keras
|
74 |
+
|
75 |
+
# ๋ชจ๋ธ ์ํคํ
์ฒ ์ ์
|
76 |
+
model = keras.Sequential([
|
77 |
+
# Input: (28, 28, 1) ์ด๋ฏธ์ง
|
78 |
+
# ์ฒซ ๋ฒ์งธ Conv-Pool ๋ธ๋ก
|
79 |
+
keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)),
|
80 |
+
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
81 |
+
|
82 |
+
# ๋ ๋ฒ์งธ Conv-Pool ๋ธ๋ก
|
83 |
+
keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
|
84 |
+
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
85 |
+
|
86 |
+
# ๋ถ๋ฅ๊ธฐ(Classifier)
|
87 |
+
keras.layers.Flatten(),
|
88 |
+
keras.layers.Dropout(0.5),
|
89 |
+
keras.layers.Dense(10, activation="softmax"),
|
90 |
+
])
|
91 |
+
```
|
92 |
+
์ด์ , ์์ ์ค๋ช
ํ๋ ์ด๋ก ์ด ์ด ์ฝ๋์ ์ด๋ป๊ฒ ๋
น์์๋์ง ์์๋ด
์๋ค.
|
93 |
+
|
94 |
+
- **ํฉ์ฑ๊ณฑ ๊ณ์ธต(Conv2D)**
|
95 |
+
```python
|
96 |
+
keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1))
|
97 |
+
```
|
98 |
+
์ด ์ฝ๋๋ฅผ ํตํด์, ํฉ์ฑ๊ณฑ ๊ณ์ธต์ ํ์ฑ, ๋ค์ ์์ด๋์ด๋ฅผ ๊ตฌํํฉ๋๋ค.
|
99 |
+
1. ์ง์ญ ์์ฉ์์ญ
|
100 |
+
```kernel_size(3, 3)```์ ํตํด์ ์ด๋ฏธ์ง ์ ์ฒด๊ฐ ์๋ 3 * 3 ํฌ๊ธฐ์ ์์ ์์ญ๋ง ๋ณด๋๋ก ๋ง๋ญ๋๋ค.
|
101 |
+
์ด๋ ๊ฒ, ์ง์ญ์ ์์ฉ์์ญ์ ๋ง๋ญ๋๋ค
|
102 |
+
|
103 |
+
2. ํ๋ผ๋ฏธํฐ ๊ณต์
|
104 |
+
```Conv2D``` ๊ณ์ธต์ 32๊ฐ์ ํํฐ๋ฅผ ์์ฑํฉ๋๋ค.
|
105 |
+
3 * 3ํํฐ๋ ๊ณ ์ ํ ํ๋ผ๋ฏธํฐ(๊ฐ์ค์น)์ธํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด ํํฐ ํ๋๊ฐ ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ์ค์บํฉ๋๋ค.
|
106 |
+
๋ง์ฝ, ํ๋ผ๋ฏธํฐ ๊ณต์ ๊ฐ ์๋ค๋ฉด, ๊ฐ 3 * 3 ์์น๋ง๋ค ๋ณ๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ํฌ๊ธฐ๊ฐ ์์ฒญ ์ปค์ง๋๋ค.
|
107 |
+
ํ์ง๋ง, ํ๋ผ๋ฏธํฐ ๊ณต์ ๋๋ถ์, ์ด ๊ฒฝ์ฐ์์ ```(3 * 3 * 1 +1) * 32 = 320``` ๊ฐ์ ํ๋ผ๋ฏธํฐ ๋ง์ผ๋ก ์ด๋ฏธ์ง ์ ์ฒด์ ํน์ง์ ์ถ์ถํ ์ ์์ต๋๋ค.
|
108 |
+
|
109 |
+
- **ํ๋ง ๊ณ์ธต(MaxPooling2D)**
|
110 |
+
```python
|
111 |
+
keras.layers.MaxPooling2D(pool_size=(2, 2))
|
112 |
+
```
|
113 |
+
์์ ํฉ์ฑ๊ณฑ ๊ณ์ธต์ด ์์ฑํ ํน์ง๋งต์ 2* 2 ํฌ๊ธฐ์ ์์ญ์ผ๋ก ๋๋๊ณ , ๊ฐ ์์ญ์์ ๊ฐ์ฅ ํฐ ๊ฐ๋ง ๋จ๊ธฐ๋ผ๏ฟฝ๏ฟฝ๏ฟฝ ์๋ฏธ์
๋๋ค.
|
114 |
+
์ด๋ฅผ ํตํด ๋งต ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋๋ **๋ค์ด ์ํ๋ง**์ด ์ผ์ด๋๊ณ , ๊ณ์ฐ ํจ์จ์ฑ์ด ๋์์ ธ ๋ชจ๋ธ ํ์ต์ด ๋ ๊ฐ๋ฒผ์ ์ง๋๋ค.
|
115 |
+
|
116 |
+
- **์์ ์ฐ๊ฒฐ ๊ณ์ธต(Dense Layer)**
|
117 |
+
```python
|
118 |
+
keras.layers.Flatten()
|
119 |
+
keras.layers.Dense(10, activation="softmax")
|
120 |
+
```
|
121 |
+
์ต์ข
๋ถ๋ฅ๊ธฐ ์ด๋ฉฐ, ์์ ์ฐ๊ฒฐ๊ณ์ธต ์
๋๋ค.
|
122 |
+
1. ```keras.layers.Flatten()```
|
123 |
+
์์ ์ฐ๊ฒฐ๊ณ์ธต์ 1์ฐจ์ ๋ฐฑํฐ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์, Flastten ๊ณ์ธต์ด ๋จผ์ ๋ค์ด์ 2์ฐจ์ ํํ์ ํน์ง ๋งต์ ํ ์ค๋ก ํผ์ณ์ค๋๋ค.
|
124 |
+
|
125 |
+
2. ```keras.layers.Dense(10, activation="softmax")```
|
126 |
+
์ด ์ฝ๋๊ฐ ์์ ์ฐ๊ฒฐ๊ณ์ธต์ด๋ฉฐ, ๋ณดํต Dense Layer ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
|
127 |
+
ํน์ง๋ฐฑํฐ๋ฅผ ์
๋ ฅ๋ฐ์ 10๊ฐ์ ํด๋์ค ์ค ์ด๋ ํด๋์ค์ ํ ๋นํ ์ง ์ต์ข
์ ์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค.
|
128 |
+
```activation="softmax"```๋ ๊ฐ ํด๋์ค์ ๋ํ ์์ธก๊ฐ์ 0 ๊ณผ 1 ์ฌ์ด์ ํ๋ฅ ๊ฐ์ผ๋ก ํ๊ฒ ํ์ฌ ๋ชจ๋ ํ๋ฅ ์ ํฉ์ด 1์ด ๋๋๋ก ๋ง๋ค์ด ์ค๋๋ค.
|
129 |
+
|
130 |
+
---
|
131 |
+
|
132 |
+
## 3. ์ง์ CNN ๊ตฌํํด ๋ณด๊ธฐ
|
133 |
+
์ด์ , ์ง์ CNN ํ์ต ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ตฌํํด ๋ด
์๋ค.
|
134 |
+
|
135 |
+
**1๋จ๊ณ. ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ**
|
136 |
+
๋ชจ๋ธ์ด ํ์ตํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ค๋๋ค.
|
137 |
+
์ด๋ฒ์, ์ฝ๊ฒ ๋ถ๋ฌ์ฌ ์ ์๋ MNIST ์๊ธ์จ ์ซ์ ๋ฐ์ดํฐ์
์ ๊ฐ์ ธ์ ์ ์ ํ ํํ๋ก ์ ์ฒ๋ฆฌ ํ๊ฒ ์ต๋๋ค.
|
138 |
+
|
139 |
+
```python
|
140 |
+
import numpy as np
|
141 |
+
import tensorflow as tf
|
142 |
+
from tensorflow import keras
|
143 |
+
from keras import layers
|
144 |
+
|
145 |
+
# Keras ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด MNIST ๋ฐ์ดํฐ์
์ ์์ฝ๊ฒ ๋ถ๋ฌ์ต๋๋ค.
|
146 |
+
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
|
147 |
+
|
148 |
+
# ์ ๊ทํ: ํฝ์
๊ฐ์ ๋ฒ์๋ฅผ 0~255์์ 0~1 ์ฌ์ด๋ก ์กฐ์ ํ์ฌ ํ์ต ์์ ์ฑ ๋ฐ ์๋๋ฅผ ๋์
๋๋ค.
|
149 |
+
x_train = x_train.astype("float32") / 255.0
|
150 |
+
x_test = x_test.astype("float32") / 255.0
|
151 |
+
|
152 |
+
# ์ฑ๋ ์ฐจ์ ์ถ๊ฐ: ํ๋ฐฑ ์ด๋ฏธ์ง(์ฑ๋ 1)์ ์ฐจ์์ ๋ช
์์ ์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
|
153 |
+
x_train = np.expand_dims(x_train, -1)
|
154 |
+
x_test = np.expand_dims(x_test, -1)
|
155 |
+
|
156 |
+
# ๋ ์ด๋ธ ์-ํซ ์ธ์ฝ๋ฉ: ์ซ์ '5'๋ฅผ [0,0,0,0,0,1,0,0,0,0] ํํ์ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค.
|
157 |
+
num_classes = 10
|
158 |
+
y_train = keras.utils.to_categorical(y_train, num_classes)
|
159 |
+
y_test = keras.utils.to_categorical(y_test, num_classes)
|
160 |
+
```
|
161 |
+
|
162 |
+
**2๋จ๊ณ. ๋ชจ๋ธ ์ปดํ์ผ**
|
163 |
+
๋ชจ๋ธ ์ํคํ
์ณ๋ฅผ ์ ์ํ๊ณ ๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ต์ํฌ์ง์ ๋ํด ์ ํฉ๋๋ค.
|
164 |
+
```python
|
165 |
+
model = keras.Sequential([
|
166 |
+
keras.Input(shape=(28, 28, 1)), # ์
๋ ฅ ๋ ์ด์ด
|
167 |
+
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
|
168 |
+
layers.MaxPooling2D(pool_size=(2, 2)),
|
169 |
+
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
|
170 |
+
layers.MaxPooling2D(pool_size=(2, 2)),
|
171 |
+
layers.Flatten(),
|
172 |
+
layers.Dropout(0.5),
|
173 |
+
layers.Dense(num_classes, activation="softmax")
|
174 |
+
])
|
175 |
+
|
176 |
+
model.compile(
|
177 |
+
# ์์ค ํจ์(Loss Function): ๋ชจ๋ธ์ ์์ธก์ด ์ ๋ต๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ธก์ ํฉ๋๋ค.
|
178 |
+
loss="categorical_crossentropy",
|
179 |
+
# ์ตํฐ๋ง์ด์ (Optimizer): ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
|
180 |
+
optimizer="adam",
|
181 |
+
# ํ๊ฐ์งํ(Metrics): ํ๋ จ ๊ณผ์ ์ ๋ชจ๋ํฐ๋งํ ์งํ๋ก, ์ ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
|
182 |
+
metrics=["accuracy"]
|
183 |
+
)
|
184 |
+
```
|
185 |
+
|
186 |
+
**3๋จ๊ณ. ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ**
|
187 |
+
```model.fit()```ํจ์๋ฅผ ํตํด์ ํ์ต์ ์์ํ๊ณ , ํ์ต์ด ๋๋ ํ ```model.evaluate()```๋ก ์ต์ข
์ฑ๋ฅ์ ํ์ธํฉ๋๋ค.
|
188 |
+
```python
|
189 |
+
batch_size = 128
|
190 |
+
epochs = 15
|
191 |
+
|
192 |
+
# ๋ชจ๋ธ ํ์ต ์คํ
|
193 |
+
history = model.fit(
|
194 |
+
x_train, y_train,
|
195 |
+
batch_size=batch_size,
|
196 |
+
epochs=epochs,
|
197 |
+
validation_data=(x_test, y_test)
|
198 |
+
)
|
199 |
+
|
200 |
+
# ํ์ต ์๋ฃ ํ ์ต์ข
์ฑ๋ฅ ํ๊ฐ
|
201 |
+
score = model.evaluate(x_test, y_test, verbose=0)
|
202 |
+
print(f"\nTest loss: {score[0]:.4f}")
|
203 |
+
print(f"Test accuracy: {score[1]:.4f}")
|
204 |
+
```
|
205 |
+
|
206 |
+
**4๋จ๊ณ. ํ์ต๋ ๋ชจ๋ธ ์ ์ฅํ๊ธฐ**
|
207 |
+
๋ชจ๋ธ์ ์ ์ฅํ๊ณ , ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํฉ๋๋ค.
|
208 |
+
```python
|
209 |
+
# ๋ชจ๋ธ์ ๊ตฌ์กฐ, ๊ฐ์ค์น, ํ์ต ์ค์ ์ ๋ชจ๋ '.keras' ํ์ผ ํ๋์ ์ ์ฅํฉ๋๋ค.
|
210 |
+
model.save("my_keras_model.keras")
|
211 |
+
print("\nModel saved to my_keras_model.keras")
|
212 |
+
```
|
213 |
+
|
214 |
+
์ ๋จ๊ณ๋ฅผ ์ ๋ถ ์ํํ ๋ชจ๋ธ์ด ์ง๊ธ ์ด ํ๊น
ํ์ด์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ด์๋ ๋ชจ๋ธ์
๋๋ค. ์ด์ด์, ๋ชจ๋ธ์ ์ฌ์ฉํด ๋ณผ ๋, ์ ์ฝ๋๋ฅผ์ ์ง์ ์คํํ์ง ๋ง๊ณ , ๋ค์ ์ฝ๋๋ฅผ ์คํ์์ผ ์ฃผ์ธ์!
|
215 |
+
๋ง์ผ, ์ ์ฝ๋๋ฅผ ํตํด ์ง์ ๋ฅ๋ฌ๋์ ์์ผญ๊ณ ์ถ์ผ์๋ค๋ฉด, Files์
|
216 |
+
train.py๋ฅผ ์คํ์์ผ ์ฃผ์ธ์!
|
217 |
+
|
218 |
+
**5๋จ๊ณ. ๋ชจ๋ธ ์ฌ์ฉํด ๋ณด๊ธฐ**
|
219 |
+
์์ ๋จ๊ณ๋ค์ ๊ฑฐ์ณ ์์ฑํ ๋ชจ๋ธ์ด ์ด ํ๊น
ํ์ด์ค ํ์ด์ง์ ์ฌ๋ผ๊ฐ ์์ต๋๋ค.
|
220 |
+
์ด์ , ์ด ํ๊น
ํ์ด์ค ํ์ด์ง์ ๋ชจ๋ธ์ ๋ถ๋ฌ์์, ์ง์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
|
221 |
+
Files์ test.py๋ฅผ ์คํ์์ผ ๋ณด์ธ์!!
|
222 |
+
์ง์ ์ค๋นํ ์ซ์ ์๊ธ์จ๋ฅผ ๋ชจ๋ธ์ ์
๋ ฅ์ผ๋ก ๋ฃ์ผ๋ฉด, ๊ทธ ์ซ์๊ฐ ์ด๋ค ์ซ์์ธ์ง ๋ง์ถฐ์ค ๊ฒ๋๋ค!!
|
223 |
+
์ฝ๋ ์คํ์ ์ํด์, ์ด ์ข
์์ฑ์ ์ค์นํด์ผ ํฉ๋๋ค.
|
224 |
+
cmd ์ฐฝ์ ์ด๊ณ , ์ด ์ฝ๋๋ฅผ ๋ฃ๊ณ ์คํํ์ฌ ๋จผ์ ์ข
์์ฑ์ ๋ฐ์์ฃผ์ธ์
|
225 |
+
```bash
|
226 |
+
pip install tensorflow huggingface_hub Pillow numpy
|
227 |
+
```
|
228 |
+
## 4. ๋๋ง์ CNN ๋ชจ๋ธ ๋ง๋ค๊ธฐ
|
229 |
+
์ด์ , ์ฑ๋ฅ์ ๋ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ํด, ๋ ์ํ๋ ๋ชฉ์ ์ ๋ง๊ฒ ๋ชจ๋ธ์ ์์ ํ ์ฐจ๋ก์
๋๋ค.
|
230 |
+
|
231 |
+
- **ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋**
|
232 |
+
๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ batch_size, epochs, ์ตํฐ๋์ด์ ์ leaarning_rate๋ฑ์ ์กฐํฉํ์ฌ ์ต์ ํ ํฉ๋๋ค.
|
233 |
+
๋ค์ ์ฝ๋๋ฅผ ๊ฑด๋๋ ค์ ์์ ํฉ๋๋ค.
|
234 |
+
```python
|
235 |
+
# ์: Adam ์ตํฐ๋ง์ด์ ์ ํ์ต๋ฅ (learning_rate)์ ์ง์ ์ค์
|
236 |
+
optimizer = keras.optimizers.Adam(learning_rate=0.001)
|
237 |
+
model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"])
|
238 |
+
```
|
239 |
+
|
240 |
+
- **๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ**
|
241 |
+
๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ํด์, ```Conv2D-MaxPooling2D``` ๋ธ๋ก์ ๋ ๊น๊ฒ, ```Conv2D``` ๊ณ์ธต์ ํํฐ ์๋ฅผ ๋๋ ค ๋ ํ๋ถํ๊ฒ ํ ์ ์์ต๋๋ค.
|
242 |
+
```python
|
243 |
+
model = keras.Sequential([
|
244 |
+
keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)),
|
245 |
+
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
246 |
+
# ๋ธ๋ก ์ถ๊ฐ!
|
247 |
+
keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
|
248 |
+
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
249 |
+
# ํํฐ ์๋ฅผ ๋๋ฆฐ ๋ธ๋ก ์ถ๊ฐ!
|
250 |
+
keras.layers.Conv2D(128, kernel_size=(3, 3), activation="relu"),
|
251 |
+
keras.layers.MaxPooling2D(pool_size=(2, 2)),
|
252 |
+
|
253 |
+
keras.layers.Flatten(),
|
254 |
+
keras.layers.Dense(128, activation='relu'), # Dense ์ธต ์ถ๊ฐ
|
255 |
+
keras.layers.Dropout(0.5),
|
256 |
+
keras.layers.Dense(10, activation="softmax"),
|
257 |
+
])
|
258 |
+
```
|
259 |
+
|
260 |
+
- **์ ์ดํ์ต**
|
261 |
+
์์ฃผ ํฐ ๋ฐ์ดํฐ์
์ผ๋ก ํ์ต๋ ์ด๋ฏธ ๊ฐ๋ ฅํ ๋ชจ๋ธ์ ๊ฐ์ ธ์, ๊ทธ ๋ชจ๋ธ์ด ํ์ตํ ์ด๋ฏธ์ง ํน์ง์ถ์ถ๋ฅ๋ ฅ๋ง ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์
๋๋ค.
|
262 |
+
์ ์ ๋ฐ์ดํฐ๋ก๋ ๋์ ์ฑ๋ฅ์ ๋ผ ์ ์์ต๋๋ค.
|
263 |
+
```python
|
264 |
+
# Keras์์ ์ ๊ณตํ๋ ์ฌ์ ํ์ต๋ VGG16 ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ (๋ถ๋ฅ๊ธฐ๋ ์ ์ธ)
|
265 |
+
base_model = keras.applications.VGG16(
|
266 |
+
weights='imagenet', # ImageNet์ผ๋ก ์ฌ์ ํ์ต๋ ๊ฐ์ค์น ์ฌ์ฉ
|
267 |
+
include_top=False, # ๋ถ๋ฅ๊ธฐ(Dense ์ธต)๋ ์ ์ธ
|
268 |
+
input_shape=(32, 32, 3) # VGG16์ ์ต์ 32x32 ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์
|
269 |
+
)
|
270 |
+
|
271 |
+
# ๋ถ๋ฌ์จ ๋ชจ๋ธ์ ๊ฐ์ค์น๋ ๊ณ ์ (freeze)
|
272 |
+
base_model.trainable = False
|
273 |
+
|
274 |
+
# ์๋ก์ด ๋ถ๋ฅ๊ธฐ ์ถ๊ฐ
|
275 |
+
model = keras.Sequential([
|
276 |
+
base_model,
|
277 |
+
keras.layers.Flatten(),
|
278 |
+
keras.layers.Dense(256, activation='relu'),
|
279 |
+
keras.layers.Dropout(0.5),
|
280 |
+
keras.layers.Dense(10, activation='softmax') # ๋์ ๋ฌธ์ ์ ๋ง๋ ์ถ๋ ฅ์ธต
|
281 |
+
])
|
282 |
+
|
283 |
+
# ์๋ก ์ถ๊ฐํ ๋ถ๋ฅ๊ธฐ ๋ถ๋ถ๋ง ํ์ต
|
284 |
+
model.compile(...)
|
285 |
+
model.fit(...)
|
286 |
+
```
|
287 |
+
|
288 |
+
## 5. ๊ฒฐ๋ก
|
289 |
+
์ค๋์, ์ด๋ ๊ฒ CNN ๋ชจ๋ธ์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ดค์ต๋๋ค.
|
290 |
+
์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ํนํ๋ CNN์ ๋์ค์ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ์ด ๋์ค๋ฉด์ Vit๋ผ๋ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง๋๋ฐ ํฐ ๊ธฐ์ฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค.
|
291 |
+
์ด๋ ๋ฏ ๊ทผ๋ณธ ๋์น๋ CNN ๋ง์ด ์ฌ๋ํด ์ฃผ์ธ์!!
|
292 |
+
๋ค์์๋ RNN๋ชจ๋ธ๋ก ๋์์ค๊ฒ ์ต๋๋ค
|
293 |
์ค๋๋ ์ข์ํ๋ฃจ ๋ณด๋ด์ธ์ฉ!!
|