LeeCreation! Media & Robot  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
[번역+약간해설] 케라스(Keras) 모델 만들기: Sequential vs. Functional

*번역은 검은 글자로, 제 의견은 푸른 글자로 구분지어 놓았습니다. 의역이 다소 포함되어 있습니다.


Keras로 예제 네트워크 구조를 공부해본 사람들이라면, 네트워크를 디자인하는 방법이 두 가지가 있다는 걸 발견할 수 있었을 것이다. 가장 기본적인 방법으로는 sequential 방법을 이용해서 직관적으로 레이어를 층층이 쌓아가는 것일텐데, 이 방법이 갖는 한계점이 있어서, functional 방법으로 네트워크 구조를 디자인하는 방법도 꽤나 사용되고 있었다. 우선, 그 둘 간의 차이가 무엇인지 검색해보던 중 간단한 글이 있어 공부도 할 겸 해당 글에 대한 번역을 시도해보았다.


원글 https://jovianlin.io/keras-models-sequential-vs-functional/


Keras 모델을 만드는데는 sequential 방법과 functional 방법이 있다.


먼저, sequential 방법은 층층이(layer-by-layer) 쌓아 올릴 수 있게 하는 방법으로 대부분 문제를 해결할 수 있다. 하지만, 이 방법은 layer를 공유하는 구조나, 다중 입력/출력을 사용하지는 못한다는 한계가 있다.


대신, functional 방법을 사용하면, layer가 앞/뒤 layer에만 연결된 구조뿐 아니라 훨씬 더 자유자재로 그 구조를 정의하여 사용할 수 있게된다. layer들을 어떤 layer에든지 연결해서 사용할 수 있는 것이다. 그래서 siamese 네트워크와 residual 네트워크 같은 복잡한 구조의 네트워크를 만들 수 있게 된다.


예제 코드를 보면서 확인해보자.

  • Sequential Models


위 예제 코드를 보면, layer들이 각각 하나씩 Sequential object인 model에 추가되고 있음을 알 수 있다. 입력 크기가 1이고 node 개수가 2인 중간 layer를 거쳐서 출력 크기가 1인 네트워크 구조다.


Sequential 모델을 이용하면 대부분의 딥러닝 모델을 만드는데 큰 무리는 없지만, 다음과 같은 한계점이 있다.

  1. 여러 소스의 입력을 받아오지 못한다.
  2. 여러 곳에 사용될 수 있는 다중 출력을 만들지 못한다.
  3. layer를 재사용할 수가 없다.
  • Functional Models

예제 코드에 주석이 한참 달려있어서 주석 해석도 포함하였다



# 입력 정의하기

# Sequential 모델과는 달리, 여기서는 독립적인 "입력" layer를 만들어주어야 한다. 그리고 그 입력 데이터의 shape도 지정해 주어야 한다. 그래서 입력 layer는 tuple 형태의 shape 인수를 넘겨 받아 입력 데이터의 차원을 결정한다. 만약 입력 데이터가 1차원이더라도(1차원의 값이 아니라 1차원 벡터와 같은), 입력 shape에는 batch 크기를 설정하기 위해 한 차원을 더 지정해두어야 한다. 따라서, tuple 형태의 shape은 항상 마지막에 한 차원을 더해서 정의되어 사용된다. 위 코드에서도 shape을 (2)가 아니라 쉼표를 더해 (2,)라고 사용하고 있다.



# Layer 연결하기

# 여기서 layer들은 짝맞춤(pairwise)으로 연결되어진다. 새 layer가 추가될 때, 어떤 입력을 사용할 건지 명확히 지정해주어야 한다. 예제 코드를 보면 괄호를 이용해서 Dense layer 뒤에 어떤 입력 layer가 연결되는지를 지정해주었다.



# 모델 생성

# 모든 layer들이 다 만들어졌다면, 마지막으로 전체 모델을 정의해야 한다. Sequential 방법에서와 했던 것과 같이, 여기서도 summarize, fit, evaluate, prediction을 다 사용할 수 있다. 모델을 만들려면 Keras에서 제공하는 Model()함수에 입력과 출력만 정의해주면 된다.


참고로 앞서 sequential 방법의 예제코드에서는 입력 크기 1, node가 두개인 중간 layer, 출력 크기 1의 네트워크 모델의 예시였는데, fuctional 방법 예제코드에서는 입력 크기 1, 그리고 중간 layer 없이 출력크기 2인 네트워크 모델의 예시다.


Keras의 functional 방법은 훨씬 더 유연한 모델 정의 방법을 제공한다.


특별히, layer들을 공유할 수 있을 뿐만 아니라, 입력과 출력의 모델을 여러개로 정의할 수도 있다. 더 나아가서, ad hoc acyclic network 그래프도 만들 수 있다.


Ad hoc acyclic network를 여기서 굳이 자세하게 다룰 필요는 없을 것 같다. 사실 본인도 잘 모르겠다. 짧게 검색하니 아래 글[1]이 나오는데 대충 이런거구나 알고 넘어가면 될 것 같다. 여러 개가 다중으로 연결된 망 같은 거라고 하면 되려나..? 어쨌든 이러한 구조도 functional 방법으로 디자인이 가능하다는 이야기다.

[1] http://blog.acronym.co.kr/128


그래서 모델들은 layer들의 instance들을 입출력 쌍으로 연결함으로써 만들어지게 되고, Model()함수에 입력과 출력을 파라미터로 지정해줌으로써 구현된다.


Functional 방법에 대해 장점을 이토록 입이 마르도록 이야기하는 걸 보니, 다음 번 공부 자료는 functional API에 대해 더 설명한 [2, 3] 자료를 공부하는 것으로 해야겠다.

[2] https://keras.io/getting-started/functional-api-guide/

[3] https://machinelearningmastery.com/keras-functional-api-deep-learning/




BLOG main image
미디어와 로봇에 관심이 많은 아이 그 영역을 넓혀보려 합니다. '영상 제작'과 '감정 로봇'이 블로그의 주소재입니다. 자유로운 답글 환영합니다!
 Notice
 Category
전체보기 (749)
내가 사랑하는 MJ (0)
아이가 생긴다면 (4)
Media (98)
Robot (447)
타인과 약자를 위한 (81)
Etc. (118)
 TAGS
연구
 Calendar
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
 Recent Entries
 Recent Comments
 Recent Trackbacks
 Archive
 Link Site
LeeCreation! Media & Robot
 Visitor Statistics
Total :
Today :
Yesterday :
rss