반응형
keras의 계층적 구성은 input을 유연하게 쓰는데(계층별로 다르게 쓰는데) 한계가 있다.
따라서 함수적 api 사용을 통해서 계층별로 필요한 input값을 넣어서 모델을 구성할 수 있다.
다음과 같은 모델을 구성하여 보자.
1. input은 세개 (title,body,tags)가 있다
2. title과 body는 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()
반응형