Instructions to use OneclickAI/CNN_test_Model with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Keras
How to use OneclickAI/CNN_test_Model with Keras:
# Available backend options are: "jax", "torch", "tensorflow". import os os.environ["KERAS_BACKEND"] = "jax" import keras model = keras.saving.load_model("hf://OneclickAI/CNN_test_Model") - Notebooks
- Google Colab
- Kaggle
| license: apache-2.0 | |
| ์๋ ํ์ธ์ Oneclick AI ์ ๋๋ค!! | |
| ์ค๋์, CNN ๋ชจ๋ธ์ ๋ํด์ ๊น๊ฒ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊น ํฉ๋๋ค. | |
| ๋ฅ๋ฌ๋์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ ์ด์ ๊ฐ ๋ฐ๋ก CNN์ ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง (Convolutional Neural Network, CNN) ๋๋ถ์ธ๋ฐ์, ์ค๋์ ์ด ์ ๊ฒฝ๋ง์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, CNN์ ์ด๋ป๊ฒ ์ฌ์ง ์์ ์ซ์๋ฅผ ๊ตฌ๋ถํ ์ ์๋์ง ์์๋ด ์๋ค. | |
| --- | |
| ## ๋ชฉ์ฐจ | |
| 1. CNN ํต์ฌ ์๋ฆฌ ํ์ ํ๊ธฐ | |
| - ์ ์ด๋ฏธ์ง์ CNN์ ์ฌ์ฉํ ๊น? | |
| - CNN์ ํต์ฌ : ์ง์ญ ์์ฉ ์์ญ๊ณผ ํ๋ผ๋ฏธํฐ ๊ณต์ | |
| - CNN์ ์ฃผ์ ๊ตฌ์ฑ ์์ | |
| 2. ์ํคํ ์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ | |
| - keras๋ก ๊ตฌํํ CNN ๋ชจ๋ธ ์ํคํ ์ณ | |
| - model.summary()๋ก ๊ตฌ์กฐ ํ์ธํ๊ธฐ | |
| 3. ์ง์ CNN ๊ตฌํํด ๋ณด๊ธฐ | |
| - 1๋จ๊ณ : ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ | |
| - 2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ | |
| - 3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ | |
| - 4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅํ๊ธฐ | |
| - 5๋จ๊ณ : ๋ชจ๋ธ ์ฌ์ฉํ๊ธฐ | |
| 4. ๋๋ง์ CNN ๋ชจ๋ธ ๋ง๋ค์ด๋ณด๊ธฐ | |
| - ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋ | |
| - ๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝํ๊ธฐ | |
| - ์ ์ดํ์ต์ผ๋ก ์ฑ๋ฅ ๊ทน๋ํ ํ๊ธฐ | |
| 5. ๊ฒฐ๋ก | |
| --- | |
| ## 1. CNN ํต์ฌ์๋ฆฌ ํ์ ํ๊ธฐ | |
| ๋ค์ด๊ฐ๊ธฐ ์์, CNN ์ด ์ด๋ค ์๋ฆฌ๋ก ์ด๋ฏธ์ง๋ฅผ ์ดํดํ๋์ง ๋จผ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. | |
| **์ ์ด๋ฏธ์ง์ CNN์ ์ฌ์ฉํ ๊น??** | |
| ๋จ์ํ ์ ๊ฒฝ๋ง(Fully Connected Layer)์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅํ๋ ค๋ฉด, 2์ฐจ์์ธ ์ด๋ฏธ์ง๋ฅผ 1์ฐจ์์ ๊ธด ๋ฐ์ดํฐ๋ก ํผ์น๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ด ๊ผญ ํ์ํฉ๋๋ค. | |
| ์ด ๊ณผ์ ์์ ํฝ์ ๊ฐ์ ๊ณต๊ฐ์ ์ธ ์ ๋ณด๊ฐ ์ ๋ถ ํ๊ดด๋ฉ๋๋ค. | |
| ์ด๋ ์ด๋ค ํฝ์ ์ด ์๋ก ์ด์ํด ์๋์ง ์ ์ ์์ด์ ธ์ ๋์ด ์ฝ ์์ ์๋ค๋ ์์น์ ๋ณด ๊ฐ์ ๋ด์ฉ์ด ๊ฐ๋ผ์ ๋ฒ๋ฆฐ๋ค๋ ์๋ฏธ ์ ๋๋ค. | |
| CNN์ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๊ฐ์ ์์ ๊ฒฝ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฐฉํ์ฌ ์ค๊ณ๋์์ต๋๋ค. | |
| **CNN์ ํต์ฌ ์์ด๋์ด** | |
| ์ด๊ฒ์ด ๋ฐ๋ก ์ง์ญ์ ์์ฉ์์ญ๊ณผ ํ๋ผ๋ฏธํฐ ๊ณต์ ์ ๋๋ค. | |
| - ์ง์ญ์ ์์ฉ ์์ญ(Local Receptive Fields) | |
| ์ ๊ฒฝ๋ง์ ๊ฐ ๋ด๋ฐ์ด ์ด๋ฏธ์ง ์ ์ฒด๊ฐ ์๋, ์์ ์ผ๋ถ์๋ง ์ฐ๊ฒฐ๋ฉ๋๋ค. | |
| ์ด๋ ์ ์ฒด ํฝ์ ์ ๋ํด์๊ฐ ์๋ ์์๋ฅผ ๋ค๋ฉด 3 * 3 ํฝ์ ์๋ง ์ ์ฉ๋๋ ๋ฐฉ์์ธ๋ฐ์, ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ ์ด๋ฏธ์ง์ ์ ์ฒด ๋งฅ๋ฝ๋ณด๋ค ์ , ๋ชจ์๋ฆฌ, ์ง๊ฐ๊ณผ ๊ฐ์ ์ง์ญ์ ์ธ ํจํด์ ๋จผ์ ํ์ตํ๊ฒ ๋ฉ๋๋ค. | |
| - ํ๋ผ๋ฏธํฐ ๊ณต์ (Parameter Sharing) | |
| CNN์ ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ํํฐ๋ฅผ ํตํด์ ์ค์บํ๋ ๋๋์ผ๋ก ํ์ตํฉ๋๋ค. | |
| ๋ฐ๋ผ์, ํ๋ฒ ์ด๋ฏธ์ง์ ํน์ง์ ํ์ตํ๋ฉด, ์ด๋ฏธ์ง์ ๋ชจ๋ ์์น์์ ํด๋น ํน์ง์ ๊ฐ์งํ ์ ์์ต๋๋ค. | |
| ์ด๋ฅผ ํตํด์ ํ์ตํ ํ๋ผ๋ฏธํฐ ์๋ฅผ ๋ง์ด ์ค์ผ ์ ์์ต๋๋ค. | |
| **CNN์ ์ฃผ์ ๊ตฌ์ฑ ์์** | |
| ์์ ์์ด๋์ด๋ฅผ ๋ฐํ์ผ๋ก, CNN์ ๋ค์ 3๊ฐ์ง์ ๊ณ์ธต์ ์กฐํฉํด์ ๋ง๋ญ๋๋ค. | |
| - ํฉ์ฑ๊ณฑ ๊ณ์ธต (Convolutional Layer) | |
| ํ์ต ๊ฐ๋ฅํ ํํฐ๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง์ ํน์ง์ ์ถ์ถํด ๋ ๋๋ค. | |
| edge, corner ๋ฑ์ ์ถ์ถํ์ฌ ์ป๋ ๊ฒฐ๊ณผ๋ฌผ์ ํน์ง ๋งต(Feature Map) ์ด๋ผ๊ณ ํฉ๋๋ค. | |
| - ํ๋ง ๊ณ์ธต (Pooling Layer) | |
| ์์ ๋ง๋ ๋งต์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ์์ฝ๋จ๊ณ ์ ๋๋ค. | |
| ์ต๋ ํ๋ง(Max Pooling)์ ํน์ ์์ญํค์ ๊ฐ์ฅ ์ค์ํ ํน์ง(๊ฐ์ฅ ํฐ ๊ฐ)๋ง ๋จ๊ฒจ ๊ณ์ฐ๋์ ์ค์ด๊ณ , ๋ชจ๋ธ์ด ํน์ง์ ๋ฏธ์ธํ ์์น ๋ณํ์ ๋ ๋ฏผ๊ฐํด ํ๋๋ก ๋ง๋ญ๋๋ค. | |
| - ์์ ์ฐ๊ฒฐ ๊ณ์ธต (Dense Layer) | |
| ์ถ์ถ๋ ํน์ง๋ค์ ์ข ํฉํ์ฌ ์ต์ข ์ ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ์ด๋ค ํด๋์ค์ ์ํ๋์ง ๋ถ๋ฅํ๋ ์ญํ ์ ํฉ๋๋ค. | |
| --- | |
| ## 2. ์ํคํ ์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ | |
| ์ด์ , ์์ ์ค๋ช ํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก, ์ค์ TensorFlow Keras ์ฝ๋๋ฅผ ํตํด์ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ค๊ฐํด ๋ด ์๋ค. | |
| ๋ค์์, Keras๋ก ๊ตฌํํ CNN ๋ชจ๋ธ ์ํคํ ์ณ ์ ๋๋ค. | |
| ```python | |
| import tensorflow as tf | |
| from tensorflow import keras | |
| # ๋ชจ๋ธ ์ํคํ ์ฒ ์ ์ | |
| model = keras.Sequential([ | |
| # Input: (28, 28, 1) ์ด๋ฏธ์ง | |
| # ์ฒซ ๋ฒ์งธ Conv-Pool ๋ธ๋ก | |
| keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)), | |
| keras.layers.MaxPooling2D(pool_size=(2, 2)), | |
| # ๋ ๋ฒ์งธ Conv-Pool ๋ธ๋ก | |
| keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), | |
| keras.layers.MaxPooling2D(pool_size=(2, 2)), | |
| # ๋ถ๋ฅ๊ธฐ(Classifier) | |
| keras.layers.Flatten(), | |
| keras.layers.Dropout(0.5), | |
| keras.layers.Dense(10, activation="softmax"), | |
| ]) | |
| ``` | |
| ์ด์ , ์์ ์ค๋ช ํ๋ ์ด๋ก ์ด ์ด ์ฝ๋์ ์ด๋ป๊ฒ ๋ น์์๋์ง ์์๋ด ์๋ค. | |
| - **ํฉ์ฑ๊ณฑ ๊ณ์ธต(Conv2D)** | |
| ```python | |
| keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)) | |
| ``` | |
| ์ด ์ฝ๋๋ฅผ ํตํด์, ํฉ์ฑ๊ณฑ ๊ณ์ธต์ ํ์ฑ, ๋ค์ ์์ด๋์ด๋ฅผ ๊ตฌํํฉ๋๋ค. | |
| 1. ์ง์ญ ์์ฉ์์ญ | |
| ```kernel_size(3, 3)```์ ํตํด์ ์ด๋ฏธ์ง ์ ์ฒด๊ฐ ์๋ 3 * 3 ํฌ๊ธฐ์ ์์ ์์ญ๋ง ๋ณด๋๋ก ๋ง๋ญ๋๋ค. | |
| ์ด๋ ๊ฒ, ์ง์ญ์ ์์ฉ์์ญ์ ๋ง๋ญ๋๋ค | |
| 2. ํ๋ผ๋ฏธํฐ ๊ณต์ | |
| ```Conv2D``` ๊ณ์ธต์ 32๊ฐ์ ํํฐ๋ฅผ ์์ฑํฉ๋๋ค. | |
| 3 * 3ํํฐ๋ ๊ณ ์ ํ ํ๋ผ๋ฏธํฐ(๊ฐ์ค์น)์ธํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด ํํฐ ํ๋๊ฐ ์ด๋ฏธ์ง ์ ์ฒด๋ฅผ ์ค์บํฉ๋๋ค. | |
| ๋ง์ฝ, ํ๋ผ๋ฏธํฐ ๊ณต์ ๊ฐ ์๋ค๋ฉด, ๊ฐ 3 * 3 ์์น๋ง๋ค ๋ณ๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ํฌ๊ธฐ๊ฐ ์์ฒญ ์ปค์ง๋๋ค. | |
| ํ์ง๋ง, ํ๋ผ๋ฏธํฐ ๊ณต์ ๋๋ถ์, ์ด ๊ฒฝ์ฐ์์ ```(3 * 3 * 1 +1) * 32 = 320``` ๊ฐ์ ํ๋ผ๋ฏธํฐ ๋ง์ผ๋ก ์ด๋ฏธ์ง ์ ์ฒด์ ํน์ง์ ์ถ์ถํ ์ ์์ต๋๋ค. | |
| - **ํ๋ง ๊ณ์ธต(MaxPooling2D)** | |
| ```python | |
| keras.layers.MaxPooling2D(pool_size=(2, 2)) | |
| ``` | |
| ์์ ํฉ์ฑ๊ณฑ ๊ณ์ธต์ด ์์ฑํ ํน์ง๋งต์ 2* 2 ํฌ๊ธฐ์ ์์ญ์ผ๋ก ๋๋๊ณ , ๊ฐ ์์ญ์์ ๊ฐ์ฅ ํฐ ๊ฐ๋ง ๋จ๊ธฐ๋ผ๋ ์๋ฏธ์ ๋๋ค. | |
| ์ด๋ฅผ ํตํด ๋งต ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋๋ **๋ค์ด ์ํ๋ง**์ด ์ผ์ด๋๊ณ , ๊ณ์ฐ ํจ์จ์ฑ์ด ๋์์ ธ ๋ชจ๋ธ ํ์ต์ด ๋ ๊ฐ๋ฒผ์ ์ง๋๋ค. | |
| - **์์ ์ฐ๊ฒฐ ๊ณ์ธต(Dense Layer)** | |
| ```python | |
| keras.layers.Flatten() | |
| keras.layers.Dense(10, activation="softmax") | |
| ``` | |
| ์ต์ข ๋ถ๋ฅ๊ธฐ ์ด๋ฉฐ, ์์ ์ฐ๊ฒฐ๊ณ์ธต ์ ๋๋ค. | |
| 1. ```keras.layers.Flatten()``` | |
| ์์ ์ฐ๊ฒฐ๊ณ์ธต์ 1์ฐจ์ ๋ฐฑํฐ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๊ธฐ ๋๋ฌธ์, Flastten ๊ณ์ธต์ด ๋จผ์ ๋ค์ด์ 2์ฐจ์ ํํ์ ํน์ง ๋งต์ ํ ์ค๋ก ํผ์ณ์ค๋๋ค. | |
| 2. ```keras.layers.Dense(10, activation="softmax")``` | |
| ์ด ์ฝ๋๊ฐ ์์ ์ฐ๊ฒฐ๊ณ์ธต์ด๋ฉฐ, ๋ณดํต Dense Layer ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. | |
| ํน์ง๋ฐฑํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ 10๊ฐ์ ํด๋์ค ์ค ์ด๋ ํด๋์ค์ ํ ๋นํ ์ง ์ต์ข ์ ์ผ๋ก ๊ฒฐ์ ํฉ๋๋ค. | |
| ```activation="softmax"```๋ ๊ฐ ํด๋์ค์ ๋ํ ์์ธก๊ฐ์ 0 ๊ณผ 1 ์ฌ์ด์ ํ๋ฅ ๊ฐ์ผ๋ก ํ๊ฒ ํ์ฌ ๋ชจ๋ ํ๋ฅ ์ ํฉ์ด 1์ด ๋๋๋ก ๋ง๋ค์ด ์ค๋๋ค. | |
| --- | |
| ## 3. ์ง์ CNN ๊ตฌํํด ๋ณด๊ธฐ | |
| ์ด์ , ์ง์ CNN ํ์ต ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ๊ตฌํํด ๋ด ์๋ค. | |
| **1๋จ๊ณ. ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ** | |
| ๋ชจ๋ธ์ด ํ์ตํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ค๋๋ค. | |
| ์ด๋ฒ์, ์ฝ๊ฒ ๋ถ๋ฌ์ฌ ์ ์๋ MNIST ์๊ธ์จ ์ซ์ ๋ฐ์ดํฐ์ ์ ๊ฐ์ ธ์ ์ ์ ํ ํํ๋ก ์ ์ฒ๋ฆฌ ํ๊ฒ ์ต๋๋ค. | |
| ```python | |
| import numpy as np | |
| import tensorflow as tf | |
| from tensorflow import keras | |
| from keras import layers | |
| # Keras ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด MNIST ๋ฐ์ดํฐ์ ์ ์์ฝ๊ฒ ๋ถ๋ฌ์ต๋๋ค. | |
| (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() | |
| # ์ ๊ทํ: ํฝ์ ๊ฐ์ ๋ฒ์๋ฅผ 0~255์์ 0~1 ์ฌ์ด๋ก ์กฐ์ ํ์ฌ ํ์ต ์์ ์ฑ ๋ฐ ์๋๋ฅผ ๋์ ๋๋ค. | |
| x_train = x_train.astype("float32") / 255.0 | |
| x_test = x_test.astype("float32") / 255.0 | |
| # ์ฑ๋ ์ฐจ์ ์ถ๊ฐ: ํ๋ฐฑ ์ด๋ฏธ์ง(์ฑ๋ 1)์ ์ฐจ์์ ๋ช ์์ ์ผ๋ก ์ถ๊ฐํฉ๋๋ค. | |
| x_train = np.expand_dims(x_train, -1) | |
| x_test = np.expand_dims(x_test, -1) | |
| # ๋ ์ด๋ธ ์-ํซ ์ธ์ฝ๋ฉ: ์ซ์ '5'๋ฅผ [0,0,0,0,0,1,0,0,0,0] ํํ์ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค. | |
| num_classes = 10 | |
| y_train = keras.utils.to_categorical(y_train, num_classes) | |
| y_test = keras.utils.to_categorical(y_test, num_classes) | |
| ``` | |
| **2๋จ๊ณ. ๋ชจ๋ธ ์ปดํ์ผ** | |
| ๋ชจ๋ธ ์ํคํ ์ณ๋ฅผ ์ ์ํ๊ณ ๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ต์ํฌ์ง์ ๋ํด ์ ํฉ๋๋ค. | |
| ```python | |
| model = keras.Sequential([ | |
| keras.Input(shape=(28, 28, 1)), # ์ ๋ ฅ ๋ ์ด์ด | |
| layers.Conv2D(32, kernel_size=(3, 3), activation="relu"), | |
| layers.MaxPooling2D(pool_size=(2, 2)), | |
| layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), | |
| layers.MaxPooling2D(pool_size=(2, 2)), | |
| layers.Flatten(), | |
| layers.Dropout(0.5), | |
| layers.Dense(num_classes, activation="softmax") | |
| ]) | |
| model.compile( | |
| # ์์ค ํจ์(Loss Function): ๋ชจ๋ธ์ ์์ธก์ด ์ ๋ต๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ธก์ ํฉ๋๋ค. | |
| loss="categorical_crossentropy", | |
| # ์ตํฐ๋ง์ด์ (Optimizer): ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. | |
| optimizer="adam", | |
| # ํ๊ฐ์งํ(Metrics): ํ๋ จ ๊ณผ์ ์ ๋ชจ๋ํฐ๋งํ ์งํ๋ก, ์ ํ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. | |
| metrics=["accuracy"] | |
| ) | |
| ``` | |
| **3๋จ๊ณ. ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ** | |
| ```model.fit()```ํจ์๋ฅผ ํตํด์ ํ์ต์ ์์ํ๊ณ , ํ์ต์ด ๋๋ ํ ```model.evaluate()```๋ก ์ต์ข ์ฑ๋ฅ์ ํ์ธํฉ๋๋ค. | |
| ```python | |
| batch_size = 128 | |
| epochs = 15 | |
| # ๋ชจ๋ธ ํ์ต ์คํ | |
| history = model.fit( | |
| x_train, y_train, | |
| batch_size=batch_size, | |
| epochs=epochs, | |
| validation_data=(x_test, y_test) | |
| ) | |
| # ํ์ต ์๋ฃ ํ ์ต์ข ์ฑ๋ฅ ํ๊ฐ | |
| score = model.evaluate(x_test, y_test, verbose=0) | |
| print(f"\nTest loss: {score[0]:.4f}") | |
| print(f"Test accuracy: {score[1]:.4f}") | |
| ``` | |
| **4๋จ๊ณ. ํ์ต๋ ๋ชจ๋ธ ์ ์ฅํ๊ธฐ** | |
| ๋ชจ๋ธ์ ์ ์ฅํ๊ณ , ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํฉ๋๋ค. | |
| ```python | |
| # ๋ชจ๋ธ์ ๊ตฌ์กฐ, ๊ฐ์ค์น, ํ์ต ์ค์ ์ ๋ชจ๋ '.keras' ํ์ผ ํ๋์ ์ ์ฅํฉ๋๋ค. | |
| model.save("my_keras_model.keras") | |
| print("\nModel saved to my_keras_model.keras") | |
| ``` | |
| ์ ๋จ๊ณ๋ฅผ ์ ๋ถ ์ํํ ๋ชจ๋ธ์ด ์ง๊ธ ์ด ํ๊น ํ์ด์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ค์ด์๋ ๋ชจ๋ธ์ ๋๋ค. ์ด์ด์, ๋ชจ๋ธ์ ์ฌ์ฉํด ๋ณผ ๋, ์ ์ฝ๋๋ฅผ์ ์ง์ ์คํํ์ง ๋ง๊ณ , ๋ค์ ์ฝ๋๋ฅผ ์คํ์์ผ ์ฃผ์ธ์! | |
| ๋ง์ผ, ์ ์ฝ๋๋ฅผ ํตํด ์ง์ ๋ฅ๋ฌ๋์ ์์ผญ๊ณ ์ถ์ผ์๋ค๋ฉด, Files์ | |
| train.py๋ฅผ ์คํ์์ผ ์ฃผ์ธ์! | |
| **5๋จ๊ณ. ๋ชจ๋ธ ์ฌ์ฉํด ๋ณด๊ธฐ** | |
| ์์ ๋จ๊ณ๋ค์ ๊ฑฐ์ณ ์์ฑํ ๋ชจ๋ธ์ด ์ด ํ๊น ํ์ด์ค ํ์ด์ง์ ์ฌ๋ผ๊ฐ ์์ต๋๋ค. | |
| ์ด์ , ์ด ํ๊น ํ์ด์ค ํ์ด์ง์ ๋ชจ๋ธ์ ๋ถ๋ฌ์์, ์ง์ ์ฌ์ฉํด ๋ณด๊ฒ ์ต๋๋ค. | |
| Files์ test.py๋ฅผ ์คํ์์ผ ๋ณด์ธ์!! | |
| ์ง์ ์ค๋นํ ์ซ์ ์๊ธ์จ๋ฅผ ๋ชจ๋ธ์ ์ ๋ ฅ์ผ๋ก ๋ฃ์ผ๋ฉด, ๊ทธ ์ซ์๊ฐ ์ด๋ค ์ซ์์ธ์ง ๋ง์ถฐ์ค ๊ฒ๋๋ค!! | |
| ์ฝ๋ ์คํ์ ์ํด์, ์ด ์ข ์์ฑ์ ์ค์นํด์ผ ํฉ๋๋ค. | |
| cmd ์ฐฝ์ ์ด๊ณ , ์ด ์ฝ๋๋ฅผ ๋ฃ๊ณ ์คํํ์ฌ ๋จผ์ ์ข ์์ฑ์ ๋ฐ์์ฃผ์ธ์ | |
| ```bash | |
| pip install tensorflow huggingface_hub Pillow numpy | |
| ``` | |
| ## 4. ๋๋ง์ CNN ๋ชจ๋ธ ๋ง๋ค๊ธฐ | |
| ์ด์ , ์ฑ๋ฅ์ ๋ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ํด, ๋ ์ํ๋ ๋ชฉ์ ์ ๋ง๊ฒ ๋ชจ๋ธ์ ์์ ํ ์ฐจ๋ก์ ๋๋ค. | |
| - **ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋** | |
| ๋ชจ๋ธ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ batch_size, epochs, ์ตํฐ๋์ด์ ์ leaarning_rate๋ฑ์ ์กฐํฉํ์ฌ ์ต์ ํ ํฉ๋๋ค. | |
| ๋ค์ ์ฝ๋๋ฅผ ๊ฑด๋๋ ค์ ์์ ํฉ๋๋ค. | |
| ```python | |
| # ์: Adam ์ตํฐ๋ง์ด์ ์ ํ์ต๋ฅ (learning_rate)์ ์ง์ ์ค์ | |
| optimizer = keras.optimizers.Adam(learning_rate=0.001) | |
| model.compile(loss="categorical_crossentropy", optimizer=optimizer, metrics=["accuracy"]) | |
| ``` | |
| - **๋ชจ๋ธ ๊ตฌ์กฐ ๋ณ๊ฒฝ** | |
| ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ํด์, ```Conv2D-MaxPooling2D``` ๋ธ๋ก์ ๋ ๊น๊ฒ, ```Conv2D``` ๊ณ์ธต์ ํํฐ ์๋ฅผ ๋๋ ค ๋ ํ๋ถํ๊ฒ ํ ์ ์์ต๋๋ค. | |
| ```python | |
| model = keras.Sequential([ | |
| keras.layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=(28, 28, 1)), | |
| keras.layers.MaxPooling2D(pool_size=(2, 2)), | |
| # ๋ธ๋ก ์ถ๊ฐ! | |
| keras.layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), | |
| keras.layers.MaxPooling2D(pool_size=(2, 2)), | |
| # ํํฐ ์๋ฅผ ๋๋ฆฐ ๋ธ๋ก ์ถ๊ฐ! | |
| keras.layers.Conv2D(128, kernel_size=(3, 3), activation="relu"), | |
| keras.layers.MaxPooling2D(pool_size=(2, 2)), | |
| keras.layers.Flatten(), | |
| keras.layers.Dense(128, activation='relu'), # Dense ์ธต ์ถ๊ฐ | |
| keras.layers.Dropout(0.5), | |
| keras.layers.Dense(10, activation="softmax"), | |
| ]) | |
| ``` | |
| - **์ ์ดํ์ต** | |
| ์์ฃผ ํฐ ๋ฐ์ดํฐ์ ์ผ๋ก ํ์ต๋ ์ด๋ฏธ ๊ฐ๋ ฅํ ๋ชจ๋ธ์ ๊ฐ์ ธ์, ๊ทธ ๋ชจ๋ธ์ด ํ์ตํ ์ด๋ฏธ์ง ํน์ง์ถ์ถ๋ฅ๋ ฅ๋ง ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ ๋๋ค. | |
| ์ ์ ๋ฐ์ดํฐ๋ก๋ ๋์ ์ฑ๋ฅ์ ๋ผ ์ ์์ต๋๋ค. | |
| ```python | |
| # Keras์์ ์ ๊ณตํ๋ ์ฌ์ ํ์ต๋ VGG16 ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ (๋ถ๋ฅ๊ธฐ๋ ์ ์ธ) | |
| base_model = keras.applications.VGG16( | |
| weights='imagenet', # ImageNet์ผ๋ก ์ฌ์ ํ์ต๋ ๊ฐ์ค์น ์ฌ์ฉ | |
| include_top=False, # ๋ถ๋ฅ๊ธฐ(Dense ์ธต)๋ ์ ์ธ | |
| input_shape=(32, 32, 3) # VGG16์ ์ต์ 32x32 ์ปฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ | |
| ) | |
| # ๋ถ๋ฌ์จ ๋ชจ๋ธ์ ๊ฐ์ค์น๋ ๊ณ ์ (freeze) | |
| base_model.trainable = False | |
| # ์๋ก์ด ๋ถ๋ฅ๊ธฐ ์ถ๊ฐ | |
| model = keras.Sequential([ | |
| base_model, | |
| keras.layers.Flatten(), | |
| keras.layers.Dense(256, activation='relu'), | |
| keras.layers.Dropout(0.5), | |
| keras.layers.Dense(10, activation='softmax') # ๋์ ๋ฌธ์ ์ ๋ง๋ ์ถ๋ ฅ์ธต | |
| ]) | |
| # ์๋ก ์ถ๊ฐํ ๋ถ๋ฅ๊ธฐ ๋ถ๋ถ๋ง ํ์ต | |
| model.compile(...) | |
| model.fit(...) | |
| ``` | |
| ## 5. ๊ฒฐ๋ก | |
| ์ค๋์, ์ด๋ ๊ฒ CNN ๋ชจ๋ธ์ ๋ํด ๊ฐ๋จํ๊ฒ ์์๋ดค์ต๋๋ค. | |
| ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ํนํ๋ CNN์ ๋์ค์ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ์ด ๋์ค๋ฉด์ Vit๋ผ๋ ๋ชจ๋ธ์ด ๋ง๋ค์ด์ง๋๋ฐ ํฐ ๊ธฐ์ฌ๋ฅผ ํ๊ฒ ๋ฉ๋๋ค. | |
| ์ด๋ ๋ฏ ๊ทผ๋ณธ ๋์น๋ CNN ๋ง์ด ์ฌ๋ํด ์ฃผ์ธ์!! | |
| ๋ค์์๋ RNN๋ชจ๋ธ๋ก ๋์์ค๊ฒ ์ต๋๋ค | |
| ์ค๋๋ ์ข์ํ๋ฃจ ๋ณด๋ด์ธ์ฉ!! |