민자의 지식창고

CNN모델 만들어보기 본문

개발노트/Tensorflow

CNN모델 만들어보기

전지적민자시점 2020. 7. 30. 11:41

참고 내용 - 본문은 아래에 있습니다. 해당 글이 문제가 있다면, 삭제 하도록 하겠습니다.

https://tykimos.github.io/2017/03/08/CNN_Getting_Started/

 

컨볼루션 신경망 모델 만들어보기

간단한 컨볼루션 신경망 모델을 만들어봅니다. 다음과 같은 순서로 진행하겠습니다. 문제 정의하기 데이터 준비하기 데이터셋 생성하기 모델 구성하기 모델 학습과정 설정하기 모델 학습시키��

tykimos.github.io

데이터 준비하기

CNN 모델에 적합한 문제는 이미지 기반의 분류

  • 문제형태: 다중클래스분류
  • 입력: 다각형 이미지
  • 출력: 확률 벡터

모양별 20개 사진, 훈련 사진 15개, 5개 테스트. img는 .jpg 혹은 .png 로 저장합니다.

실제로 데이터셋이 어떻게 구성되어 있는지 모른체 튜토리얼을 따라하면 막막하므로 이번 기회에 데이터셋을 만들어봄으로써 실 문제에 접글할떄 시행착오를 줄여보겠습니다.

 

데이터 폴더는 다음과 같이 구성 하였습니다

 

  • train
    • circle
    • rectangle
    • triangle
  • test
    • circle
    • rectangle
    • triangle

 

데이터셋 생성하기

Keras의 ImageDataGenerator 클래스를 제공. ImageDataGenerator 클래스는 데이터 증강(data augumentation)을 위해 막강한 기능을 제공.

특정이미지를 특절 폴더에 분류 해놓고서 이를 학습시키는 데이터셋으로 만들어주는 기능을 사용해보겠습니다.

ImageDataGenerator 클래스를 이용하여 객체를 생성 후 flow_from_directory()함수를 호출하여 Generator를 생성 합니다.

flow_from_directory()함수의 주요인자는 다음과 같습니다

 

train_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory( 
 '/warehouse/shsape/train',
 target_szie(24 , 24),
 batch_size =3,
 class_mode='categorical')
 
 test_datagen = ImageDataGenerator(rescale=1./255)
 
 test_generator = test_datagen.flow_from_directory{
  '/warehouse/shape/test',
   target_size=(24,24),
   batch_size=3,
   class_mode='categorical')
   

첫번째 인자 : 이미지 경로

target_size : image 크기, 원본 크기가 다르더라도 target_size에 지정된 크기로 자동 조절 됩니다

batch_size : batch 크기

class_mode : 분류 방식  

  • categorical 2D one-hot 부호화된 라벨 반환
  • binary : 1D Binary 라벨 반환
  • spares : 1D 정수 라벨 반환
  • none : 라벨 반환이 안됨.

모델구성하기

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3),
          activation='relu'
          input_shape=(24,24,3)))
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(maxPooling2D(pool_szie=(2,2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(3, activation='softmax'))

 각 레이어에 따른 신경망 구성

CNN Layer : 입력 이미지 24 * 24 , 채널 3개, filter 3*3 , filter 수 32개, activation: relu

CNN Layer : filter 3 * 3, filter 64개, activation: relu

Max Pooling : pool_size  2*2

Flattern Layter

Dense : 출력 뉴런수 128개, relu

Dense : 출력 뉴런 3개, softmax

 

모델 구성

모델 학습과정 설정하기

모델의 옵티마이저, 로스, 지표를 설정 합니다

loss : 현재 가중치를 평가하는데 사용한 손실 함수. 다중 클래스 문제는 Categorical_crossentorpy 지정 합니다

optimizer : 최적의 가중치를 검색 하는데 사용되는 최적 알고리즘. adam 사용 합니다

metris : 평가 척도. accuracy으로 지정 합니다

 

model.compile(loss='category_crossentorpy', optimizer='adam', metrics=['accuracy'])

 모델 학습 시키기

케라스에서는 모델을 학습시킬 때 주로  fit()함수를 사용하지만, fit_generator() 함수를 사용 합니다. 

ImageDataGenerator는 제네레이터로 이미지를 담고 있는 배치로 학습시키기 때문에 fit_generator()함수를 사용하겠습니다. 

 첫번째 인자 : 한 epoch에 사용한 스텝 수를 지정. 총 45개 훈련 샘플, batch size 3, step 15

 step_per_epoch :  한 epoch에 사용한 step 수, 총 45개 훈련 샘플, batch_size 3 이므로, 15 step 

 epochs : 전체 훈련 데이터셋에 대한 학습 반복 횟수 지정.

 validate_data : 검증데이터셋을 제공할 제너레이터 지정

 

모델 사용하기

 모델 사용시에 제너레이터에서 제공되는 샘플을 입력할때는 predict_generator 함수를 사용합니다.

예측 결과는 클래스별 확률 벡터로 출력되며, 클래스에 해당되는 열을 알기 위해 class_indices를 출력하면, 해당 열의 클래스 명을 알려 줍니다

 

model.fit_generator(
trian_generator,
steps_per_epoch=15,
epochs=50m
validation_data = test_generator,
validation_steps=5)

 

모델 평가하기

#파일 평가
print("-- Evaluate --")
scores = model.evaluate_generator(test_generator, steps=5)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))

#파일 저장
model.save('D:/2020/model.h5')

 

모델 사용하기

output = model.predict_generator(test_generator, steps=5)
np.set_printoptions(formatter={'float':lamda x: "{0:0.3f}".format(x)})

 

 

 블로그의 내용을 tensorflow.keras을 사용하여 만들어 보았습니다.

mport numpy as np

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# 랜덤시드 고정시키기
np.random.seed(3)

batch_size = 3
num_classes = 3
epochs = 50

print("-- Road IMG START --")
train_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'D:/2020/handwriting_shape/train',
        target_size=(24, 24),
        batch_size=batch_size,
        class_mode='categorical')

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(
        'D:/2020/handwriting_shape/train',
        target_size=(24, 24),    
        batch_size=batch_size,
        class_mode='categorical')

print("-- Road IMG END --")

# 2. 모델 구성하기
print("-- Create Model --")
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=(24,24,3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes , activation='softmax'))


#성능평가 지표 지정
print("-- Compile --")
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

print("-- Generate --")
# 4. 모델 학습시키기
model.fit_generator(
        train_generator,
        steps_per_epoch=15,
        epochs=epochs,
        validation_data=test_generator,
        validation_steps=5)

#모델 평가
print("-- Evaluate --")
scores = model.evaluate_generator(test_generator, steps=5)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))

# 6. 모델 사용하기
print("-- Predict --")
output = model.predict_generator(test_generator, steps=10)

#파일 저장
model.save('D:/2020/model.h5')

 

 

728x90