我正在尝试构建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个?),或者我应该像这样填充解码器的最大序列(最大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>']
这是正确的格式吗?
答案 0 :(得分:0)
我希望这是有用的。
编码器批次应与解码器批次大小相同吗?
否,解码器的计算遵循编码器,因此各个数据将在不同的时间馈送到网络。您显示的示例是正确的。
在最后一个示例中,您提到的解码器输出的一个小更正应是解码器输入。对于该对输入,目标标签应具有:
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>']