카테고리 없음

20. TensorFlow 2.x - Functional API 소개

된다잘된다 2024. 8. 20. 11:29

참고: https://youtu.be/KugOEdth3iE?si=lB_ktFBaeng5nbih

 

왠 갑자기 Functional API? 라는 생각이 들 수도 있겠다. 처음 이 용어를 접했을 때, 엉? 그랬으니..

위 슬라이드를 보면 아~ 하는 소리가 바로 나올 것이다.

우리가 모델을 만들 때, model = Sequential() ... 이렇게 시작하는 것이 Sequential API 모델이다.

이것과 비교하면 Functional API는 여러 입력을 받을 수 있고, 병렬로 은닉층을 구성할 수 있으며,

또한 이들의 결과값을 합해서 출력을 만들어 낼 수도 있다.

 

Functional API를 사용한다는 것이 그렇다고 엄청 특별하고 달라지는 것은 아니다.

위 슬라이드에서 보는 것처럼 맨 처음 모델을 만드는 것만 다를 뿐...

 

같은 모델을 만들 때 다른 점을 비교해보자.

Sequential API 모델의 경우 먼저 Sequential()로 만들고 add()를 통해서 은닉층을 추가한 뒤에 출력층을 붙여주는 형식이었다면,

Functional API는 입력을 먼저 정의해주고, 그 출력을 은닉층에 넣어주는 형태로 구성한 뒤, 출력층을 정의하고 Model()에서 입출력을 모두 연결해주는 방식이다.

이렇게 하면, 입력과 은닉층의 출력을 다른 은닉층의 입력으로 어디든 보낼 수가 있게 된다.

 

위에서는 Sequential API와 Functional API로 둘다 만들 수 있는 모델이었지만,

이번엔 Functional API에서만 만들 수 있는 모델을 살펴보자.

예제는 입력이 두개이고 각각의 은닉층이 있으며, 이것을 합쳐서 출력하는 모델이다.

 

여기서 궁금한 것은 두개의 출력을 어떻게 연결할 것인가 일 것인데,

그냥 간단히 concatenate([out1, out2]) 해버리면 된다. 

그리고 끝에 전체 모델에 대한 입력과 출력을 잘 정의해야 한다. (위 슬라이드의 붉은색 박스)

 

설명만으로는 뭔소리 하는지 감이 잡히지 않을테니, 이전 글의 MNIST 예제를 Functional API로 바꿔보자.

https://firstmove.tistory.com/28

 

10. TensorFlow 2.x - CNN 소개

참고: https://youtu.be/1_70qe1XBV8?si=DS8euX9WWLW-NGg1  앞 글에서 Convolution이 무엇인지 대략적인 개념에 대해서 설명했다.이번에는 이 개념을 이용한 CNN(Convolutional Neural Network)에 대해서 알아보자.위의 슬

firstmove.tistory.com

 

 

위의 코드는 데이터를 받아서 정규화하는 과정이고,

아래는 Functional API를 사용하여 모델을 만드는 과정이다.

 

지난 글에서 CNN으로 구성한 Sequential 모델과 비교하는 것이 도움이 될 것이다.

 

다시 Functional API 모델로 돌아와서...

 

한번의 학습만으로 정확도가 엄청 좋아졌다. val_accuracy가 98%가 넘는다니...

마지막에서는 99%가 넘는다. 사실 val_accuracy는 많은 차이를 보여주진 않았다.

원래부터 너무 좋았던 탓일까?

 

새로운 데이터로 테스트를 해본 결과는 99%. 뭐 예상한 결과다. ㅎㅎ

 

 

학습 결과를 그림으로 그려보면, 앞에서 문제가 되었던 overfitting 문제는 여전히 있는 것으로 보인다.

사실 당연한 결과일 것이다. Sequential API를 사용했느냐, Functional API를 사용했느냐의 차이이지,

모델 자체를 변경한 것은 아니기 때문이다.

 

끝으로, Functional API를 사용할 때 주의할 점을 살펴보자.

표기 형식 때문에 발생하는 문제인데,

x = a() 라고 할때, a()의 결과값을 x에 저장하느냐,

아니면 x 자체가 a() 함수가 되느냐 하는 것이다. 

위의 x = a()(x) 코드에서 볼 수 있듯이, a()뒤에 함수의 인자(x)가 들어가기 때문에,

x = a()라고 하면 x는 함수 자체가 되는 것이다.

함수 자체냐, 함수의 결과 값이냐를 잘 따져야 한다는 것인데.... 뒤에 인자가 와야하느냐 아니냐를 잘 구분하자.

 

 

다음 글에서는 Transfer Learning에 대해서 알아보자.