seq2seq的实现方式(1)

应用场景

seq2seq是自然语言处理应用中的常用模型,一般的机器翻译,文本摘要,对话生成(虽然之前实现过基于语言模型+关键词的生成方式,但这才是正道),文本摘要等任务。更高级的模型也是从基础的模型进行迭代的模型架构相对统一。

其具体的模型原理就不讲了,有很多博客已经有很好的说明,在这里只是趁着周末更新一下seq2seq在机器翻译方面的实验,更新上来供同行们参考。

嗯,seq2seq有几种模式:
(1)最简单的一种是Encoder的隐层向量复制后直接作为decoder的输入,也就是decoder对不需要序列输入。
(2)在一个是Encoder的隐层向量作为decoder的初始化,并且decoder的有输入序列,并且和输出序列错位,用于启发。
(3)就是把(1)和(2)结合起来,即要参考Decoder输入序列,又要参考Encoder的最后的隐层向量,为启发获取更多的信息。
(4)因为在翻译每一个词的时候,输入端各个词的贡献其实是不一样的,所以用Encoder的最后隐层没有多样性,所以改用attention替换(3)中的Encoder隐层向量。
几种方式一脉相承,逐步深化。

这里实现了(2)的方法。

    def build_model(self):
        
        encoder_input = layers.Input(shape=(self.input_seq_len,))
        encoder_embeding = layers.Embedding(input_dim=len(self.en_word_id_dict),
                                            output_dim=self.encode_embeding_len,
                                            mask_zero=True
                                            )(encoder_input)
        encoder_lstm, state_h, state_c = layers.LSTM(units=self.encode_embeding_len,
                                                     return_state=True)(encoder_embeding)

        encoder_state = [state_h, state_c]

        decoder_input = layers.Input(shape=(self.output_seq_len,))
        decoder_embeding = layers.Embedding(input_dim=len(self.ch_word_id_dict),
                                            output_dim=self.decode_embeding_len,
                                            mask_zero=True
                                            )(decoder_input)
        decoder_lstm, _, _ = layers.LSTM(units=self.encode_embeding_len,
                                         return_state=True,
                                         return_sequences=True)(decoder_embeding, initial_state=encoder_state)
        decoder_out = layers.Dense(len(self.ch_word_id_dict), activation="softmax")(decoder_lstm)

        model = Model([encoder_input, decoder_input], decoder_out)
        model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
        # model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy')
        model.summary()
        return model


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
seq2seq模型是一种用于序列到序列(sequence-to-sequence)任务的模型,其中LSTM是一种循环神经网络(RNN)的变种,用于处理序列数据。在PyTorch中实现seq2seq模型的一种常见方法是使用nn模块中的LSTMCell和Linear层。 下面是一个简单的示例代码,演示了如何使用LSTM实现seq2seq模型: ```python import torch import torch.nn as nn class Seq2Seq(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(Seq2Seq, self).__init__() self.hidden_size = hidden_size self.encoder = nn.LSTMCell(input_size, hidden_size) self.decoder = nn.LSTMCell(input_size, hidden_size) self.linear = nn.Linear(hidden_size, output_size) def forward(self, input_sequence, target_sequence, max_length): batch_size = input_sequence.size(0) hidden = (torch.zeros(batch_size, self.hidden_size), torch.zeros(batch_size, self.hidden_size)) encoder_outputs = [] for i in range(max_length): hidden = self.encoder(input_sequence[:, i], hidden) encoder_outputs.append(hidden[0]) decoder_inputs = torch.zeros(batch_size, input_sequence.size(2)) outputs = [] for i in range(max_length): hidden = self.decoder(decoder_inputs, hidden) output = self.linear(hidden[0]) outputs.append(output) decoder_inputs = output.argmax(1) # 使用当前时刻的输出作为下一个时刻的输入 outputs = torch.stack(outputs, dim=1) return outputs # 示例用法 input_size = 10 hidden_size = 20 output_size = 10 max_length = 5 batch_size = 3 model = Seq2Seq(input_size, hidden_size, output_size) input_sequence = torch.randn(batch_size, max_length, input_size) target_sequence = torch.randn(batch_size, max_length, output_size) outputs = model(input_sequence, target_sequence, max_length) print(outputs.shape) # 输出:torch.Size([3, 5, 10]),表示batch_size为3,序列长度为5,输出维度为10 ``` 在这个示例中,我们定义了一个名为Seq2Seq的模型类,它有一个编码器和一个解码器。编码器使用LSTMCell来处理输入序列,解码器使用LSTMCell和Linear层来生成输出序列。在forward方法中,我们按时间步迭代编码器和解码器,并将每个时间步的输出存储在列表中。最后,我们将输出序列堆叠起来并返回。 请注意,这只是一个简单的示例,实际上还有很多改进和优化的空间,例如添加注意力机制、使用更复杂的RNN单元等。但这个示例可以帮助你了解如何使用LSTM实现seq2seq模型的基本原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花咪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值