seq2seq主要实现步骤和源码

注意点:

1 数据预处理阶段(添加特殊字符)

<PAD>主要用来进行字符补全,<EOS>和<GO>都是用在Decoder端的序列中,告诉解码器句子的起始与结束

<UNK>则用来替代一些未出现过的词或者低频词

2 encoder

直接lstm或者其他模型

3 decoder

  • 对target数据进行处理
  • 构造Decoder

     在训练过程中,我们需要将我们的target序列作为输入传给Decoder端RNN的每个阶段,而不是使用前一阶段预测输出,这样会使得模型更加准确。TrainingHelper用于训练阶段,GreedyEmbeddingHelper用于测试阶段

    • Embedding
    • 构造Decoder层
    • 构造输出层,输出层会告诉我们每个时间序列的RNN输出结果
    • Training Decoder
    • Predicting Decoder

4 构建好了Encoder层与Decoder以后,我们需要将它们连接起来build我们的Seq2Seq模型

参考https://zhuanlan.zhihu.com/p/27608348

源码 https://github.com/lbda1/base_seq2seq

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【资源说明】 大数据课程作业-基于Seq2Seq的故事文本生成python源码+项目说明文档.zip 本次作业本质上是文本生成的任务,序列到序列[1]模型是文本生成领域比较常用的一个算法,也是课程提供的参考文献[2]中使用的方法,采取了编码器-解码器的架构,用编码器编码输入,解码器则用来产生输出,两个模块之间采用注意力模块相连。 参考文献[2]中提出了两步式的故事生成方法,即先对给定的标题生成一个简短的storyline,再通过storyline生成具体的故事。文中提出了两种故事生成的模型,即静态生成模型和动态生成模型。前者先使用序列到序列模型根据标题生成完整的storyline,再用storyline生成故事;后者则是交替式地动态生成storyline和故事。在此基础上我们做了一些调研。 Ammanabrolu等人采用了一个级联的模型来完成给定故事开头续写故事的任务[3]。他们使用了Martin等人提出的event抽象结构[4]来表示句子,并将其进一步扩展。他们将故事生成的任务分成了生成event和生成故事两个步骤,与文献[2]采用中间结构storyline的思路相似。Yang等人提出了根据若干个主题生成文章的方法[5]。他们在decode生成文本的时候引入了外部知识,并且借用了seqGAN的训练方法增强模型表现。这些工作和本次作业一样,需要根据比较短的输入生成较长的文本。 本次作业采用的评测指标bleu值,全称bilingual evaluation understudy,由Papineni等人于2002年提出[6],是一种常用于机器翻译等领域的自动评价指标,现也多用于各种文本生成任务的评价。 对于测试集中的每组数据,模型对于输入序列产生一个输出序列,这个输入序列对应一个或多个标准输出(因为机器翻译的任务并不是一对一的,一个句子可以有多种翻译方式,所以可以有多个标准输出)。其基本原则是希望机器翻译得到的译文与人工译文重合度尽可能高。具体评测时,会比较机器译文和参考译文之间的n-gram的重合度,即机器翻译中的n-gram在参考译文中的最大命中次数。n一般取1、2、3、4。但是这样会倾向于给较短的序列更高的分数,因此引入了长度惩罚因数BP。若机器译文长度小于参考译文,则令BP<1,会导致最终bleu评分降低。其余情况BP=1。最终计算公式可以表示为: 本次作业的任务是故事生成,即给定一个故事标题,要求输出5个句子的短故事。我们力图复现一下论文(Seq2Seq,静态两步式生成),并尝试加了一些模块(Self-Attention),以期在本任务上达到较好效果。 【备注】 1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载使用体验! 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈!
以下是一个简单的 Seq2Seq 模型的 TensorFlow 代码实现: ```python import tensorflow as tf class Seq2SeqModel(object): def __init__(self, input_vocab_size, output_vocab_size, hidden_size): # 输入序列的占位符 self.encoder_inputs = tf.placeholder(shape=(None, None), dtype=tf.int32, name='encoder_inputs') # 输出序列的占位符 self.decoder_inputs = tf.placeholder(shape=(None, None), dtype=tf.int32, name='decoder_inputs') # 输出序列的偏移量,用于计算损失 self.decoder_targets = tf.placeholder(shape=(None, None), dtype=tf.int32, name='decoder_targets') # 定义编码器和解码器的 RNN 单元 encoder_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_size) decoder_cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_size) # 运行编码器 with tf.variable_scope("encoder"): encoder_embeddings = tf.get_variable("encoder_embeddings", [input_vocab_size, hidden_size]) encoder_inputs_embedded = tf.nn.embedding_lookup(encoder_embeddings, self.encoder_inputs) _, encoder_state = tf.nn.dynamic_rnn(encoder_cell, encoder_inputs_embedded, dtype=tf.float32) # 运行解码器 with tf.variable_scope("decoder"): decoder_embeddings = tf.get_variable("decoder_embeddings", [output_vocab_size, hidden_size]) decoder_inputs_embedded = tf.nn.embedding_lookup(decoder_embeddings, self.decoder_inputs) # 定义解码器的输出层 output_layer = tf.layers.Dense(output_vocab_size, activation=None) # 定义训练解码器的 helper train_helper = tf.contrib.seq2seq.TrainingHelper(inputs=decoder_inputs_embedded, sequence_length=tf.ones_like(self.decoder_inputs[0]) * tf.shape(self.decoder_inputs)[1]) # 定义推理解码器的 helper infer_helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(embedding=decoder_embeddings, start_tokens=tf.fill([tf.shape(self.encoder_inputs)[0]], 1), end_token=2) # 定义训练解码器 train_decoder = tf.contrib.seq2seq.BasicDecoder(cell=decoder_cell, helper=train_helper, initial_state=encoder_state, output_layer=output_layer) # 定义推理解码器 infer_decoder = tf.contrib.seq2seq.BasicDecoder(cell=decoder_cell, helper=infer_helper, initial_state=encoder_state, output_layer=output_layer) # 运行训练解码器 train_outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(train_decoder, maximum_iterations=tf.shape(self.decoder_inputs)[1]) # 运行推理解码器 infer_outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(infer_decoder, maximum_iterations=tf.shape(self.encoder_inputs)[1]) # 定义损失函数 self.loss = tf.reduce_mean(tf.contrib.seq2seq.sequence_loss(logits=train_outputs.rnn_output, targets=self.decoder_targets, weights=tf.to_float(tf.sequence_mask(tf.shape(self.decoder_inputs)[1])))) # 定义训练步骤 self.train_op = tf.train.AdamOptimizer().minimize(self.loss) # 定义预测结果 self.predictions = infer_outputs.sample_id ``` 这个模型实现了一个基本的 Seq2Seq 模型,用于将输入序列翻译成输出序列。该模型使用 LSTM 单元,并使用带有注意力机制的解码器,以便模型可以更好地关注输入序列中的重要部分。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值