AI - Deep Learing 3일차

학습 내용

cats and dogs 이미지 분류하기

# colab에서 드라이브에 있는 파일을 사용하기 위해 마운트
from google.colab import drive
drive.mount('/content/drive')
import keras
import os, shutil
  • 분류할 폴더 생성

  • 파일 복사

Copy files.... 
---traing file(s) (cat).... 
---validation file(s) (cat).... 
---test file(s) (cat).... 
---traing file(s) (dog).... 
---validation file(s) (dog).... 
---test file(s) (dog).... 
  • 복사된 파일 개수 확인
print('훈련용 고양이 이미지 전체 개수:', len(os.listdir(train_cats_dir))) # 파일 전체 목록의 길이 확인
print('검증용 고양이 이미지 전체 개수:', len(os.listdir(validation_cats_dir))) 
print('테스트용 고양이 이미지 전체 개수:', len(os.listdir(test_cats_dir))) 
print('훈련용 강아지 이미지 전체 개수:', len(os.listdir(train_dogs_dir)))
print('검증용 강아지 이미지 전체 개수:', len(os.listdir(validation_dogs_dir))) 
print('테스트용 강아지 이미지 전체 개수:', len(os.listdir(test_dogs_dir))) 
훈련용 고양이 이미지 전체 개수: 1000
검증용 고양이 이미지 전체 개수: 500
테스트용 고양이 이미지 전체 개수: 500
훈련용 강아지 이미지 전체 개수: 1000
검증용 강아지 이미지 전체 개수: 500
테스트용 강아지 이미지 전체 개수: 500
  • 신경망 만들기
from keras import layers
from keras import models

# 레이어 11개 생성
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu'))
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'))
#이진분류할 때는 sigmoid 사용
#모델 컴파일
from tensorflow.keras import optimizers
model.compile(loss='binary_crossentropy', #둘 중 하나면 binary_crossentropy, 여러 개면 categorical_crossentropy
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc']) 
  • 이미지 사이즈 통일
    이미지 크기가 다르면 특성이 다르게 잡힌다
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
    train_dir,
    target_size=(150,150),
    batch_size=20,
    class_mode='binary'
)

validation_generator = validation_datagen.flow_from_directory(
    validation_dir,
    target_size=(150,150),
    batch_size=20,
    class_mode='binary'
)
  • 학습
model.fit_generator(
    train_generator,
    epochs=30,  #반복 횟수
    steps_per_epoch=100,
    validation_data=validation_generator,
    validation_steps=50
)
Epoch 1/30
100/100 [==============================] - 478s 5s/step - loss: 0.6948 - acc: 0.5250 - val_loss: 0.6828 - val_acc: 0.5040
Epoch 2/30
100/100 [==============================] - 12s 124ms/step - loss: 0.6624 - acc: 0.5920 - val_loss: 0.6568 - val_acc: 0.5980
Epoch 3/30
100/100 [==============================] - 12s 123ms/step - loss: 0.6202 - acc: 0.6630 - val_loss: 0.6147 - val_acc: 0.6700
...중략...
Epoch 29/30
100/100 [==============================] - 12s 123ms/step - loss: 0.0362 - acc: 0.9900 - val_loss: 1.1306 - val_acc: 0.7200
Epoch 30/30
100/100 [==============================] - 12s 123ms/step - loss: 0.0328 - acc: 0.9900 - val_loss: 1.0944 - val_acc: 0.7310
  • 모델 저장하기
model.save('cats_and_dogs_small_l.h5') #모델의 확장자 h5
  • 그래프로 확인하기
history = model.history

import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

학습 후기

오류가 나서 문제가 생겨야 해결법을 찾아보면서 배운다는데 오류가 안 나서 걱정이다.
오늘 한 내용을 혼자 만들어 낼 자신은 없지만 이해한 것에 만족해야겠다.
복습하는 시간이 오래 걸려서 방법을 바꿨는데 꽤 괜찮은 것 같다.
영상을 전체적으로 빠른 배속으로 보고 아는 것을 정리했었는데 오늘은 코딩한 내용을 먼저 풀이해보고 이해 못한 부분만 따로 체크해서 나중에 해당 부분만 다시 찾아보니까 모르는게 더 잘 체크되고 복습 시간도 줄었다. 덕분에 듣고 싶었던 강의도 들을 여유 시간이 생겼다.

좋은 웹페이지 즐겨찾기