Keras 如何使用编解码器lstm正确生成序列?

Keras 如何使用编解码器lstm正确生成序列?,keras,lstm,seq2seq,data-generation,encoder-decoder,Keras,Lstm,Seq2seq,Data Generation,Encoder Decoder,我正在实现一些代码,以根据文章“使用编码器-解码器LSTM生成用于语义槽填充的标记数据”()生成用于自然语言理解(NLU)的标记数据。我的体系结构是一个简单的编码器-解码器LSTM,但由于我生成的句子(用于单词和标签)不正确,我尝试生成与我作为输入给出的句子完全相同的句子(仅单词)。不幸的是,这是不正确的工作 我使用vord2vec进行单词嵌入,嵌入的维度设置为64(如本文所建议的)。编码器LSTM以相反的顺序接收序列,并且丢失率为0.5。解码器LSTM还具有0.5的丢失率和用于序列的每个输出的

我正在实现一些代码,以根据文章“使用编码器-解码器LSTM生成用于语义槽填充的标记数据”()生成用于自然语言理解(NLU)的标记数据。我的体系结构是一个简单的编码器-解码器LSTM,但由于我生成的句子(用于单词和标签)不正确,我尝试生成与我作为输入给出的句子完全相同的句子(仅单词)。不幸的是,这是不正确的工作

我使用vord2vec进行单词嵌入,嵌入的维度设置为64(如本文所建议的)。编码器LSTM以相反的顺序接收序列,并且丢失率为0.5。解码器LSTM还具有0.5的丢失率和用于序列的每个输出的softmax层,以映射最可能的字。输入与目标(相同的句子)完全相同,因为首先我想生成完全相同的句子

对于培训,我使用Adam optimizer和分类交叉熵来计算损失。为了进行推断,我在生成序列时使用了beam搜索(B=3)

我的培训代码:

def预训练嵌入层(emb):
vocab_len=len(emb)
emb_dim=len(emb[0])
emb_层=嵌入(vocab_len,emb_dim,trainable=False)
emb_layer.build((无)
emb\u层。设置\u权重([emb])
返回emb_层
LSTM_encoder=LSTM(1024,辍学=0.5,返回_状态=True,向后走=True,name='LSTM_encoder')
LSTM_decoder=LSTM(1024,dropout=0.5,return_sequences=True,return_state=True,name='LSTM_decoder')
密集度=密集度(声音大小,激活='softmax',name=“word\u输出”)
K.设定学习阶段(1)
def型号1 enc dec(输入形状,带emb):
单词索引=输入(shape=Input\u shape,dtype='int32')
wemb_层=预训练_嵌入_层(w_emb)
wemb=wemb_层(单词索引)
enc_输出、enc_状态、enc_状态=LSTM_编码器(wemb)
编码器状态=[enc\u state\u h,enc\u state\u c]
dec_out,dec_state_h,dec_state_c=LSTM_解码器(wemb,
初始状态=编码器状态)
dec_out=密集(dec_out)
模型1=模型(输入=[words\u index],输出=[dec\u out])
返回模式1
模型=模型1(maxlen),w\U emb,s\U emb)
model.summary()
compile(loss=“categorical\u crossentropy”,optimizer='adam',metrics=['accurity'])
model.fit(train_w,train_lab_w,validation_data=(val_w,val_lab_w),epochs=epochs,verbose=1,shuffle=True)
我的推理代码:

wemb_layer=Embedding(len(w_emb),len(w_emb[0]),trainable=False)
wemb_layer.build((无,))
LSTM_encoder=LSTM(1024,返回_状态=True,返回=True,name='LSTM_encoder')
LSTM_decoder=LSTM(1024,返回_序列=True,返回_状态=True,name='LSTM_decoder')
密集度=密集度(声音大小,激活='softmax',name=“word\u输出”)
def目标_模型(输入_形状):
单词索引=输入(shape=Input\u shape,dtype='int32')
wemb=wemb_层(单词索引)
enc_输出、enc_状态、enc_状态=LSTM_编码器(wemb)
编码器状态=[enc\u state\u h,enc\u state\u c]
dec_out,dec_state_h,dec_state_c=LSTM_解码器(wemb,
初始状态=编码器状态)
dec_out=密集(dec_out)
模型=模型(输入=[words\u index],输出=[dec\u out])
回归模型
target_model=target_model((maxlen,))
wemb_层。设置_权重(model1.layers[1]。获取_权重())#层0:输入
LSTM_编码器。设置_权重(model1.layers[2]。获取_权重()
LSTM_解码器。设置_权重(model1.layers[3]。获取_权重()
密集加权。设置加权(model1.layers[4]。获取加权()
def model1_enco_进料(输入形状):
单词索引=输入(shape=Input\u shape,dtype='int32')
wemb=wemb_层(单词索引)
enc_输出、enc_状态、enc_状态=LSTM_编码器(wemb)
编码器模型=模型(输入=文字索引),输出=状态,
enc_state_c])
返回编码器模型
def model1_deco_infe(输入_形状):
dec\u word\u input=input(shape=input\u shape,dtype='int32')
dec\u state\u input\u h=input(形状=(1024,))
dec\u state\u input\u c=input(形状=(1024,))
wemb=wemb\U层(dec\U字输入)
dec_states_input=[dec_state_input_h,dec_state_input_c]
dec_out,dec_state_h,dec_state_c=LSTM_解码器(wemb,
初始状态=dec状态(输入)
dec_states_output=[dec_state_h,dec_state_c]
deco_out=密集_w(dec_out)
解码器模型=模型(输入=[dec\u word\u input]+dec\u states\u input,输出=
[deco_out]+dec_状态(输出)
返回解码器模型
编码器模型=模型1编码输入((maxlen,)
解码器\u模型=模型1\u装饰\u输入((1,))
def波束搜索B(装饰出波束):
单词索引=[]
dw=deco_w_out.copy()
对于范围内的i(光束):
word_index=np.argmax(dw,axis=-1)
dw[0][0][word_索引[0][0]]=0
words\u index.append(word\u index[0][0])
返回单词索引
def generate_model 1_add(单词顺序、编码器型号、解码器型号、dec_单词输入、id2word、beam):
[enc_state_h,enc_state_c]=编码器模型。预测(单词顺序)
状态=[enc_state_h,enc_state_c]
单词\句子=“”
probs_word=[]
单词和句子=[]
dec_word_输入=[]
状态_beam=[]
停止条件=错误
[dec_w_out,dec_state_h,dec_state_c]=
解码器模型预测([dec_word_input]+状态)
单词索引,波束搜索(dec w out,[],波束)
对于范围内的i(光束):
probs_word.append(-log(dec_w_out[0][0][words_index[i]]))
单词和句子。追加(id2word[单词索引[i]]
dec_word_inputs.append([words_index[i]])
states\u beam.append([dec\u state\u h,dec\u state\u c])
n_单词=1
结束游戏=[]
在不停止的情况下:
单词索引、单词句子、问题单词、状态,
[], []
对于范围内的k(光束):
[dec_w_out,dec_state_h,dec_state_c]=
解码器模型预测([dec_word_inputs[k]]+状态_beam[k])
单词索引,波束搜索(dec w out,[],波束)
国家=[