嗨,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