我最近遇到了Danijar Hafner关于变量序列长度here的不错的热门博客。他使用如下函数来计算填充序列的实际长度。
def length(sequence):
used = tf.sign(tf.reduce_max(tf.abs(sequence), 2))
length = tf.reduce_sum(used, 1)
length = tf.cast(length, tf.int32)
return length
但是,我认为这个长度函数可能在他example code中将RNN应用于mnist数据集时出现问题。根据我的理解,代码将手写图片的行视为类似于以下架构的时间步骤,除了他使用softmax输入的最后相关输出。并且该示例将最后的零行解释为填充。因此,不同的数字具有不同的长度,因此可用于表示可变长度序列。
但是,上面的长度函数也会将序列开头的零行视为填充。例如,在下图中,实际长度应为26,但函数为20。
这有什么不对吗???
答案 0 :(得分:0)
恕我直言,作者试图使用张量流来重新计算张量流中的序列长度,而不是简单地提供它。我认为doig没有正当理由。
这最后的假设肯定是有问题的,可以想象很多情况下零是完全合法的输入。可以尝试使用inf
或nan
值来修复此约定,但为什么要这么麻烦呢?
顺便说一句,帖子相当陈旧,用于切片的聪明技巧现在无关紧要,因为tensorflow现在支持numpy风格的切片。