gpt4 book ai didi

tensorflow - 在 tensorflow 中,如何使用dynamic_decode的输出计算序列丢失

转载 作者:行者123 更新时间:2023-12-02 02:44:54 24 4
gpt4 key购买 nike

各位 Tensorflower friend 们大家好,

我正在尝试使用新的 seq2seq 模块实现序列到序列模型,该模块正在开发中,并随 TF1.01.1。有一个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. 将动态张量“打包”为大小等于最大允许长度的张量。我不知道如何将动态张量打包成固定大小的张量,但这可能与动态形状的新接口(interface)有关:tf.while_loopTensorArrays 。很高兴听到一些相关建议
  2. 动态计算sequence_loss。但我对内部 tensorflow 实现的了解太有限,无法正确评估它是否容易做到。这里有什么建议吗?

一般性问题

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.version '1.1.0-rc0'

Python:2.7

最佳答案

这肯定是 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

我知道,这不完全是科学的。您需要根据您的任务来塑造它。这只是一个提示。

关于tensorflow - 在 tensorflow 中,如何使用dynamic_decode的输出计算序列丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43255965/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com