Tensorflow:在未经验证的形状变量上应用布尔掩码?

时间:2017-11-01 21:52:09

标签: tensorflow

好的,以下情况:我有一个变量var,其等级是固定的但其形状不是。例如,它可以是任意长度的1D张量。我想在我的图表会话开始时初始化var一次。我使用附加到此变量的占位符来执行此操作(另请参见下面的代码)。然后我在我的图表中进行一些计算,在某些时候我需要从var中提取所有大于0的值,如下所示:

import tensorflow as tf    

init_var = tf.placeholder(dtype=tf.float64, shape=[None])
var = tf.Variable(init_var,dtype=tf.float64,validate_shape=False)
booled = tf.boolean_mask(var, var>0)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer(), { init_var: [1,-2,3] } )
    print sess.run([booled])

但这会产生ValueError-Exception:

ValueError: Number of mask dimensions must be specified, 
even if some dimensions are None. 
E.g. shape=[None] is ok, but shape=None is not.

现在,如果我将validate_shape设置为True但是我需要在图形构建时修复var的形状但是我希望它是动态的,这个例外就消失了。然而,如果有人知道如何评估未经验证的形状的变量的布尔掩码或如何重新初始化var每个会话的形状(可能没有重建整个图形),我非常感激。

1 个答案:

答案 0 :(得分:1)

好的,我同时解决了这个问题,事实证明解决方案非常简单。虽然似乎不可能用“无”来指定形状。在定义变量时(因此只指定其排名)的条目,可以在var.set_shape()之后立即执行此操作:

import tensorflow as tf    

init_var = tf.placeholder(dtype=tf.float64, shape=[None])
var = tf.Variable(init_var,dtype=tf.float64,validate_shape=False)
var.set_shape([None])
booled = tf.boolean_mask(var, var>0)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer(), { init_var: [1,-2,3] } )
    print sess.run([booled])

现在,它完全符合我的预期!