代码之家  ›  专栏  ›  技术社区  ›  Aaditya Ura

seq2seq模型的预处理

  •  3
  • Aaditya Ura  · 技术社区  · 6 年前

    我试图建立一个seq2seq模型,我试图遵循Tensorflow官方教程,但没有提到预处理步骤。我试着在网上搜索,每个教程都从模型开始,没有预处理步骤。

    我需要一些关于seq2seq中涉及的预处理步骤的信息:

    如果我有这样一个数据集:(使用index2word词汇编码后)

    encoder [1, 2, 1, 3, 4] decoder [2, 3, 4]
    encoder [2, 3, 4, 1] decoder [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65]
    encoder [4, 5, 3, 11, 23, 1, 33, 44, 1, 3] decoder [4, 2, 3, 5]
    encoder [44, 55] decoder [5, 6, 3, 2, 4, 22, 42, 11, 34]
    encoder [1] decoder [55, 6, 3, 2, 4, 5, 6, 7, 7]
    encoder [4, 2, 3, 4, 5] decoder [6, 5, 3, 5, 6, 7, 8, 2, 4, 5]
    encoder [44, 2, 1, 22, 5, 3, 2] decoder [6, 5, 3, 4, 5, 6, 7]
    encoder [55, 3, 1, 5, 1] decoder [5, 3, 2, 3, 4, 5]
    encoder [14] decoder [5, 6, 7]
    

    如果我将5作为批量大小,那么第一批:

    encoder [1, 2, 1, 3, 4] decoder [2, 3, 4]
    encoder [2, 3, 4, 1] decoder [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65]
    encoder [4, 5, 3, 11, 23, 1, 33, 44, 1, 3] decoder [4, 2, 3, 5]
    encoder [44, 55] decoder [5, 6, 3, 2, 4, 22, 42, 11, 34]
    encoder [1] decoder [55, 6, 3, 2, 4, 5, 6, 7, 7]
    

    <PAD> 当前位置在培训期间,我们需要将我们的示例提供给 分批建立网络。

    <EOS> :这也是配料的另一个必要条件,但还有更多 解码器端。它允许我们告诉解码器句子在哪里 结束时,它允许解码器在其

    <UNK> :用替换未知。

    <GO> :这是解码器的第一个时间步的输入 解码器知道何时开始生成输出。

    现在,如果我以批次为例,那么填充后我会有一个问题:

    编码器批次应该和解码器批次大小相同吗?

    如果我的填充编码器数据批次如下所示:

    encoder_input=[[1, 2, 1, 3, 4],
    [2, 3, 4, 1],
    [4, 5, 3, 11, 23, 1, 33, 44, 1, 3],
    [44, 55],
    [1]]
    
    #after padding ( max time stamp is 10 )
    
    encoder_padded=[[1, 2, 1, 3, 4, 0, 0, 0, 0, 0],
                    [2, 3, 4, 1, 0, 0, 0, 0, 0, 0],
                    [4, 5, 3, 11, 23, 1, 33, 44, 1, 3],
                    [44, 55, 0, 0, 0, 0, 0, 0, 0, 0],
                    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
    

    现在,我应该将解码器序列长度填充到相同的大小吗?(最多10个?)或者我应该像这样使用解码器max sequence(max 12):

    decoder_input=[[2, 3, 4],
                   [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65],
                   [4, 2, 3, 5],
                   [5, 6, 3, 2, 4, 22, 42, 11, 34],
                   [55, 6, 3, 2, 4, 5, 6, 7, 7]]
    
    #after padding ( decoder batch max length is 12)
    
    decoder_padded=[[2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65],
                   [4, 2, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0],
                   [5, 6, 3, 2, 4, 22, 42, 11, 0, 0, 0, 0],
                   [55, 6, 3, 2, 4, 5, 6, 7, 7, 0, 0, 0]]
    

    以及我上一次预处理的数据应该是什么样子:

    encoder_input  = ['hello','how','are','you','<PAD>','<PAD>','<PAD'>]
    
    decoder_output = ['<GO>','i','am','fine','<EOS>','<PAD>','<PAD>']   
    

    这是正确的格式吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   michaelt    6 年前

    我希望这是有用的。

    编码器批次应该和解码器批次大小相同吗?

    不,解码器的计算遵循编码器,因此相应的数据将在不同的时间馈送到网络。你展示的例子是正确的。

    在上一个例子中,你提到的解码器输出应该是解码器输入。对于这对输入,目标标签应该是:

    encoder_input  = ['hello','how','are','you','<PAD>','<PAD>','<PAD'>]
    decoder_input  = ['<GO>','i','am','fine','<EOS>','<PAD>','<PAD>'] 
    target_label   = ['i','am','fine','<EOS>','<PAD>','<PAD>']