Keras Framework Model API

geunyeongii·2022년 10월 9일
0

Keras 딥러닝

목록 보기
1/3
post-thumbnail

신경망 모델과 Dense Layer

Keras 에서는 모델을 만드는 방법이 세가지가 있다.

  1. Sequential Model
  2. Funtional Model
  3. Model Subclassing

Sequential vs Functional API

  • 일반적으로 Sequential()을 이용하여 Model 을 만들면 쉽게 Model을 생성할 수 있음
  • 하지만 Keras Framework의 핵심은 Functional API임. 처음부터 Sequential 에 의존하게 되면서 반드시 알아야 할 Functional API 를 이용하여 Model 을 만드는 것을 회피하기 쉬움
  • 처음부터 Functional API로 모델 생성 및 활용 기법을 안 뒤에 작고 간편하게 모델을 생성할 경우에만 Sequential을 활용하는 것이 보다 바람직함.

Toy Neural Network

A. Using Sequential API

##Import the libraries
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.optimizers import Adam
## Creating the model
model = Sequential()
model.add(Dense(4,activation='relu')) ##<----- You don't have to specify input size.Just define the hidden layers 
model.add(Dense(4,activation='relu'))
model.add(Dense(1))
## defining the optimiser and loss function
model.compile(optimizer='adam',loss='mse')
## training the model
model.fit(x=X_train,y=y_train,
          validation_data=(X_test,y_test),
          batch_size=128,epochs=400)

이 코드는 자동으로 Input의 크기가 자동으로 인식되고, 다른 레이어를 추가하거나 제거하기가 어렵다. Sequential API는 모델 생성이 쉽지만 자유롭지 못하다는 것이 단점이다.

B. Using Functional API

  • Input Layer를 내가 직접 지정하여 넣을 수 있다.
  • 레이어에 이름을 지정하고 뉴런 수, 활성화 함수 등을 지정하여 레이어를 정의할 수 있다.
  • 그런 다음 이전 레이어를 괄호 세트에 넣는다. = Dense(, activation=)()
##Import the libraries
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input,Dense
## Creating the layers
input_layer = Input(shape=(3,))
Layer_1 = Dense(4, activation="relu")(input_layer)
Layer_2 = Dense(4, activation="relu")(Layer_1)
output_layer= Dense(1, activation="linear")(Layer_2)
##Defining the model by specifying the input and output layers
model = Model(inputs=input_layer, outputs=output_layer)
## defining the optimiser and loss function
model.compile(optimizer='adam',
              loss='mse')
## training the model
model.fit(X_train, y_train,epochs=400, batch_size=128,validation_data=(X_test,y_test))

이렇게 되면 다른 추가 적인 히든 레이어를 붙일 수 있게 된다.
이 사진에서 알 수 있듯이 두 번째 숨겨진 레이어 다음에 하나의 레이어가 더 추가될 수 있다. 두 번째 히든 레이어의 출력은 'y1'을 예측하는 데 사용되며 동시에 두 번째 출력 'y2'를 예측하는 하나 이상의 레이어(분기된 은닉 레이어)로 가게 된다.

두 번째 출력을 예측하기 위해 더 많은 레이어와 뉴런을 추가할 수 있다. 이것이 Functional API가 제공하는 유연성 때문에 Sequential API보다 우위에 있는 부분이다. 이를 사용하여 동시에 여러 출력을 예측할 수 있는데, 순차 API를 사용하여 출력 y1 및 y2를 예측하기 위해 2개의 다른 신경망을 구축했지만 Functional API를 사용하면 단일 네트워크에서 두 개의 출력을 예측할 수 있게 된다.

Use Case

##define input layer
input_layer = Input(shape=(3,),name='input_layer')

##Defining 2 hidden layers
Layer_1 = Dense(10, activation="relu",name='Layer_1')(input_layer)
Layer_2 = Dense(10, activation="relu",name='Layer_2')(Layer_1)

##Defining  output layer y1
y1_output= Dense(1, activation="linear",name='y1_output')(Layer_2)

##Defining Branched layer
Branched_layer=Dense(10, activation="relu",name='Branched_layer')(Layer_2)

##Defining 2nd output layer y2
y2_output= Dense(1, activation="linear",name='y2_output')(Branched_layer)

##Defining the model by specifying the input and output layers
model = Model(inputs=input_layer,outputs=[y1_output,y2_output])

이렇게 y2로 가는 Branched Hidden Layer를 만들 수 있다.

C. Model SubClassing

from tensorflow.keras.layers import Layer, Input
from tensorflow.keras.models import Model
import tensorflow as tf

class CustomDense(tf.keras.layers.Layer):
    # CustomDense 객체 생성시 입력되는 초기화 parameter 처리
    def __init__(self, units=32):
        super(CustomDense, self).__init__()
        self.units = units

    def build(self, input_shape):
        self.w = self.add_weight(
            shape=(input_shape[-1], self.units),
            initializer="random_normal",
            trainable=True,
        )
        self.b = self.add_weight(
            shape=(self.units,), initializer="random_normal", trainable=True
        )
        
    # CustomDense 객체에 callable로 입력된 입력 데이터 처리. 
    def call(self, inputs):
        return tf.matmul(inputs, self.w) + self.b

# input 값을 4개의 원소를 가지는 1차원으로 생성. 
inputs = Input((4,))
# 10개의 unit을 가지는 CustomDense 객체를 생성 후 callable로 inputs값 입력 
outputs = CustomDense(10)(inputs)

# inputs와 outputs로 model 생성. 
model = Model(inputs, outputs)
model.summary()
  • init(self, param1, ,,, ): 해당 Layer의 속성값을 입력 받음 내부 변수로 활용할 수 있는 로직 처리

  • call(self, inputs): 해당 Layer가 받은 입력값을 이용한 로직 처리

  • build(self, input_shape): 실제로 input 데이터가 몇개가 들어올지는 layer가 instantiating 되어야 알 수 있으므로 weight값을 할당하는 로직 등을 처리



출처

https://www.analyticsvidhya.com/blog/2021/07/understanding-sequential-vs-functional-api-in-keras/

profile
✏️세상의 모든 기록 ✏️

0개의 댓글