嗨同伴,
我正在尝试使用新的seq2seq模块实现序列到序列模型,该模块正在开发并使用TF1.0和1.1发布.
dynamic_decode函数
here以rnn_output的形式返回logits.
然后,我需要使用rnn的输出来计算损失.
当我天真地运行它时,只需通过调用tf.contrib.seq2seq.loss.sequence_loss(rnn_output,weights,logits)它就会崩溃:
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.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
我知道,这不是纯粹的科学.你需要为你的任务塑造它.这只是一个暗示.