多任务学习(二)

多任务学习(二)

from keras.layers import Input,LSTM,Bidirectional,Dense,Dropout,Concatenate,Embedding,GlobalMaxPool1D
from keras.models import Model
from keras_contrib.layers import CRF
import keras.backend as K
from tensorflow.keras.utils import plot_model
import keras
K.clear_session()

搭建模型

maxlen=40
# 输入
inputs=Input(shape=(maxlen,768),name='sen_emb')     # (None, 40, 768)
pos1_en=Input(shape=(maxlen,),name='pos_en1_id')
pos2_en=Input(shape=(maxlen,),name='pos_en2_id')      #shape=(None, 40)
pos1_emb = Embedding(maxlen,8,input_length=maxlen,name = "pos_en1_emb")(pos1_en)
pos2_emb = Embedding(maxlen,8,input_length=maxlen,name = "pos_en2_emb")(pos2_en)  # (None, 40, 8)


x = Concatenate(axis=2)([inputs,pos1_emb,pos2_emb])

# 参数共享部分
x=Bidirectional(LSTM(128,return_sequences=True))(x)
# 任务一:10分类的文本分类人去
out1=GlobalMaxPool1D()(x)
out1=Dense(64,activation='relu')(out1)
out1=Dropout(0.5)(out1)
out1=Dense(10,activation='softmax',name='out1')(out1)

# 任务二:实体识别分类
crf=CRF(2,sparse_target=True,name='crf_output')
crf_output = crf(x)

# 模型有两个输出out1,crf_output
model=Model(inputs=[inputs,pos1_en,pos2_en],outputs=[out1,crf_output])
model.summary()

在这里插入图片描述

编译模型

# 编译模型
# 模型有两个loss:categorical_crossentropy和crf.loss_function
model.compile(optimizer='adam',
              loss={
    
    'out1':'categorical_crossentropy','crf_output':crf.loss_function},
              loss_weights={
    
    'out1':1,'crf_output':1},
              metrics=['acc'])
plot_model(model,to_file='model.png')

在这里插入图片描述

参考文献:

https://zhuanlan.zhihu.com/p/107737884

https://blog.csdn.net/xuluohongshang/article/details/79044325

猜你喜欢

转载自blog.csdn.net/fyfy96/article/details/121292638