ImageDataGenerator
ImageDataGenerator ์ด์ฉํ๋ฉด ์๋์ผ๋ก label ๋ถ์ฌํด์ค๋ค.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
trian_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(300, 300),
batch_size=128,
class_mode='binary'
)
- train_dir
- ์ฌ๊ธฐ์ train_dir๋ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจํ ์์ ๋๋ ํ ๋ฆฌ์ฌ์ผ ํ๋ค.
(์์ ์ด๋ฏธ์ง์์ trian์ ๋์ํ๋ ์์น) - train_dir์ ํ์ ๋๋ ํ ๋ฆฌ ์ด๋ฆ์ label์ ์ด๋ฆ์ด์ฌ์ผ ํ๋ค.
- ์ฌ๊ธฐ์ train_dir๋ ์ด๋ฏธ์ง๊ฐ ํฌํจ๋ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ํฌํจํ ์์ ๋๋ ํ ๋ฆฌ์ฌ์ผ ํ๋ค.
- target_size = (300, 300)
- ์ฌ๊ธฐ์ channel size ์ง์ ํด์ค ํ์ X
- ์ ๊ฒฝ๋ง์ ํ์ตํ๊ธฐ ์ํด์๋ ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋์ผํ ํฌ๊ธฐ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ด์ฆ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
- ์ด๋ฏธ์ง๊ฐ ๋ก๋๋ ๋ ์ฌ์ด์ฆ๋ฅผ ์กฐ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ ์ฒ๋ฆฌ ํ ํ์๊ฐ ์๋ค.
- batch_size
- ๋ฐฐ์น ์ฌ์ด์ฆ๋ฅผ ์ง์ ํด์ค๋ค.
- class_mode
- "binary": 1D numpy array of binary labels,
- "categorical": 2D numpy array of one-hot encoded labels. Supports multi-label output.
- "input": images identical to input images (mainly used to work with autoencoders),
- "multi_output": list with the values of the different columns,
- "raw": numpy array of values in y_col column(s),
- "sparse": 1D numpy array of integer labels, - None, no targets are returned (the generator will only yield batches of image data, which is useful to use in model.predict()).
- ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ train_generator์ validation_generator์ target_size๊ฐ ๋์ผํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
ConvNet ์ ์
model = tf.keras.models.Sequential([
# 1st CONV+POOL
tf.keras.layers.Conv2D(16, (3, 3), activation='relu', input_shape=(300, 300, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
# 2nd CONV+POOL
tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
# 3rd CONV+POOL
tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
tf.keras.layers.MaxPooling2D(2, 2),
# Flatten
tf.flatten(),
# 1st DENSE
tf.keras.layers.Dense(512, activation='relu'),
# 2nd DENSE
tf.keras.layers.Dense(1, activation='sigmoid') # binary classification
])
- input_shape
- channel ์ฌ์ด์ฆ๋ ๊ธฐ์ฌํด์ฃผ์ด์ผ ํ๋ค.
- (300, 300, 3) : row, col, channel ์์
- ๋ง์ง๋ง layer์ output node
- binary classification ๋ฌธ์ ์๊ธฐ ๋๋ฌธ์ unit์ ์๋ฅผ 1์ผ๋ก ์ค์ ํ๊ณ
- activation function ์ญ์ sigmoid๋ก ์ค์ ํด์ฃผ์๋ค.
- ๋ง์ฝ์ multi-class classification์ด๋ผ๋ฉด class์ ๊ฐ์๋ก units์ ์๋ฅผ ์ค์ ํด์ฃผ๊ณ ,
activation function์ผ๋ก๋ 'softmax'๋ฅผ ์ฌ์ฉํ๋ค.
from tensorflow.keras.optimizers import RMSProp
model.compile(loss='binary_crossentropy',
optimizer=RMSProp(lr=0.001),
metrics=['acc'])
- binary classification์ด๊ธฐ ๋๋ฌธ์ loss๋ 'binary_crossentropy' ์ฌ์ฉํ์๋ค.
- multi-class classification ๋ฌธ์ ๋ผ๋ฉด 'categorical_crossentropy' ํน์ 'sparse_categorical_crossentropy' loss๋ฅผ ์ฌ์ฉํ์ฌ์ผ ํ๋ค.
- y๊ฐ one-hot encoding์ด ๋์ด์๋ ์ํ๋ผ๋ฉด categorical_crossentropy๋ฅผ ์ฌ์ฉํ๊ณ ,
- y๊ฐ one-hot encoding์ด ๋์ด์์ง ์์ ์ํ๋ผ๋ฉด sparse_categorical_crossentropy๋ฅผ ์ฌ์ฉํ๋ค.
history = model.fit_generator(
train_generator,
steps_per_epoch=8,
epochs=15,
validation_data=validation_generator,
validation_steps=8,
verbose=2
)
- model.fit ๋์ model.fit_generator ์ฌ์ฉํ๊ณ ์๋ค.
- training directory์ 1,024์ฅ์ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ๊ณ , batch_size๋ 128๋ก ์ง์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์
steps_per_epoch๋ 1024/128 = 8์ผ๋ก ์ค์ ํด์ฃผ์๋ค. - validation directory์ 256์ฅ์ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ๊ณ , batch_size๋ 32๊ฐ๋ก ์ง์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์
validation_steps๋ 256/32=8์ผ๋ก ์ค์ ํด์ฃผ์๋ค. - verbose๋ tranining๋์ ์ผ๋ง๋ ์์ฃผ ์ถ๋ ฅํ ๊ฒ์ธ์ง๋ฅผ ์ค์ ํ๋ parameter์ด๋ค.
Compressing images
- ๋ณธ ๊ฐ์์ ๋ด์ฉ์์๋ 300*300*3 ํฌ๊ธฐ์ horse, human ์ด๋ฏธ์ง๋ก ํ์ต์ ์ํํ๋ค.
- ํ์ง๋ง, 150*150*3์ ํฌ๊ธฐ๋ก ์์ ๋ ์ด๋ฏธ์ง๋ก ํ์ตํ๋ค๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋ ๊น?
- (image generator์์ ํฌ๊ธฐ์ ๋ชจ๋ธ์ input_size๋ฅผ ์์ ํด์ฃผ๋ฉด ๋๋ค)
- ํฌ๊ธฐ๊ฐ ์์์ง๋ ํ์ตํ ๋์ ๊ณ์ฐ ๋น์ฉ์ด ์ค์ด๋ ๋ค. ํ์ง๋ง ์ ํ๋ ๋ํ ๋ฎ์์ก๋ค.
(์์ ์ฌ์ด์ฆ์ ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด layer์ ๊ฐ์๋ฅผ ์ค์๊ธฐ ๋๋ฌธ์)
github.com/lmoroney/dlaicourse