【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
    )
相关推荐
不一样的信息安全20 分钟前
深入解析DeepSeek智慧城市应用中的交通流量预测API接口
人工智能
干饭高手20 分钟前
Day9,Hot100(图论)
python·leetcode·图论
给生活加糖!25 分钟前
智能交通系统(Intelligent Transportation Systems):智慧城市中的交通革新
网络·人工智能·智慧城市
honghongstand26 分钟前
代码随想录D52-53 图论 Python
开发语言·python·图论
过客猫202232 分钟前
使用 deepseek实现 go语言,读取文本文件的功能,要求支持 ascii,utf-8 等多种格式自适应
开发语言·后端·golang
可为测控34 分钟前
图像处理基础(3):均值滤波器及其变种
图像处理·人工智能·均值算法
刘立军40 分钟前
本地大模型编程实战(20)用langgraph和智能体实现RAG(Retrieval Augmented Generation,检索增强生成)(4)
人工智能·后端·llm
程序媛-徐师姐43 分钟前
基于 Python Django 的校园互助平台(附源码,文档)
开发语言·python·django·校园互助·校园互助平台
Abdullah al-Sa1 小时前
Docker教程(喂饭级!)
c++·人工智能·docker·容器
进击的_鹏1 小时前
【C++】list 链表的使用+模拟实现
开发语言·c++·链表