tf.sparse_to_dense:形状必须为等级1,但等级为0

时间:2018-12-09 16:19:44

标签: python tensorflow keras tensor keras-2

我的代码:

def f(x):
    try:
        import tensorflow as tf
        # x is (None, 10, 2)
        idx = K.cast(x*15.5+15.5, "int32")
        z = tf.sparse_to_dense(idx, 32, 1.0, 0.0, name='sparse_tensor')
        print('z.shape={0}'.format(z.shape))
    except Exception as e:
        print(e)
    return x[:, :, 0:2]

drop_out = Lambda(lambda x: f(x), 
                  output_shape=drop_output_shape, name='projection')(reshape_out)

x是(None, 10, 2)的张量,其中有10个索引/坐标。尝试生成(None, 32, 32)张量z。我收到以下错误:

Shape must be rank 1 but is rank 0 for 'projection_14/sparse_tensor' (op: 'SparseToDense') with input shapes: [?,10,2], [], [], [].

如何解决?谢谢

1 个答案:

答案 0 :(得分:0)

您所看到的特定错误是试图说您的output_shape应该是一维张量,例如(32,),而不是您那里的0D张量{{1} }。但是我担心这个简单的更改不会解决您的问题。

我不明白的一件事是,当您说您只有10个索引时,为什么您的32是3-D张量。从技术上讲,sparse_indices can be a 2-D tensor at most。我对x的理解是,它与制作稀疏张量非常相似。因此,您的tf.sparse_to_dense中的数字2已经确定输出张量将为2D。 (10, 2)与其他样本大小一样,应以不同的方式处理。

按照此逻辑,您可能会发现的另一个问题是,None应该是output_shape而不是(32, 32),这是上面提到的简单解决方法。元组的长度应匹配(32,)的形状(特别是最后一轴)。

考虑到所有这些,我认为模仿您的示例的仅tensorflow MVCE可能是:

sparse_indices

只需指出:The tf.sparse_to_dense "FUNCTION IS DEPRECATED. It will be removed in a future version. Instructions for updating: Create a tf.sparse.SparseTensor and use tf.sparse.to_dense instead."