본문 바로가기
Artificial Intelligence/Keras

[Tensorflow 2][Keras] Week 4 - Complex Architectures with the Functional API

by 개발자J의일상 2021. 3. 30.
반응형

본 포스팅은 다음 과정을 정리 한 글입니다.

 

Custom Models, Layers, and Loss Functions with TensorFlow

www.coursera.org/specializations/tensorflow-advanced-techniques

 

지난 시간 리뷰

2021.03.27 - [Artificial Intelligence/Keras] - [Tensorflow 2][Keras] Week 3 - Assignment: Custom Layers

 

[Tensorflow 2][Keras] Week 3 - Assignment: Custom Layers

본 포스팅은 다음 과정을 정리 한 글입니다. Custom Models, Layers, and Loss Functions with TensorFlow www.coursera.org/specializations/tensorflow-advanced-techniques 지난시간 리뷰 2021.03.27 - [Artifi..

mypark.tistory.com

Intro to custom models, Complex architectures with the Functional API, Coding a Wide and Deep model

 

우리는 예전 시간에 Functional API를 사용하여 모델을 생성하는 방법을 배웠었습니다.

 

다시 한번 살펴보면 여기에서 모델 클래스를 확장하여 코드를 캡슐화하는 기능을 이해할 수 있습니다.

 

아래 모델의 예시를 보면, 단순히 레이어들이 한 방향으로 계속되는 것이 아니라 concatenate를 통해 다른 layer와 연결이 되는 복잡한 model임을 알 수 있습니다. 우리는 이와 같은 model을 만들기 위해 functional API를 사용해야 합니다.

 

아래 유형의 네트워크는 deepened wide model의 매우 간단한 예입니다. 

 

하나의 입력 경로가 여러 계층의 뉴런으로 딥 러닝을 거치고 네트워크로 연결되고 다른 입력 경로는 그렇지 않은 경우 일반적으로 shallow or a wide layer라고 불립니다.

 

Deep input은 두 개의 Dense layer를 통해 공급되어지고, wide input은 deep input과 병렬로 작동하는 또 다른 입력입니다. 그다음 두 입력이 합쳐지고 Dense layer를 통해 output이 나오게 됩니다.

 

 

어떻게 코드로 구현하는지는 아래와 같습니다.

 

 

Wide_Input을 input_a로 선언하고 shape는 1 그리고 이름은 "Wide_Input"으로 설정합니다.

 

다음 Deep_Input은 input_b로 선언하고 shape는 1 그리고 이름은 "Deep_Input"으로 설정합니다.

 

hidden_1은 30개의 unit이 있는 Dense layer이고 hidden_2도 마찬가지입니다. input_b에 연결하고 hidden_1은 hidden_2에 연결해주면 왼쪽 부분이 연결되었습니다.

 

그 다음 input_a와 hidden_2를 concatenate layer로 연결하고

output을 unit이 1개인 Dense layer를 통해 얻어냅니다.

 

마지막으로 모델을 선언할 때 모델 호출을 통해 입력 및 출력 목록을 전달합니다.

두 개의 입력이 있으므로 inputs에 2개의 input을 모두 넣어주고 출력은 1개이므로 output만 작성해줍니다. 

굉장히 모델을 유연하게 작성할 수 있죠?

 

다른 예를 들어보면, input으로 2개를 받고 output으로 2개를 출력하는 모델을 만들고 싶다고 하면 아래와 같이 aux_Output을 추가해 봅시다.

 

aux_output은 hidden_2에서 연결하게 해 놨는데요. hidden_2는 이미 concatenate에 연결되어 있지만 이 것도 가능합니다. 그냥 aux_output을 Model의 outputs에 추가해 주면 모델 생성이 완료됩니다. 

 

Keras 모델 다이어그램이 그려진 게 달라지긴 했지만 아키텍처 자체는 변경이 되지 않았습니다. 

 

이제 우리는 복잡한 아키텍처를 생성할 때 Functional API가 제공하는 많은 유연성을 배웠습니다. 

 

그럼 이 코드를 클래스로 캡슐화하여 학습 코드를 훨씬 더 깔끔하게 유지하는 방법에 대해 알아보겠습니다.

 

아래 클래스가 기본 keras 모델을 확장하면 학습 및 추론 실행 등과 같은 모델로 수행할 수있는 모든 작업을 수행 할 수 있습니다.

 

이와 같이 모델 클래스를 확장할 때 최소한 다음 두 가지 메서드를 구현해야 합니다.

 

첫 번째 init는 클래스를 초기화하며 이 클래스가 확장하는 기본 클래스를 초기화하는데도 사용해야 합니다. 

 

이 경우 그것은 모델 클래스이고 내부 변수의 인스턴스를 생성하거나 이 클래스가 사용할 것을 명시합니다. 

 

지난주에 custom layer에서 배웠던 것과 비슷하다고 느껴지신다면 성공하신 겁니다 ㅎㅎ

패턴은 거의 동일하거든요!

 

모델에는 hidden layer와 Dense layer로 이루어진 output들이 있습니다. 

 

init함수를 사용하여 이를 나타내는 self 변수를 만들 수 있습니다. 

 

그다음 필요한 함수는 call 함수입니다.

 

이 함수는 클래스가 생성될 때 실행되고 여기에서 모델 출력을 정의할 수 있으며 이는 call 함수에 의해 return 됩니다. 

 

출력은 모델 아키텍처를 통한 입력을 기반으로 생성되므로 여기에서 전체 아키텍처를 효과적으로 캡슐화

수 있습니다.

 

 

inputs을 전달하고 네트워크 아키텍처를 통해 데이터를 전달하여 다시 반환할 수 있는 출력(main_output, aux_output)을 얻습니다. 

 

 

이제 이 클래스를 정의한 후에는 이와 같은 인스턴스를 사용하여 모델을 생성합니다. 이는 모델을 생성하기가 쉽고 메인 코드가 훨씬 더 깔끔하게 유지됩니다. 그리고 레이어 생성이 분리되어 있기 때문에 훨씬 더 많은 이점이 있습니다. call 함수에서 더 흥미로운 작업을 수행할 수 있습니다.

 

예를 들어 여러 계층을 정의하는 루프가 있을 수 있고 if, else문이나 다른 작업이 있을 수도 있습니다.

Functional or Sequential API를 사용하는 모델의 정적 선언에 국한되지 않고 더 큰 모델에서 사용할 수 있는 하위 네트워크를 정의할 수 있습니다. 이는 나중에 다뤄보도록 하겠습니다. 

 

감사합니다.

 

 

 

300x250

댓글