'dogs_and_cats_small.zip' 디렉토리를 구글드라이브에 업로드
from google.colab import drive
drive.mount('/content/drive')
1. Data Preprocessing
import tensorflow as tf
!unzip /content/drive/My\ Drive/Colab\ Notebooks/datasets/dogs_and_cats_small.zip
1-1. Image_File Directory Setting
train_dir = 'train'
valid_dir = 'validation'
test_dir = 'test'
1-2. ImageDataGenerator( ) & flow_from_directory( )
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale = 1./255)
valid_datagen = ImageDataGenerator(rescale = 1./255)
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size = (150, 150),
batch_size = 20,
class_mode = 'binary')
valid_generator = valid_datagen.flow_from_directory(
valid_dir,
target_size = (150, 150),
batch_size = 20,
class_mode = 'binary')
Found 2000 images belonging to 2 classes.
Found 1000 images belonging to 2 classes.
1-3. Test train_generator
for data_batch, labels_batch in train_generator:
print('배치 데이터 크기:', data_batch.shape)
print('배치 레이블 크기:', labels_batch.shape)
break
labels_batch
2. CNN Keras Modeling
2-1. Model Define
#Feature Extraction & Classification
from tensorflow.keras import layers
from tensorflow.keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation = 'relu', input_shape = (150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation = 'relu'))
model.add(layers.Dense(1, activation = 'sigmoid'))
model.summary()
2-2. Model Compile
model.compile(loss = 'binary_crossentropy',
optimizer = 'adam',
metrics = ['accuracy'])
2-3. Model Fit
%%time
Hist_dandc = model.fit(train_generator,
steps_per_epoch = 100,
epochs = 60,
validation_data = valid_generator,
validation_steps = 50)
2-4. 학습 결과 시각화
#Loss Visualization
import matplotlib.pyplot as plt
epochs = range(1, len(Hist_dandc.history['loss']) + 1)
plt.figure(figsize = (9, 6))
plt.plot(epochs, Hist_dandc.history['loss'])
plt.plot(epochs, Hist_dandc.history['val_loss'])
plt.title('Training & Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['Training Loss', 'Validation Loss'])
plt.grid()
plt.show()
#Accuracy Visualization
import matplotlib.pyplot as plt
epochs = range(1, len(Hist_dandc.history['loss']) + 1)
plt.figure(figsize = (9, 6))
plt.plot(epochs, Hist_dandc.history['accuracy'])
plt.plot(epochs, Hist_dandc.history['val_accuracy'])
plt.title('Training & Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(['Training Accuracy', 'Validation Accuracy'])
plt.grid()
plt.show()
2-5. Model Evaluate
test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size = (150, 150),
batch_size = 20,
class_mode = 'binary')
Found 1000 images belonging to 2 classes.
loss, accuracy = model.evaluate(test_generator,
steps = 50)
print('Loss = {:.5f}'.format(loss))
print('Accuracy = {:.5f}'.format(accuracy))
3. Model Save
model.save('/content/drive/My Drive/Colab Notebooks/models/002_dogs_and_cats_small.h5')
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(rotation_range = 40,
width_shift_range = 0.2,
height_shift_range = 0.2,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip = True,
vertical_flip = True,
fill_mode = 'nearest')
from tensorflow.keras.preprocessing import image
import matplotlib.pyplot as plt
import os
train_cats_dir = train_dir = os.path.join('train', 'cats')
fnames = sorted([os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)])
# 테스트 이미지 선택
img_path = fnames[77]
# 이미지 읽고 크기 변경
img = image.load_img(img_path, target_size=(150, 150))
# (150, 150, 3) 배열 변환
x = image.img_to_array(img)
# (1, 150, 150, 3) 변환
x = x.reshape((1,) + x.shape)
# 랜덤하게 변환된 이미지 배치 생성
i = 0
for batch in datagen.flow(x, batch_size=1):
plt.figure(i)
imgplot = plt.imshow(image.array_to_img(batch[0]))
i += 1
if i % 4 == 0:
break
plt.show()
train_dir = 'train'
valid_dir = 'validation'
test_dir = 'test'
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# With Augmentation
train_datagen = ImageDataGenerator(rescale = 1./255,
rotation_range = 40,
width_shift_range = 0.2,
height_shift_range = 0.2,
shear_range = 0.2,
zoom_range = 0.2,
horizontal_flip=True,
vertical_flip = True,
fill_mode = 'nearest')
# Without Augmentation
valid_datagen = ImageDataGenerator(rescale = 1./255)
# With Augmentation
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size = (150, 150),
batch_size = 20,
class_mode = 'binary')
# Without Augmentation
valid_generator = valid_datagen.flow_from_directory(
valid_dir,
target_size = (150, 150),
batch_size = 20,
class_mode = 'binary')
from tensorflow.keras import layers
from tensorflow.keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation = 'relu', input_shape = (150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation = 'relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation = 'relu'))
model.add(layers.Dense(1, activation = 'sigmoid'))
model.summary()
model.compile(loss = 'binary_crossentropy',
optimizer = 'adam',
metrics = ['accuracy'])
%%time
#epochs : 60 -> 100
Hist_dandc = model.fit(train_generator,
steps_per_epoch = 100,
epochs = 100,
validation_data = valid_generator,
validation_steps = 50)
import matplotlib.pyplot as plt
epochs = range(1, len(Hist_dandc.history['loss']) + 1)
plt.figure(figsize = (9, 6))
plt.plot(epochs, Hist_dandc.history['loss'])
plt.plot(epochs, Hist_dandc.history['val_loss'])
plt.title('Training & Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['Training Loss', 'Validation Loss'])
plt.grid()
plt.show()
import matplotlib.pyplot as plt
epochs = range(1, len(Hist_dandc.history['loss']) + 1)
plt.figure(figsize = (9, 6))
plt.plot(epochs, Hist_dandc.history['accuracy'])
plt.plot(epochs, Hist_dandc.history['val_accuracy'])
plt.title('Training & Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend(['Training Accuracy', 'Validation Accuracy'])
plt.grid()
plt.show()
test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size = (150, 150),
batch_size = 20,
class_mode = 'binary')
loss, accuracy = model.evaluate(test_generator,
steps = 50)
print('Loss = {:.5f}'.format(loss))
print('Accuracy = {:.5f}'.format(accuracy))
model.save('/content/drive/My Drive/Colab Notebooks/models/003_dogs_and_cats_augmentation.h5')
CNN 모델 학습 시각화 (0) | 2022.06.28 |
---|---|
CNN(Convolutional Neural Network)-VGG-16 (0) | 2022.06.27 |
CNN(Convolutional Neural Network)-MNIST _Categorical Classification (0) | 2022.06.24 |
DNN(Deep Neural Network)-MNIST _Categorical Classification (0) | 2022.06.20 |
DNN(Deep Neural Network)-MNIST _Categorical Classification (0) | 2022.06.17 |