Filter tf.boolean\u mask,必须指定mask\u维度吗?

Filter tf.boolean\u mask,必须指定mask\u维度吗?,filter,tensorflow,boolean,tensor,Filter,Tensorflow,Boolean,Tensor,使用tf.boolean_mask()时,会引发值错误。其内容为“即使某些尺寸为无,也必须指定遮罩尺寸的数量。例如,shape=[None]可以,但shape=None不可以 我怀疑当我创建布尔掩码s时出现了问题,因为当我仅手动创建布尔掩码时,所有操作都正常。但是,到目前为止,我检查了s的形状和数据类型,没有发现任何可疑之处。两者似乎与我手动创建的布尔掩码的形状和类型相同 下面应该允许您在计算机上重现错误。您需要tensorflow、numpy和scipy with tf.Session()

使用
tf.boolean_mask()
时,会引发值错误。其内容为“即使某些尺寸为无,也必须指定遮罩尺寸的数量。例如,shape=[None]可以,但shape=None不可以

我怀疑当我创建布尔掩码s时出现了问题,因为当我仅手动创建布尔掩码时,所有操作都正常。但是,到目前为止,我检查了s的形状和数据类型,没有发现任何可疑之处。两者似乎与我手动创建的布尔掩码的形状和类型相同

下面应该允许您在计算机上重现错误。您需要tensorflow、numpy和scipy

with tf.Session() as sess:
    # receive five embedded vectors
    v0 = tf.constant([[3.0,1.0,2.,4.,2.]])
    v1 = tf.constant([[4.0,0,1.0,4,1.]])
    v2 = tf.constant([[1.0,1.0,0.0,4.,8.]])
    v3 = tf.constant([[1.,4,2.,5.,2.]])
    v4 = tf.constant([[3.,2.,3.,2.,5.]])

    # concatenate the five embedded vectors into a matrix
    VT = tf.concat([v0,v1,v2,v3,v4],axis=0)

    # perform SVD on the concatenated matrix
    s, u1, u2   = tf.svd(VT)
    e = tf.square(s) # list of eigenvalues
    v = u1 # eigenvectors as column vectors

    # sample a set
    s = tf.py_func(sample_dpp_bin,[e,v],tf.bool)
    X = tf.boolean_mask(VT,s)
    print(X.eval())
这是生成s的代码。s是一个行列式点过程的样本(对于数学感兴趣的人)。 请注意,我使用tf.py_func包装此python函数:

import tensorflow as tf
import numpy as np
from scipy.linalg import orth

def sample_dpp_bin(e_val,e_vec):
    # e_val = np.array of eigenvalues
    # e_vec = array of eigenvectors (= column vectors)
    eps = 0.01

    # sample a set of eigenvectors
    ind = (np.random.rand(len(e_val)) <= (e_val)/(1+e_val))
    k = sum(ind)
    if k == e_val.size:
        return np.ones(e_val.size,dtype=bool) # check for full set
    if k == 0:
        return np.zeros(e_val.size,dtype=bool)
    V = e_vec[:,np.array(ind)]

    # sample a set of k items 
    sample = np.zeros(e_val.size,dtype=bool)
    for l in range(k-1,-1,-1):
        p = np.sum(V**2,axis=1)
        p = np.cumsum(p / np.sum(p)) # item cumulative probabilities
        i = int((np.random.rand() <= p).argmax()) # choose random item
        sample[i] = True

        j = (np.abs(V[i,:])>eps).argmax() # pick an eigenvector not orthogonal to e_i
        Vj = V[:,j]
        V = orth(V - (np.outer(Vj,(V[i,:]/Vj[i]))))

    return sample
如果我打印VT和
tf.reformate(VT)
的输出为

[False  True  True  True  True]
[5]
[[ 3.  1.  2.  4.  2.]
 [ 4.  0.  1.  4.  1.]
 [ 1.  1.  0.  4.  8.]
 [ 1.  4.  2.  5.  2.]
 [ 3.  2.  3.  2.  5.]]
[5 5]   

非常感谢您的帮助。

下面的例子对我很有用

import tensorflow as tf
import numpy as np

tensor = [[1, 2], [3, 4], [5, 6]]
mask = np.array([True, False, True])

t_m = tf.boolean_mask(tensor, mask)
sess = tf.Session()
print(sess.run(t_m))
输出:

[[1 2]
 [5 6]]
提供可运行的代码段以重现错误。我认为您可能在s中做了一些错误

更新:
掩码应该是np数组而不是TF张量。您不必使用TF.pyfunc。

错误消息表明掩码的形状未定义。如果打印
TF.shape,您会得到什么<代码> >我敢打赌,您的代码的问题是“代码> s <代码>的形状是完全未知的,并且您可以用一个简单的调用来修复它,如代码> S.StIsFrand((没有))< /C> >(简单地指定<代码> s/COD>是一维张量)。
X = np.random.randint(0, 2, (100, 100, 3))
with tf.Session() as sess:
    X_tf = tf.placeholder(tf.int8)
    # X_tf.set_shape((None, None, None))
    y = tf.greater(tf.reduce_max(X_tf, axis=(0, 1)), 0)
    print(tf.shape(y))
    z = tf.boolean_mask(X_tf, y, axis=2)
    print(sess.run(z, feed_dict={X_tf: X}))

这将打印一个
张量的形状(“形状_3:0”,形状=(?,),dtype=int32)
(即,即使
y
的尺寸也是未知的)返回与您相同的错误。但是,如果您取消注释
set\u shape
行,那么
X\u tf
是三维的,因此
s
是一维的。然后代码就可以工作了。因此,我想您所需要做的就是添加一个
s.set\u shape((无))
py_func
调用之后调用。

代码中的VT是什么?只是一个形状的张量[5],s和t都是相同的维度[5]你能在布尔掩码之前打印VT和s的形状吗?是的,我可以打印VT和s,以及它们各自的形状。如果有帮助,我可以附加另一张图片。唯一的问题是,当我尝试将tf.boolean_mask命令用于VT和s时,我只是直接用常数矩阵代替VT进行了尝试,并且出现了相同的错误。ye啊,我将添加s的代码,因为我认为那里出了问题。如果我直接在numpy中定义一个掩码并使用它,它也适用于我。给我一分钟时间复制s的代码。VT如何估计?你能打印VT和s的形状并粘贴到上面吗?我很感激,你添加了你的代码。你能打印“s”吗“这是什么形状?抱歉问得越来越多。我无法复制它,因为您没有提供e_val和e_vec?对不起,让我也为您提供e_val和e_vec。为了完整起见,我将修改上面的整个帖子。只是添加了缺少的部分,希望它有意义,否则如果我需要其他内容,请告诉我。明天我可能会尝试清理我的全部帖子;现在有点乱了。很抱歉。
X = np.random.randint(0, 2, (100, 100, 3))
with tf.Session() as sess:
    X_tf = tf.placeholder(tf.int8)
    # X_tf.set_shape((None, None, None))
    y = tf.greater(tf.reduce_max(X_tf, axis=(0, 1)), 0)
    print(tf.shape(y))
    z = tf.boolean_mask(X_tf, y, axis=2)
    print(sess.run(z, feed_dict={X_tf: X}))