์์ํ๋ฉฐ
TF ๊ณต๋ถ๊ฐ ์๊ฐ๋ณด๋ค ๋๋ฌด ์ค๋๊ฑธ๋ ค!! ์บ๊ธ, ๊นํ๋ธ ๋ฑ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ๋ฉฐ ํ๋ก์ ํธ๋ฅผ ์งํํ์๋ ๋ด๊ฐ ๊ธฐ๋ณธ๊ธฐ๊ฐ ๋ง์ด ๋ถ์กฑํ์์ ๋๊ผ๋ค... ํ๋ํ๋ ์ดํดํ๊ณ ์ง์ ๊ตฌํํด๋ณด๊ณ ๋์ด๊ฐ๋ ค๋๊น ๋๋ ์๋ค.
์ด์จ๋ , CNN๋ชจ๋ธ์ ๋ง๋ค๊ณ , ImageGenerator์ ํ์ฉํ ์์ ๋ฅผ ๊น๋จน์ง ์๊ธฐ ์ํด ํฌ์คํ
ํด๋ณผ๊น ํ๋ค. ์์!
1. import library
๋ด๊ฐ ์์ฑํ ์ฝ๋์ ํ์ํ library๋ฅผ import
import tensorflow as tf
import os
from os import path, getcwd, chdir
from tensorflow.keras.optimizers imort RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
2. callbacks ํด๋์ค ์์ฑ
์ผ์ ํ accuracy ๋ฌ์ฑ ํ ๋ชจ๋ธ training์ ๋ฉ์ถฐ์ฃผ๋ ๊ธฐ๋ฅ์ธ callbacks๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ callbacks ํด๋์ค๋ฅผ ์์ฑํด์ค๋ค.
class MyCallBack(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if(logs.get('accuracy') >= 0.95):
print("\n====Reached 95% accuracy, stop training====")
self.stop_training = True
callbacks = MyCallBack()
3. ๋ชจ๋ธ ์์ฑ
3๊ฐ์ conv2d, maxpooling layer๋ฅผ ๊ฐ์ง ๋ชจ๋ธ์ ๊ตฌ์ฑํ ๊ฒ์ด๊ณ , ์ต์ข ๋ถ๋ฅ๋ 0๊ณผ 1์ฌ์ด์ ํ๋ฅ ๊ฐ์ผ๋ก ์ถ๋ ฅํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ง์ง๋ง Dense layer์ node์๋ 1๊ฐ์ด๊ณ , sigmoid ํ์ฑํํจ์๋ฅผ ์ด์ฉํ๋ค.
model = tf.keras.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape = (300, 300, 3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.kers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation'sigmoid')
])
model.summary()
3. ๋ชจ๋ธ ์ปดํ์ผ (์ต์ ํ, ์์คํจ์ ์ ํ)
model.compile(loss='binary_crossentrophy',
optimizer=RMSprop(lr=0.001),
metrics=['accuracy'])
- RMSprop ๋?
- Adagrad ์๊ณ ๋ฆฌ์ฆ์ ์๋์ผ๋ก ํ์ต๋ฅ (learning rate)๋ฅผ ์ค์ ํ๋๋ฐ, ์ฌ๊ธฐ์ ํ์ต๋ฅ ์ด ๊ธ๊ฒฉํ๊ฒ ๊ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ์ ์ด ์ตํฐ๋ง์ด์ ๋ฅผ ์ฌ์ฉํ๋์ง๋ ์ฐจ์ฐจ ์์๊ฐ๋๋กํ๊ณ , ์ผ๋จ ๊ณต๋ถํ๊ณ ์๋ ์์ ์ ์๋๋๋ก ๊ณต๋ถํ๋ค. ใ ใ
4. ImageDataGenerator์ ํ์ฉํ์ฌ data ํ์ฑ
train_datagen = ImageDataGenerator(rescale = 1./255)
train_generator = train_datagen.flow_from_directory(
'/desktop/mycomputer/', #train data๊ฐ ๋ค์ด์๋ ๊ฒฝ๋ก
target_size = (300, 300),
batch_size = 10,
class_mode = 'binary'
)
- flow_from_directory ํจ์๋ฅผ ํ์ฉํ๋ฉด์, ํ์ผ๋ช
์ด ๋ผ๋ฒจ์ด ๋๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋์์ค๋ค.
- ์ด๋ ๊ฒ train ํด๋ ๊ฒฝ๋ก ์์ dogs์ cats ๊ฐ ์๋ค๋ฉด, ๊ทธ ์์ ์๋ ์ฌ์ง๋ค์ label์ dogs์ cats๊ฐ ๋๋ค.
5. model fitting (fit_generatorํจ์)
model.fit_generator(
train_generator,
steps_per_epoch=10, #ํ ๋ฒ์ epoch๋ฅผ ๋ ๋, ๋ฐ์ดํฐ๋ฅผ ๋ช ๋ฒ ๋ณผ ๊ฒ์ธ๊ฐ
epochs=15,
verbose=1,
callbacks=[callbacks]
# validation_data = val_data
# validation_steps = 2000
)
- validation data๊ฐ ์์ผ๋ฉด ๋งจ ์๋ val_data์ ์ฑ์์ฃผ๋ฉด ๋๋ค.
- validation_steps : ํ ๋ฒ์ epoch๊ฐ ๋๊ณ ๋ ํ, val_data๋ก accuracy๋ฅผ ์ธก์ ํ ๋, val_data๋ฅผ ๋ช ๋ฒ ๋ณผ ๊ฒ์ด๋
- steps_per_epoch ์ ์ ๊ฒฐ์ : train_data ์ / train_generator์ ์ ๋ ฅํ batch_size ์
6. test set ์์ธก
predict = model.predict_generator(test_data, steps=5)
print(test_data.class_indices)
print(predict)
- test_data ๋ ์์ train_datagen, train_generator ๋ง๋ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ๋ง๋ค๋ฉด ๋๋ค.
- ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ด ํ๋ฅ ๊ฐ์ผ๋ก ๋์จ๋ค.
์ฐธ๊ณ ๋ฌธํ - 3months.tistory.com/199
๋ง์น๋ฉฐ
ImageDataGenerator์ ์ฌ์ฉํ ์ค ์์์ผ TF ์ํ์์๊ฐ๊ฐ๋ฅํ๋ค๊ณ ํธ๋๋ถ์ ๋์์๋ค. ์ ํํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ตํ๊ณ ์ํ์ ์์ํด์ ๊ผญ ํฉ๊ฒฉํ๊ฒ ๋ค.
'AI study > ๋ฅ๋ฌ๋ ํ๋ ์์ํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Pytorch] Colab์ Pytorch ์ค์นํ๊ธฐ / ํ ์ ์์ฑํ๊ธฐ (0) | 2021.07.16 |
---|---|
[keras] Conv2D, MaxPool2D ํ๋ผ๋ฏธํฐ ์ดํด๋ณด๊ธฐ (0) | 2021.04.20 |
[keras] ์ผ์ accuracy ๋ฌ์ฑ ํ ํ๋ จ์ ์๋์ผ๋ก ๋ฉ์ถ๋ callbacks ์์ฑํ๋ ๋ฐฉ๋ฒ (0) | 2021.03.04 |
[keras] CNN ๋ชจ๋ธ ๊ตฌ์ฑ ์ดํด๋ณด๊ธฐ (0) | 2021.03.03 |
[tensorflow] ํ ์คํธ ๋ถ๋ฅ (Text Classification) - IMDB (0) | 2021.03.02 |