Keras Model

박재한·2022년 6월 11일
0

Deep Learning

목록 보기
14/22
post-custom-banner

1. Keras 모델이란 무엇인가?

Keras는 Theano와 Tensorflow 기반의 딥러닝용 고차원 라이브러리이다. Python 언어로 쓰여 광범위한 딥러닝 모델을 깔끔하고 편리하게 제작할 수 있다. Keras는 신경망 개발 및 테스트에 관한 한 가장 애용되는 고수준 신경망 API 중 하나로 자리 잡고있다. Keras 고수준 API 덕분에 요즘은 신경망 계층을 생성하고 복잡한 아키텍처를 설정하는 것쯤은 간단한 일이 되었다. Keras 모델은 시퀀스독립 실행형 그래프 하나로 구성된다. 딥러닝 학습 관련 모듈이 여러 개 있어 이를 이리저리 조합하여 새 모델을 만들면 된다. 이렇게 함께 플러깅할 수 있는 구성 방식 모듈 중에는 신경층, 비용 함수, 최적화 프로그램, 초기화 방식, 드롭아웃, 손실, 활성화 함수 및 정규화 방식 등이 있다. 모듈 방식의 주된 장점 중 하나는 새 기능을 별도의 모듈로 손쉽게 추가할 수 있다는 점다. 따라서 Keras는 매우 유연하여 혁신적인 연구에 아주 적합하다.
Keras 모델은 순차적(sequential), 함수형(functional) API 두 가지 방식으로 개발하면 됩니다.
Imgur

2. 순차적 API 모드

순차적 API 모델은 가장 단순한 모델이며 선형 파일(pile) 계층으로 구성되어 대부분 문제점에 계층별(layer-by-layer)로 모델을 구성할 수 있다. 순차적 모델은 사용하기 아주 간편하지만, topology에 한계가 있다.
이 한계는 공유 계층(다양한 여러 입력으로부터 하나의 계층을 공유하는 것)으로는 모델을 구성할 수 없고 따라서 입력이나 출력이 동시에 여러개일 경우에는 순차적 API 모드로는 모델을 구성할 수 없다는 문제가 있다. 이러한 이유로 출력에서 label의 종류가 1가지가 아닌 여러 종류의 label로 출력이 되는 Multi-Label Classification 용 모델에서는 순차적 API 모드로 모델을 구성하는 것은 적합하지가 않다.

다음은 순차적 API 모드를 이용하여 7259372*59*3 크기의 이미지를 입력으로하여 처리하는 CNN 모델의 예이다.

def MyModel():
  return keras.models.Sequential([Input(shape=(72, 59, 3)),
                                  Conv2D(32, (3,3), activation='relu'), # Conv2D(32, (3,3)) = Conv2D(32, 3)
                                  MaxPool2D(), # MaxPool2D() = MaxPool2D(2) = MaxPool2D((2,2))
                                  Conv2D(64, (3,3), activation='relu'),
                                  MaxPool2D(),
                                  Conv2D(64, (3,3), activation='relu'),
                                  #Dropout(0.25),
                                  Flatten(),
                                  Dense(64, activation='relu'),
                                  Dense(2, activation='softmax') # output # output이 0, 1 각각의 확률로 2가지이다
                                 ])

Input, Conv2D, MaxPool2D, Flatten, Delse layer들이 Sequential모델에 순차적으로 연결되어 있는 것을 볼 수 있다.

3. 함수형 API

반면 함수형 API는 유연성이 매우 필요한 복잡한 모델을 만드는 데 이상적이다. 이것을 이용하면 단순히 순차적으로 이전 계층, 다음 계층만 고려하는 것이 아니라 하나의 계층에 더 많이 연결되는 계층을 포함한 모델을 정의할 수 있다. 모델을 정의할 때는 계층 인스턴스를 만들어 이를 쌍으로 묶어 서로 직접 연결하면 된다. 사실, 이 모델로는 계층을 다른 모든 계층 중 어디에든 연결할 수 있습니다. 이 모델 생성법을 이용하면 샴 네트워크(Siamese network), 잔류 네트워크(Residual network)와 같은 복잡한 네트워크, 다중 입력/다중 출력 모델, DAG(Directed Acyclic Graph) 및 공유 계층을 포함한 모델 등을 생성할 수 있다.
따라서 Multi-Label Classification을 위한 모델을 구성할 때에는 Keras에서 함수형 API로 구성해야만 한다!

다음은 함수형 API를 이용하여 7259372*59*3 크기의 이미지를 입력으로하여 처리하는 CNN 모델의 예이다.

def MyMultiModel():
  l_input = Input(shape=(72, 59, 3))
  l1 = Conv2D(32, (3,3), activation='relu')(l_input)
  l2 = MaxPool2D()(l1)
  l3 = Conv2D(64, (3,3), activation='relu')(l2)
  l4 = MaxPool2D()(l3)
  l5 = Conv2D(64, (3,3), activation='relu')(l4)
  l6 = MaxPool2D()(l5)
  l7 = Flatten()(l6)
  l8 = Dense(64, activation='relu')(l7)
  gender_output = Dense(2, activation='softmax')(l8)
  smile_output = Dense(2, activation='softmax')(l8)  
  l_output = Concatenate(axis=1)([gender_output, smile_output])  
  model = keras.Model(inputs=l_input, outputs=l_output)

  return model

각 layer들이 처음에는 일직선으로 연결이 되다가 layer l8이 Dense layer 2개의 입력으로 동시에 입력되는 것을 볼 수 있다. 즉 Multi-Label Classification 모델의 한 예로 최종 출력이 2가지 종류로 나가는 것을 볼 수 있다.

profile
바쁘게 부지런하게 논리적으로 살자!!!
post-custom-banner

0개의 댓글