본문 바로가기
프로그래머/프로그래밍

[케라스] Keras 컨볼루션 신경망

by plog 2020. 1. 3.

* 김태영님 동영상(https://youtu.be/cJpjAmRO_h8) 강의 정리 노트 
* 참고: 김태영님 블로그(https://tykimos.github.io/)

 

컨볼루션 신경망 모델에서 주로 사용되는 레이어는

컨볼루션(Convolution) 레이어, 맥스풀링(Max Pooling) 레이어, 플래튼(Flatten) 레이어가 있다. 

 

필터로 특징을 뽑아주는 컨볼루션(Convolution) 레이어

Conv2D(32, (5, 5), padding='valid', input_shape=(28, 28, 1), activation='relu')

  • 첫번째 인자 : 컨볼루션 필터의 수

  • 두번째 인자 : 컨볼루션 커널의 (행, 열). 필터 크기

  • padding : 경계 처리 방법을 정의합니다.

    ‘valid’ : 유효한 영역만 출력이 됩니다. 따라서 출력 이미지 사이즈는 입력 사이즈보다 작습니다.

    ‘same’ : 출력 이미지 사이즈가 입력 이미지 사이즈와 동일합니다.

  • input_shape : 샘플 수를 제외한 입력 형태를 정의 합니다. 모델에서 첫 레이어일 때만 정의하면 됩니다. (행, 열, 채널 수)로 정의합니다. 흑백영상인 경우에는 채널이 1이고, 컬러(RGB)영상인 경우에는 채널을 3으로 설정합니다.

  • activation : 활성화 함수 설정합니다.

    ‘linear’ : 디폴트 값, 입력뉴런과 가중치로 계산된 결과값이 그대로 출력으로 나옵니다.

    ‘relu’ : rectifier 함수, 은익층에 주로 쓰입니다.

    ‘sigmoid’ : 이진 분류 주로 사용 

    ‘softmax’ : 다중 클래스 분류 주로 사용

사소한 변화를 무시해주는 맥스풀링(Max Pooling) 레이어

MaxPooling2D(pool_size=(2, 2))

  • pool_size : 수직, 수평 축소 비율을 지정합니다.
    (2, 2)이면 출력 영상 크기는 입력 영상 크기의 반으로 줄어듭니다.
    가장 큰값만 추출

영상을 일차원으로 바꿔주는 플래튼(Flatten) 레이어

Flatten()

CNN에서 컨볼루션 레이어나 맥스풀링 레이어를 반복적으로 거치면 주요 특징만 추출되고, 추출된 주요 특징은 전결합층에 전달되어 학습됩니다. 컨볼루션 레이어나 맥스풀링 레이어는 주로 2차원 자료를 다루지만 전결합층에 전달하기 위해선 1차원 자료로 바꿔줘야 합니다. 이 때 사용되는 것이 플래튼 레이어입니다.

 

예제 코드

# 0. 사용할 패키지 불러오기
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator

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



# 1. 데이터 생성하기
# train_datagen = ImageDataGenerator(rescale=1./255) #0 ~1 사이 값 기본

# 데이터 부플리기 (로테이션, 기울기, 줌인 등)
train_datagen = ImageDataGenerator(rescale=1./255, 
                                   rotation_range=10, 
                                   width_shift_range=0.2, 
                                   height_shift_range=0.2, 
                                   shear_range=0.7,
                                   zoom_range=[0.9, 2.2],
                                   horizontal_flip=True,
                                   vertical_flip=True,
                                   fill_mode='nearest')

train_generator = train_datagen.flow_from_directory(
        'warehouse/handwriting_shape/train', # 대상 폴더
        target_size=(24, 24), # resizing 
        batch_size=3,
        class_mode='categorical')

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory(
        'warehouse/handwriting_shape/test',
        target_size=(24, 24),    
        batch_size=3,
        class_mode='categorical')

# 2. 모델 구성하기
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(3, activation='softmax'))

# 3. 모델 학습과정 설정하기
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 4. 모델 학습시키기
'''
첫번째 인자 : 훈련데이터셋을 제공할 제네레이터를 지정.
steps_per_epoch : 한 epoch에 사용한 스텝 수를 지정합니다. 
   총 45개의 훈련 샘플이 있고 배치사이즈가 3이므로 15 스텝으로 지정합니다.
epochs : 전체 훈련 데이터셋에 대해 학습 반복 횟수를 지정합니다. 
   100번을 반복적으로 학습시켜 보겠습니다.
validation_data : 검증데이터셋을 제공할 제네레이터를 지정합니다. 
   본 예제에서는 앞서 생성한 validation_generator으로 지정합니다.
validation_steps : 한 epoch 종료 시 마다 검증할 때 사용되는 검증 스텝 수를 지정합니다. 
   홍 15개의 검증 샘플이 있고 배치사이즈가 3이므로 5 스텝으로 지정합니다.
'''
model.fit_generator(
        train_generator,
        steps_per_epoch=15,
        epochs=50,
        validation_data=test_generator,
        validation_steps=5)

# 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=5)
np.set_printoptions(formatter={'float': lambda x: "{0:0.3f}".format(x)})
print(test_generator.class_indices)
print(output)

 

 

 

 

 

댓글