본문 바로가기

Deep Learning/Keras & Tensorflow

keras.models.Model( )

320x100
320x100

 

 

 

 케라스에서 모델 설계를 할 때 Sequential( )을 주로 사용해왔다. 단순히 이전 layer의 output이 다음 layer의 input으로 들어가는 선형적인 경우에 사용해주면 아주 편리하기 때문이다. 그래서 단점도 존재한다. DenseNet( ) 같이 선형적 흐름이 아닌 모델 설계의 경우엔 사용하질 못 한다.

 

 keras.models.Model( )을 사용하면 Sequential( )의 불편한 점에서 벗어날 수 있다. 이 놈은 Multi Input / Multi Output을 지원한다.

 

 

 위와 같은 흐름을 갖는 모델을 설계하고 싶다면 Model( )을 사용해주면 된다.

import keras 
from keras.layers import Input, Embedding, LSTM, Dense
from keras.models import Model

main_input = Input(shape=(100,), dtype='int32', name='main_input')

x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)

lstm_out = LSTM(32)(x)

auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)

auxiliary_input = Input(shape=(5,), name='aux_input')

x = keras.layers.concatenate([lstm_out, auxiliary_input])
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)
x = Dense(64, activation='relu')(x)

main_output = Dense(1, activation='sigmoid', name='main_output')(x)

model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])

model.compile(optimizer='rmsprop', loss='binary_crossentropy', loss_weights=[1., 0.2])

 

 Line 15와 Line 22가 가장 큰 차별점이자 장점이다. Sequential( )와 달리 input tensor를 직접 지정해줘야 해서( = 지정해줄 수 있어서) 입력 전에 input을 변경한 다음 넣어줄 수 있다. keras.layers의 Conv2D, Dense, MaxPooling2D, Dropout, BatchNormalization 등과 같은 함수들을 통해 모델의 흐름을 다 잡아줬으면, Model( )의 input tensor와 output tensor에 넣어주기만 하면 모델 설계가 끝난다.

 

 

 


 

 

2021.09.28. 추가

 

 생성된 Model( ) 인스턴스에는 Tensor를 직접 넣어줄 수도 있고, predict_on_batch( ) 클래스 함수를 사용해서 numpy data를 넣어줄 수도 있다. 예제를 통해 확인해보자.

import numpy as np
import keras
import tensorflow as tf

np.random.seed(7)
tf.set_random_seed(7)

def build_sample_network():
    inputs  = keras.layers.Input(shape = (2,))
    outputs = keras.layers.Dense(units = 2, activation = 'relu')(inputs)
    return keras.models.Model(input = inputs, output = outputs)

# build network
model1 = build_sample_network()
model2 = build_sample_network()

# Test 1
print(model1.output)
print(model2(model1.output))

# Test 2
input_data = np.random.rand(1,2)
print(input_data)
print(model2.predict_on_batch(input_data))

 

 

[ 실행 결과 ]

 

 

< 참고 사이트 >

https://frhyme.github.io/machine-learning/a_model_in_keras/