在tensorflow中,如何使用dynamic_decode

时间:2017-04-06 13:00:12

标签: tensorflow sequence-to-sequence

嗨同伴们, 我正在尝试使用新的seq2seq模块实现序列到序列模型,该模块正在开发并使用TF1.0和1.1发布。 dynamic_decode函数here以rnn_output的形式返回logits。 然后,我需要使用rnn的输出来计算损失。 当我天真地运行它时,只需用(rnn_output,weights,logits)调用tf.contrib.seq2seq.loss.sequence_loss就会崩溃:

InvalidArgumentError (see above for traceback): Incompatible shapes: [1856,1,1024] vs. [9600,1,1024]
         [[Node: optimize/gradients/loss/sequence_loss/sampled_softmax_loss/Mul_grad/BroadcastGradientArgs = BroadcastGradientArgs[T=DT_INT32, _device="/job:localhost/replica:0/task:0/gpu:0"](optimize/gradients/loss/sequence_loss/sampled_softmax_loss/Mul_grad/Shape/_3099, optimize/gradients/loss/sequence_loss/sampled_softmax_loss/Mul_grad/Shape_1/_3101)]]
         [[Node: optimize/gradients/Add/_824 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/gpu:3", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_2787_optimize/gradients/Add", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/gpu:3"](^_cloopMainDynamicDecoderWithAttention/decoder/decoder/while/BasicDecoderStep/multi_rnn_cell/cell_1/multi_rnn_cell/cell_2/lstm_cell/zeros/_128)]]

这是很自然的,因为rnn_output是动态塑造的。 我有两种可能的解决方案: 1.将“动态张量”“打包”成一个等于最大允许长度的张量。我不知道如何将动态张量打包成固定大小的张量,但它可能需要使用新的动态形状接口:tf.while_loop和TensorArrays。听到一些有关这方面的建议会很棒 2.动态计算sequence_loss。但是我对内部张量流实现的了解太有限,无法正确评估它是否容易实现。这里有什么建议吗?

一般性问题

从dynamic_decode的动态形状rnn_output计算采样/正常softmax交叉熵损失的正确方法是什么?

我有以下代码:

decoder_outputs, decoder_state = seq2seq.dynamic_decode(my_decoder, output_time_major=False, parallel_iterations=512,
                   swap_memory = True)

self.logits = decoder_outputs.rnn_output
self.loss = loss.sequence_loss(self.logits, tf.transpose(tf.stack(targets), [1,0], name="targets_"),
                                                 tf.transpose(tf.stack(self.target_weights), [1,0], name="weights_"),
                                                 softmax_loss_function = softmax_loss_function)
  

IPDB> tf。版本'1.1.0-rc0'

python:2.7

2 个答案:

答案 0 :(得分:1)

这肯定是tf.contrib.seq2seq.loss.sequence_loss的麻烦。 如果您使用动态RNN并且不手动展开BPTT,则可以使用更简单的损失函数。

我做了什么,基本上是:

loss = tf.reduce_sum(
    tf.nn.sparse_softmax_cross_entropy_with_logits(
        labels=self.answers,
        logits=presoftmax
    )
)/self.batch_sz

我知道,这不是纯粹的科学。你需要为你的任务塑造它。这只是一个暗示。

答案 1 :(得分:0)

我猜你在使用GreedyEmbeddingHelper?在培训期间,您应该使用TF" TrainingHelper"。输出维度应与目标维度匹配,因为在任何时间步骤,目标都将用作您的输入。