首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tf.boolean_mask,必须指定mask_dimension?

tf.boolean_mask,必须指定mask_dimension?
EN

Stack Overflow用户
提问于 2017-05-16 19:51:18
回答 2查看 8.9K关注 0票数 2

使用tf.boolean_mask()时,会引发值错误。它说:“必须指定掩码尺寸的数目,即使某些维度为零。例如,shape=None是可以的,但shape=None不是。

我怀疑当我创建我的布尔掩码时出现了问题,因为当我只是手工创建一个布尔掩码时,所有的功能都很好。然而,到目前为止,我已经检查了s的形状和类型,并且没有注意到任何可疑的东西。两者似乎都与我手工创建的布尔掩码的形状和类型相同。

请看问题的截图。如下所示,应允许您在计算机上重现错误。你需要tensorflow,numpy和scipy。

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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

如果我打印s和tf.reshape(s)的输出是

代码语言:javascript
复制
[False  True  True  True  True]
[5]

如果我打印VT和tf.reshape(VT)的输出是

代码语言:javascript
复制
[[ 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]   

任何帮助都很感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-16 21:54:39

下面的例子适用于我。

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
[[1 2]
 [5 6]]

提供可运行的代码片段来再现错误。我想你可能做错了什么。

更新:

代码语言:javascript
复制
s = tf.py_func(sample_dpp_bin,[e,v],tf.bool)
s_v = (s.eval())
X = tf.boolean_mask(VT,s_v)
print(X.eval())

掩码应该是np阵列,而不是TF张量。您不必使用tf.pyfunc。

票数 2
EN

Stack Overflow用户

发布于 2018-04-23 19:37:49

错误消息声明没有定义掩码的形状。如果你打印tf.shape(s),你会得到什么?我敢打赌,您的代码的问题是s的形状是完全未知的,您可以通过一个简单的调用来修复这个问题,比如s.set_shape((None)) (简单地指定s是一个一维张量)。考虑一下下面的代码片段:

代码语言:javascript
复制
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}))

这将打印Tensor("Shape_3:0", shape=(?,), dtype=int32)的形状(即,即使y的尺寸也是未知的),并返回与您相同的错误。但是,如果取消对set_shape行的注释,那么X_tf是三维的,因此s是一维的。然后代码就能工作了。因此,我认为您所需要做的就是在s.set_shape((None))调用之后添加一个py_func调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44010410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档