多任务学习(二)
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
该博客介绍了如何使用Keras构建一个多任务学习模型,其中包括两个任务:10分类的文本分类和实体识别。模型利用了双向LSTM和CRF层,同时应用了位置嵌入。模型的输入包括句子嵌入、词性标签1和词性标签2的嵌入,通过concatenate、全局最大池化、全连接层等操作进行特征融合和分类。最后,模型使用了Adam优化器,分别对两个任务进行了编译,并绘制了模型结构图。

被折叠的 条评论
为什么被折叠?



