Keras는 Theano와 Tensorflow 기반의 딥러닝용 고차원 라이브러리이다. Python 언어로 쓰여 광범위한 딥러닝 모델을 깔끔하고 편리하게 제작할 수 있다. Keras는 신경망 개발 및 테스트에 관한 한 가장 애용되는 고수준 신경망 API 중 하나로 자리 잡고있다. Keras 고수준 API 덕분에 요즘은 신경망 계층을 생성하고 복잡한 아키텍처를 설정하는 것쯤은 간단한 일이 되었다. Keras 모델은 시퀀스나 독립 실행형 그래프 하나로 구성된다. 딥러닝 학습 관련 모듈이 여러 개 있어 이를 이리저리 조합하여 새 모델을 만들면 된다. 이렇게 함께 플러깅할 수 있는 구성 방식 모듈 중에는 신경층, 비용 함수, 최적화 프로그램, 초기화 방식, 드롭아웃, 손실, 활성화 함수 및 정규화 방식 등이 있다. 모듈 방식의 주된 장점 중 하나는 새 기능을 별도의 모듈로 손쉽게 추가할 수 있다는 점다. 따라서 Keras는 매우 유연하여 혁신적인 연구에 아주 적합하다.
Keras 모델은 순차적(sequential), 함수형(functional) API 두 가지 방식으로 개발하면 됩니다.
순차적 API 모델은 가장 단순한 모델이며 선형 파일(pile) 계층으로 구성되어 대부분 문제점에 계층별(layer-by-layer)로 모델을 구성할 수 있다. 순차적 모델은 사용하기 아주 간편하지만, topology에 한계가 있다.
이 한계는 공유 계층(다양한 여러 입력으로부터 하나의 계층을 공유하는 것)으로는 모델을 구성할 수 없고 따라서 입력이나 출력이 동시에 여러개일 경우에는 순차적 API 모드로는 모델을 구성할 수 없다는 문제가 있다. 이러한 이유로 출력에서 label의 종류가 1가지가 아닌 여러 종류의 label로 출력이 되는 Multi-Label Classification 용 모델에서는 순차적 API 모드로 모델을 구성하는 것은 적합하지가 않다.
다음은 순차적 API 모드를 이용하여 크기의 이미지를 입력으로하여 처리하는 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모델에 순차적으로 연결되어 있는 것을 볼 수 있다.
반면 함수형 API는 유연성이 매우 필요한 복잡한 모델을 만드는 데 이상적이다. 이것을 이용하면 단순히 순차적으로 이전 계층, 다음 계층만 고려하는 것이 아니라 하나의 계층에 더 많이 연결되는 계층을 포함한 모델을 정의할 수 있다. 모델을 정의할 때는 계층 인스턴스를 만들어 이를 쌍으로 묶어 서로 직접 연결하면 된다. 사실, 이 모델로는 계층을 다른 모든 계층 중 어디에든 연결할 수 있습니다. 이 모델 생성법을 이용하면 샴 네트워크(Siamese network), 잔류 네트워크(Residual network)와 같은 복잡한 네트워크, 다중 입력/다중 출력 모델, DAG(Directed Acyclic Graph) 및 공유 계층을 포함한 모델 등을 생성할 수 있다.
따라서 Multi-Label Classification을 위한 모델을 구성할 때에는 Keras에서 함수형 API로 구성해야만 한다!
다음은 함수형 API를 이용하여 크기의 이미지를 입력으로하여 처리하는 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가지 종류로 나가는 것을 볼 수 있다.