我创建了一个相当复杂的seq2seq类型模型(基于“一个神经传感器”),在Tensorflow的最新版本中,以下代码返回错误:
Cannot use 'transducer_training/while/rnn/strided_slice' as input to 'gradients/transducer_training/while/rnn/while/Select_1_grad/Select/f_acc' because 'transducer_training/while/rnn/strided_slice' is in a while loop
该代码以前有效,只是在最新版本停止后: 纽比(1.14.0) protobuf(3.5.1)tensorflow(1.5.0)tensorflow gpu (1.3.0)tensorflow tensorboard(1.5.1)Ubuntu版本16.04.3 LTS (谢尼尔·施鲁斯)
代码(要获取错误,只需复制、粘贴并运行它):
^{pr2}$
在这种特殊情况下,错误似乎被错误地提出(请参阅评论中的github问题)。但是,一般来说,这些错误意味着:
错误消息所抱怨的使用模式始终是非法的。早期版本的TensorFlow只是没有很好的检查。在
问题的核心是,在TensorFlow的执行模型中,您不能使用在while循环内部、外部创建的张量。为了简单地说明这一点,请看一下这个test case。在
您可以通过立即从here返回来禁用检查,但计算图的格式将不正确,这可能导致未定义的行为。在
正确的解决方法是将要在while循环之外(在
cond
和body
函数之外)访问的所有张量添加到loop_vars
中,并使用从tf.while_loop返回的值。在最近,当我把
dynamic_rnn
放入scan
(即while循环)中时,我遇到了类似的问题。这个bug似乎只在TensorFlow 1.5中引入。您可以尝试将TensorFlow版本降级到1.4或升级到1.6。两者都应该有效。在相关问题 更多 >
编程相关推荐