0

我正在尝试构建一个基本的编码器-解码器模型。我为训练图建立了模型,它运行良好。解码器的助手是tf.contrib.seq2seq.TrainingHelper. 但是当我切换到助手时,tf.contrib.seq2seq.GreedyEmbeddingHelper它会引发形状错误。

这是我的工作帮手。

helper = tf.contrib.seq2seq.TrainingHelper(
decoder_emb_inp, decoder_lengths, time_major=True)

这就是我想要做的。

start_tokens = tf.fill([batch_size], vezins_dict[start_token_str])
    end_token = vezins_dict[end_token_str]

helper = tf.contrib.seq2seq.GreedyEmbeddingHelper(decoder_emb_inp, 
    start_tokens, end_token)

我正在使用相同的解码器和动态解码。它适用于TrainingHelper,但不适用于GreedyEmbeddingHelper

# decoder   
decoder = tf.contrib.seq2seq.BasicDecoder(
    decoder_cell, helper, encoder_state, 
    output_layer=projection_layer)

# Dynamic decoding
outputs, _, _ = tf.contrib.seq2seq.dynamic_decode(decoder)
logits = outputs.rnn_output

这就是错误。

ValueError: linear is expecting 2D arguments: 
  [TensorShape([Dimension(20), Dimension(20), Dimension(10)]), 
  TensorShape([Dimension(20), Dimension(128)])]
4

1 回答 1

0

问题出在GreedyEmbeddingHelper输入上。使用Greedy Helper时,无需解码器输入。

这是贪婪助手的错误嵌入输入

embedding_decoder = tf.get_variable(
        "embedding_decoder", [out_alphabet_size, embedding_size])
decoder_emb_inp = tf.nn.embedding_lookup(
        embedding_decoder, decoder_inputs)

贪婪需要这样

decoder_emb_inp = tf.get_variable(
        "embedding_decoder", [out_alphabet_size, embedding_size])
于 2018-03-17T19:16:58.550 回答