4

嗨,tensorflowers 同胞,我正在尝试使用正在开发和发布的 TF1.0 和 1.1 的新 seq2seq 模块来实现序列到序列模型。这里有一个 dynamic_decode 函数,它以 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”

蟒蛇:2.7

4

2 回答 2

2

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

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

于 2017-08-22T17:06:43.267 回答
1

我猜你正在使用 GreedyEmbeddingHelper?在训练期间,你应该使用 TF 的“TrainingHelper”。输出维度应该与您的目标维度匹配,因为在每个时间步,目标都用作您的输入。

于 2017-08-02T21:29:29.293 回答