딥러닝/정형데이터

케라스(keras) 함수적 api

씩씩한 IT블로그 2020. 6. 27. 20:59
반응형

keras의 계층적 구성은 input을 유연하게 쓰는데(계층별로 다르게 쓰는데) 한계가 있다.

따라서 함수적 api 사용을 통해서 계층별로 필요한 input값을 넣어서 모델을 구성할 수 있다.

다음과 같은 모델을 구성하여 보자.

1. input은 세개 (title,body,tags)가 있다

2. titlebody는 embedding,LSTM의 과정을 거친 후 tags input과 concatenate한다.

3. output layer를 각기다른 2개로 구성하여 priority, department 두개로 만든다.

 

1. 모델 함수화

from tensorflow.keras import layers
from tensorflow import keras

'''
input의 구성: (input,output,첫번째인풋의 차원,두번째인풋의 차원,세번째인풋의 차원,
                첫번째 아웃풋의 차원, 두번째 아웃풋의 차원)
'''
def my_model(X,Y,X_0,X_1,X_2,Y_0,Y_1):
    # title과 body는 임베딩과 LSTM, tags도 준비
    title_input = keras.Input(shape=(X_0,), name='title')  
    title_features = layers.Embedding(10000, 64, input_length=10,name="title_embedding")(title_input)
    title_features = layers.LSTM(128,name="title_LSTM")(title_features)
    
    body_input = keras.Input(shape=(X_1,), name='body')  
    body_features = layers.Embedding(10000, 64, input_length=100,name="body_embedding")(body_input)
    body_features = layers.LSTM(32,name="body_LSTM")(body_features)
    
    tags_input = keras.Input(shape=(X_2,), name='tags')  

    # concatenate를 통해 통합
    x = layers.concatenate([title_features, body_features, tags_input])

    # output layer 두개
    priority_pred = layers.Dense(Y_0, activation='sigmoid', name='priority')(x)
    
    department_pred = layers.Dense(Y_1, activation='softmax', name='department')(x)

    # Instantiate an end-to-end model predicting both priority and department
    model = keras.Model(inputs=[title_input, body_input, tags_input],
                        outputs=[priority_pred, department_pred])

    model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
                  loss=['binary_crossentropy', 'categorical_crossentropy'],
                  loss_weights=[1., 0.2])
    
    model.fit(X,Y,epochs=2,batch_size=32)
    
    return model

 

2. 인풋값 구성

import numpy as np

#np.random.randint(a,size=(r,c)) : 정수 0~9999를 크기 r*c행렬로 만듦
#np.random.random(size=(r,c)) : 실수 0~1을 크기 r*c행렬로 만듦

# Dummy input data
title_data = np.random.randint(10000, size=(1280, 10))
body_data = np.random.randint(10000, size=(1280, 100))
tags_data = np.random.randint(2, size=(1280, 12)).astype('float32')

# Dummy target data
priority_targets = np.random.random(size=(1280, 1))
dept_targets = np.random.randint(2, size=(1280, 4))

X=[title_data,body_data,tags_data]
Y=[priority_targets,dept_targets]

size_title=len(X[0][0])
size_body=len(X[1][0])
size_tags=len(X[2][0])

size_priority=len(Y[0][0])
size_departments=len(Y[1][0])

# 인풋값 확인
print("title")
print(title_data.shape)
print(title_data)

print("\nbody")
print(body_data.shape)
print(body_data)

print("\ntags")
print(tags_data.shape)
print(tags_data)

print("\npriority")
print(priority_targets.shape)
print(priority_targets)

print("\ndepartments")
print(dept_targets.shape)
print(dept_targets)

 

3. 모델학습

model=my_model(X,Y,size_title,size_body,size_tags,size_priority,size_departments)

model.summary()

 

반응형