본문 바로가기

Model/Layer

CNN만들기

반응형

폭풍수정예정...

목표

 

  • CNN으로 간단한 학습 모델을 만들어 training set, test set 을 통해 evaluate해본다.
  • 적은 data set을 부풀려 overfitting을 만든다.
  • 간단한 이미지(circle, rec, tri)를 학습한다.
  • 복잡한 이미지를 학습한다. : 컴퓨터가 견딜까?
  • 동영상 베이스로 학습한다. : 목표 ㅋㅅㅋ
  • 문서를 학습한다.

환경설정

사용 언어 : python3.6.1, tensorflow(keras 필요)

Tutorial

1. 파일 구성

app.py
dataset
- test_set
  - circle
  - rectangular
  - triangle
- training_set
  - circle
  - rectangular
  - triangle

2. 음

1. 데이터 생성

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

train_datagen = ImageDataGenerator(rescale=1./255,
                                  rotation_range=15,
                                  width_shift_range=0.1,
                                  height_shift_range=0.1,
                                  shear_range=0.5,
                                  zoom_range=[0.8, 2.0],
                                  horizontal_flip=True,
                                  vertical_flip=True,
                                  fill_mode='nearest')
train_generator = train_datagen.flow_from_directory('./dataset/training_set',
                                                    target_size=(500, 500),
                                                    batch_size=3,
                                                    class_mode='categorical')

test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory('./dataset/test_set',
                                                  target_size=(500, 500),
                                                  batch_size=3,
                                                  class_mode='categorical')

training generator, test generator

ImageDataGenerator와 flow_from_directory를 사용해 generator 각각 생성.

ImageDataGenerator

 

  • training data가 부족할 때 임의로 변형을 하여 다양한 데이터셋을 얻을 수 있다.
  • 객체를 생성한다
    • rotation_range = n : 0~n 각도 내에서 임의로 이미지를 회전시킨다.
    • width_shift_range = 0.1 : 수평방향 내에서 이미지를 이동시킨다. 전체 넓이가 100일 경우 100*0.1=10 만큼 좌우 이동한다.
    • height_shift_range = 0.1 : 수직방향 내에서 이미지를 이동시킨다. 전체 넓이가 100일 경우 100*0.1=10 만큼 상하 이동한다.
    • shear_range = 0.5 : 밀림 강도. 시계 반대 방향으로 0.5라디안 만큼 변형시킨다.
    • zoom_range = [a,b] : 확대/축소를 한다. zoom_range=a 라면 1-a ~ 1+a 만큼 확대, 축소를 한다.
    • horizontal_flip = True : 수평뒤집기를 한다.
    • vertical_flip = True : 수직뒤집기를 한다.

flow_from_directory

 

  • generator를 생성한다
    • 첫번째 인자 : 이미지 경로
    • target_size=(x,y) : 패치 이미지 크기를 설정한다. 원본 이미지와 상관 없이 target_size에 맞춰 수정된다.
    • batch_size : 한번에 사용하는 training data의 수
    • class_mode : 분류 방식.
    • categorical : 2차원 one-hot 부호화된 라벨 반환
    • binary : 1차원 이진 라벨 반환
    • sparse : 1차원 정수 라벨 반환
    • None : 라벨을 반환하지 않는다

batch 크기의 설정

 

training class의 데이터 수로 batch_size * batch실행수 설정

2. 모델 구성

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(500,500,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'))

Convolution layer (위 함수에선 2개)

 

  • 32 : 필터 수
  • kernel_size = (3,3) : 필터 크기 3*3
  • activation = 'relu' : activation 함수 ReLu
  • input_shape(500,500,3) : 입력 이미지 크기 500*500, 입력 이미지 채널 3개

Maxpooling layer

  • pool_size(2,2) : pool크기 2*2

Flatten layer

  • Flatten layer추가

Dense layer

  • 128 : 출력 뉴런 수 128개
  • activation : activation function

3. 모델 학습과정 설정

 

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  • 모델 정의 후 손실함수와 최적화 알고리즘으로 엮는다.
    • loss : 가중치 세트를 평가하는데 쓰이는 손실 함수. 다중 클래스에선 categorical_crossentropy
    • optimizer : 최적의 가중치를 검색하는 데 사용되는 최적 알고리즘 중 하나인 아담 사용
    • metrics : 평가 척도. 분류 문제는 일반적으로 accuracy 사용

4. 모델 학습시키기

 

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

 

  • keras에서 모델 학습시킬 때는 주로 fit()를 사용한다.
  • generate로 생성된 batch로 학습시킬 때는 fit_gerator()를 사용한다.
    • 첫번째 인자 : training data set을 제공할 generator 지정. 위에서 만든 train_generator 사용
    • steps_per_epoch : 한 epoch에 사용한 step 수. (여기선 샘플 45개일 때 batch_size 5라서 15step으로 임시 사용)
    • epochs : 전체 dataset 반복 학습 횟수
    • validation_data : validate data set을 제공할 generator 지정. 위에서 만든 test_generator 사용
    • validation_steps : 한 epochs 종료 시마다 검증할 때 사용되는 검증 스텝 수. (test data set 15개, batch_size 3라서 5step 사용)

5. 모델 평가하기

 

print("-- Evaluate(정확도) --")
scores = model.evaluate_generator(test_generator, steps=5)
print("%s: %.2f%%" %(model.metrics_names[1], scores[1]*100))

 

  • evaluate_generator 사용

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)
print(test_generator.filenames)

 

  • 예측 결과는 클래스(폴더) 별 확률 벡터로 나타난다.
반응형

'Model > Layer' 카테고리의 다른 글

U Net  (0) 2020.04.12
CNN 모델  (0) 2020.04.12
CNN(Convolution Neural Network)이란?  (0) 2020.04.12
RNN/LSTM/GRU  (0) 2020.04.12
DNN (Deep Neural Network, 심층 신경망)  (0) 2020.04.12