tensorflow2.0(Keras)实现seq2seq+Attention模型的对话系。。。
本⽂⽬录结构
序列⽣成的两种⽅法⽐较
seq2seq模型介绍
Keras实现seq2seq+Atttention模型
模型详细结构
seq2seq模型训练
模型预测
序列⽣成的两种⽅法⽐较:
通⽤的解释:
以Encoder-Decoder框架为例,输⼊Source和输出Target内容是不⼀样的,⽐如对于英-中机器翻译来说,
Source是英⽂句⼦,Target 是对应的翻译出的中⽂句⼦,Attention发⽣在Target的元素Query和Source中的所有元素之间。
Self Attention,指的不是Target和Source之间的Attention机制,⽽是Source内部元素之间或者Target内部元素之间发⽣的Attention 机制,也可以理解为Target=Source这种特殊情况下的Attention。
本⽂主要是利⽤Tensorflow中keras框架记录简单实现seq2seq+Attention模型的过程,seq2seq的应⽤主要有问答系统、⼈机对话、机器翻译等。代码中会⽤⼀个中⽂对话数据简单测试。
seq2seq模型介绍
基于注意⼒机制的seq2seq模型:
Keras实现seq2seq+Atttention模型
本⽂的实现是基于Tensorflow 2.0中的keras,也可以⽤原始的keras也可以,如果⽤原始的keras,需要⾃⼰实现Attention层。
class Encoder(keras.Model):
def__init__(self, vocab_size, embedding_dim, hidden_units):
super(Encoder, self).__init__()
# Embedding Layer
# Encode LSTM Layer
def call(self, inputs):
encoder_embed = bedding(inputs)
encoder_outputs, state_h, state_c = der_lstm(encoder_embed)
return encoder_outputs, state_h, state_c
Decoder部分
decoder部分结构,有三部分输⼊,⼀是encoder部分的每个时刻输出,⼆是encoder的隐藏状态输出,三是decoder的⽬标输⼊。另外decoder还包含⼀个Attention层,计算decoder每个输⼊与encoder的注意⼒。
class Decoder(keras.Model):
def__init__(self, vocab_size, embedding_dim, hidden_units):
super(Decoder, self).__init__()
# Embedding Layer
# Decode LSTM Layer
self.decoder_lstm = LSTM(hidden_units, return_sequences=True, return_state=True, name="decode_lstm")
# Attention Layer
self.attention = Attention()
def call(self, enc_outputs, dec_inputs, states_inputs):
decoder_embed = bedding(dec_inputs)
dec_outputs, dec_state_h, dec_state_c = self.decoder_lstm(decoder_embed, initial_state=states_inputs)
attention_output = self.attention([dec_outputs, enc_outputs])
return attention_output, dec_state_h, dec_state_c
Encoder和Decoder合并
encoder和decoder模块合并,组成⼀个完整的seq2seq模型。
def Seq2Seq(maxlen, embedding_dim, hidden_units, vocab_size):
"""
seq2seq model
"""
# Input Layer
encoder_inputs = Input(shape=(maxlen,), name="encode_input")
decoder_inputs = Input(shape=(None,), name="decode_input")
# Encoder Layer
encoder = Encoder(vocab_size, embedding_dim, hidden_units)
enc_outputs, enc_state_h, enc_state_c = encoder(encoder_inputs)
dec_states_inputs =[enc_state_h, enc_state_c]
# Decoder Layer
decoder = Decoder(vocab_size, embedding_dim, hidden_units)
attention_output, dec_state_h, dec_state_c = decoder(enc_outputs, decoder_inputs, dec_states_inputs)
# Dense Layer
dense_outputs = Dense(vocab_size, activation='softmax', name="dense")(attention_output)
# seq2seq model
model = Model(inputs=[encoder_inputs, decoder_inputs], outputs=dense_outputs)
return model
模型详细结构
我们⾃定义⼀些参数,看看seq2seq模型的整个结构
从上⾯seq2seq模型中获取Encoder⼦模块:
def encoder_infer(model):
encoder_model = Model(_layer('encoder').inputs,
_layer('encoder').outputs)decoder
return encoder_model
encoder_model = encoder_infer(model)
从上⾯seq2seq模型中获取Decoder⼦模块,这⾥没有直接从decoder层取,⽅便后续decoder的预测推断。
seq2seq模型训练
这⾥我们以⼀个中⽂的聊天对话数据作为训练语料,训练⼀个简单的对话系统demo。语料已经分过词,⾸先对数据做⼀下预处理,转成one-hot表⽰,并添加⼀些开始结束符。
读取数据以及词典的⽅法

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。