딥러닝

딥러닝(15) 텐서플로우를 활용한 CNN

개발연습자1 2023. 1. 2. 17:55

이번 시간에는 파이썬 환경에서 텐서 플로우를 활용하여 CNN 모델을 세워보고 데이터 학습을 진행해보자

 

우선 데이터를 준비 한다.

 

# 개,고양이 사진 데이터 준비

!wget --no-check-certificate \
  https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip \
  -O /tmp/cats_and_dogs_filtered.zip

 

# 데이터 압축풀기

import zipfile
file = zipfile.ZipFile('/tmp/cats_and_dogs_filtered.zip')
file.extractall('/tmp/cats_and_dogs_filtered')

 

데이터 경로를 지정한다.

base_dir='/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered'

train_dir='/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/train'

test_dir='/tmp/cats_and_dogs_filtered/cats_and_dogs_filtered/validation'

 

텐서플로우로 CNN모델을 만든다.

 

이때 ANN 모델처럼 모델을 세우나 3가지를 주의하여야 한다.

 

  • 3차원 컬러 데이터 이기 때문에 input 레이어에 RGB 컬러 값인 3을 추가하여 150,150,3으로 써줘야 한다.
  • Conv2D 레이어와 MaxPool2D 풀링레이어를 써줘야 한다.
  • 항상 마지막으로 Flatten으로 평활한 1차원 데이터로 만들어서 ANN 모델로 마무리를 해줘야 한다.

 

 

import tensorflow as tf
from keras.layers import Dense, Flatten, Conv2D, MaxPool2D
from keras.models import Sequential

def build_model():
  model = Sequential()
  model.add(Conv2D(filters=16,kernel_size=(3,3),activation='relu',input_shape=(150,150,3) )  )
  model.add( MaxPool2D ((2,2),2) )
  model.add(Conv2D(filters=32,kernel_size=(3,3),activation='relu')   )
  model.add( MaxPool2D ((2,2),2) )
  model.add(Conv2D(filters=64,kernel_size=(3,3),activation='relu')   )
  model.add( MaxPool2D ((2,2),2) )

  model.add(Flatten())
  model.add(Dense(512,'relu'))
  model.add(Dense(1,'sigmoid'))
  model.compile('rmsprop', 'binary_crossentropy', metrics=['accuracy'])
  return model

 

빌드 모델함수을 모델 변수에 넣고 요약을 본다.

 

model=build_model()

model.summary()

 

약 9백 4십만개이상의 레이어로 학습을 진행한다.

 

 

학습할 데이터를 전처리 해준다.

 

이미지 데이터 제너레이터라는 함수가 사용되는데 다음 시간에 알아보겠다.

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1/255.0 )

test_datagen = ImageDataGenerator(rescale = 1/255.0)

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

test_generator=test_datagen.flow_from_directory(test_dir, target_size=(150,150), class_mode='binary',batch_size=20)

 

모델로 학습을 진행한다.

epoch_history= model.fit(train_generator,epochs=15, validation_data=(test_generator),steps_per_epoch=100)

 

학습된 모델을 평가한다.

model.evaluate(test_generator)

 

이제 개,고양이중 1개의 이미지를 넣고 학습된 모델을 검증해보자

 

아래 코드를 실행하고 이미지 찾기 버튼을 눌러 등록하면 그사진이 개사진인지 고양이사진인지 알려준다.

import numpy as np
from google.colab import files
from tensorflow.keras.preprocessing import image

uploaded = files.upload()

for fn in uploaded.keys() :
  path = '/content/' + fn
  img = image.load_img(path, target_size=(150,150))
  x = image.img_to_array(img) / 255.0
  print(x)
  print(x.shape)

  x = np.expand_dims(x, axis = 0)

  print(x.shape)

  images = np.vstack( [x] )
  classes = model.predict( images, batch_size = 10 )
  
  print(classes)

  if classes[0] > 0.5 :
    print(fn + " is a dog")
  else :
    print(fn + " is a cat")

 

반응형