【Python机器学习】序列到序列建模和注意力机制——训练序列到序列网络

在Keras模型中,创建序列到序列模型的最后一个步骤是编译(compile)和拟合(fit)。与其他神经网络模型相比,唯一的区别在于,之前预测的是二元分类:是或不是。这里有一个单分类或多分类的问题。在每个时刻,必须确定许多"类别"中的哪一个是正确的,这里有很多类别。模型必须在所有可能的词条之间进行选择。因为预测是使字符或词,而不是二进制状态,所以将基于categorical_crossentropy损失函数进行优化,而不是基于binary_crossentropy。因此,这是需要对Keras代码中model.compile步骤进行的唯一更改:

python 复制代码
model.compile(optimizer='rmsprop',loss='categorical_crossentropy')
model.fit([encoder_input_data,decoder_input_data],
          decoder_target_data,
          batch_size=batch_size,
          epochs=epochs)

通过调用model.fit函数,这里正在训练序列到序列的端到端网络。

生成输出序列

在生成序列之前,需要获取训练层的结构,并将其重新组装以用于生成序列。首先,定义特定编码器的模型,这个模型将被用来生成思想向量:

python 复制代码
encoder_model=Model(inputs=encoder_inputs,outputs=encoder_states)

解码器的定义看起来不易理解。首先,我们将定义解码器的输入,这里使用Keras输入层,但是传递的是编码器网络生成的思想向量,而不是传递独热向量、字符或词嵌入。要注意的是编码器返回一个包含两种状态的列表,在调用之前定义的decoder_lstm时,需要将该列表传递给之前也定义过的稠密层。该层的输出将提供所有解码器输出词条的概率。

在每个时刻,预测概率最高的词条接下来将作为最有可能的词条返回给解码器网络,并作为新输入继续传递到解码器的下一个迭代步骤:

python 复制代码
#定义一个输入层以获取编码器状态
thought_input=[Input(shape=(num_neurons,)),Input(shape=(num_neurons,))]
#将编码器状态作为初始状态传递给LSTM层
decoder_outputs,state_h,state_c=decoder_lstm(decoder_inputs,initial_state=thought_input)
#更新后的LSTM状态将成为下一次迭代的新细胞状态
decoder_states=[state_h,state_c]
#将输出从LSTM传递到稠密层,以预测下一个词条
decoder_outputs=decoder_dense(decoder_outputs)

#最后一步是将解码器模型绑定在一起
decoder_model=Model(
    inputs=[decoder_inputs]+thought_input,
    output=[decoder_outputs]+decoder_states
)

一旦建立了模型,就可以根据一个独热编码的输入序列和最后生成的词条来预测思想向量,从而生成整个序列。在第一次迭代期间,target_seq被设置成初始词条。在接下来的所有迭代中,target_seq将使用最后生成的词条进行更新。这个循环会一直进行下去,直到达到序列元素的最大数量或者解码器生成一个终止词条,此时生成过程停止:

python 复制代码
thought=encoder_model.predict(input_seq)
while not stop_condition:
    output_token,h,c=decoder_model.predict(
        [target_seq]+thought
    )
相关推荐
lizi888889 分钟前
足球大小球及亚盘数据分析与机器学习实战详解:从数据清洗到模型优化
java·人工智能·机器学习·数据挖掘·数据分析
virtaitech13 分钟前
OrionX GPU算力池助力AI OCR场景应用
人工智能·ai·ocr·gpu算力·ai算力资源池化
繁依Fanyi15 分钟前
828华为云征文|华为Flexus云服务器搭建OnlyOffice私有化在线办公套件
服务器·开发语言·前端·python·算法·华为·华为云
lalahappy16 分钟前
文档智能:OCR+Rocketqa+layoutxlm
人工智能
大模型实战17 分钟前
RAPIDS AI 加速制造业预测性维护效率
大数据·人工智能
zhangfeng113318 分钟前
在 PyTorch 中,除了 pad_sequence 还有哪些其他处理序列数据的函数?时间序列数据 预处理
人工智能·pytorch·python·深度学习
邂逅自己19 分钟前
Java入门程序-HelloWorld
java·开发语言
jndingxin23 分钟前
OpenCV结构分析与形状描述符(18)比较两个轮廓相似度的函数matchShapes()的使用
人工智能·opencv·计算机视觉
python15632 分钟前
Python Numpy布尔数组在数据分析中的应用
python·数据分析·numpy
AIAdvocate41 分钟前
力扣-96.不同的二叉搜索树 题目详解
python·算法·动态规划