Keras
Keras
OneclickAI commited on
Commit
305769a
Β·
verified Β·
1 Parent(s): bde6fe0
Files changed (6) hide show
  1. .gitattributes +1 -0
  2. README.md +226 -0
  3. config.json +20 -0
  4. my_keras_model.keras +3 -0
  5. test.py +33 -0
  6. train.py +60 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ my_keras_model.keras filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,226 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
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
+ # λͺ¨λΈμ˜ ꡬ쑰, οΏ½οΏ½μ€‘μΉ˜, ν•™μŠ΅ 섀정을 λͺ¨λ‘ '.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
+
225
+
226
+ ## 4. λ‚˜λ§Œμ˜ CNN λͺ¨λΈ λ§Œλ“€κΈ°
config.json ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_id": "keras-model",
3
+ "architectures": [
4
+ "CNN"
5
+ ],
6
+ "model_type": "Keras",
7
+ "pipeline_tag": "image-classification",
8
+ "task_tags": [
9
+ "image-classification"
10
+ ],
11
+ "tags": [
12
+ "tensorflow",
13
+ "keras",
14
+ "mnist",
15
+ "cnn"
16
+ ],
17
+ "datasets": [
18
+ "mnist"
19
+ ]
20
+ }
my_keras_model.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:abc240116caa1e68bc7a2006d6725bf11170157e0e43c3d2e2b88600b810fafa
3
+ size 452579
test.py ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from huggingface_hub import hf_hub_download
2
+ import tensorflow as tf
3
+ from tensorflow import keras
4
+
5
+ # Replace 'your-username/your-model-name' with your actual Hugging Face model repository ID.
6
+ repo_id = "your-username/your-model-name"
7
+ # Replace 'my_keras_model.keras' with the name of the file you uploaded.
8
+ filename = "my_keras_model.keras"
9
+
10
+ # Download the model file from the Hugging Face Hub.
11
+ model_path = hf_hub_download(repo_id=repo_id, filename=filename)
12
+
13
+ # Load the model using Keras's built-in function.
14
+ # The 'safe_mode=False' argument is often necessary when loading models saved from older TensorFlow versions
15
+ # or if the model contains custom layers.
16
+ model = keras.models.load_model(model_path, safe_mode=False)
17
+
18
+ # Now you can use the loaded model for inference.
19
+ # Example: Load a single MNIST test image and make a prediction.
20
+ (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
21
+ x_test = x_test.astype("float32") / 255.0
22
+ x_test = tf.expand_dims(x_test, -1)
23
+ image_to_predict = x_test[0:1]
24
+
25
+ # Get the model's prediction.
26
+ predictions = model.predict(image_to_predict)
27
+
28
+ # Print the predicted class (the one with the highest probability).
29
+ predicted_class = tf.argmax(predictions[0]).numpy()
30
+ print(f"Predicted class: {predicted_class}")
31
+
32
+ # Display the model summary to confirm it's loaded correctly.
33
+ model.summary()
train.py ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import tensorflow as tf
3
+ from tensorflow import keras
4
+ from keras import layers
5
+
6
+ # Keras 라이브러리λ₯Ό 톡해 MNIST 데이터셋을 μ†μ‰½κ²Œ λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.
7
+ (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
8
+
9
+ # μ •κ·œν™”: ν”½μ…€ κ°’μ˜ λ²”μœ„λ₯Ό 0~255μ—μ„œ 0~1 μ‚¬μ΄λ‘œ μ‘°μ •ν•˜μ—¬ ν•™μŠ΅ μ•ˆμ •μ„± 및 속도λ₯Ό λ†’μž…λ‹ˆλ‹€.
10
+ x_train = x_train.astype("float32") / 255.0
11
+ x_test = x_test.astype("float32") / 255.0
12
+
13
+ # 채널 차원 μΆ”κ°€: 흑백 이미지(채널 1)의 차원을 λͺ…μ‹œμ μœΌλ‘œ μΆ”κ°€ν•©λ‹ˆλ‹€.
14
+ x_train = np.expand_dims(x_train, -1)
15
+ x_test = np.expand_dims(x_test, -1)
16
+
17
+ # λ ˆμ΄λΈ” 원-ν•« 인코딩: 숫자 '5'λ₯Ό [0,0,0,0,0,1,0,0,0,0] ν˜•νƒœμ˜ λ²‘ν„°λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
18
+ num_classes = 10
19
+ y_train = keras.utils.to_categorical(y_train, num_classes)
20
+ y_test = keras.utils.to_categorical(y_test, num_classes)
21
+
22
+ model = keras.Sequential([
23
+ keras.Input(shape=(28, 28, 1)), # μž…λ ₯ λ ˆμ΄μ–΄
24
+ layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
25
+ layers.MaxPooling2D(pool_size=(2, 2)),
26
+ layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
27
+ layers.MaxPooling2D(pool_size=(2, 2)),
28
+ layers.Flatten(),
29
+ layers.Dropout(0.5),
30
+ layers.Dense(num_classes, activation="softmax")
31
+ ])
32
+
33
+ model.compile(
34
+ # 손싀 ν•¨μˆ˜(Loss Function): λͺ¨λΈμ˜ 예츑이 μ •λ‹΅κ³Ό μ–Όλ§ˆλ‚˜ λ‹€λ₯Έμ§€ μΈ‘μ •ν•©λ‹ˆλ‹€.
35
+ loss="categorical_crossentropy",
36
+ # μ˜΅ν‹°λ§ˆμ΄μ €(Optimizer): 손싀을 μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ λͺ¨λΈμ˜ κ°€μ€‘μΉ˜λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
37
+ optimizer="adam",
38
+ # ν‰κ°€μ§€ν‘œ(Metrics): ν›ˆλ ¨ 과정을 λͺ¨λ‹ˆν„°λ§ν•  μ§€ν‘œλ‘œ, 정확도λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
39
+ metrics=["accuracy"]
40
+ )
41
+
42
+ batch_size = 128
43
+ epochs = 15
44
+
45
+ # λͺ¨λΈ ν•™μŠ΅ μ‹€ν–‰
46
+ history = model.fit(
47
+ x_train, y_train,
48
+ batch_size=batch_size,
49
+ epochs=epochs,
50
+ validation_data=(x_test, y_test)
51
+ )
52
+
53
+ # ν•™μŠ΅ μ™„λ£Œ ν›„ μ΅œμ’… μ„±λŠ₯ 평가
54
+ score = model.evaluate(x_test, y_test, verbose=0)
55
+ print(f"\nTest loss: {score[0]:.4f}")
56
+ print(f"Test accuracy: {score[1]:.4f}")
57
+
58
+ # λͺ¨λΈμ˜ ꡬ쑰, κ°€μ€‘μΉ˜, ν•™μŠ΅ 섀정을 λͺ¨λ‘ '.keras' 파일 ν•˜λ‚˜μ— μ €μž₯ν•©λ‹ˆλ‹€.
59
+ model.save("my_keras_model.keras")
60
+ print("\nModel saved to my_keras_model.keras")