tf.gather_nd没有“扁平化”的形状?

时间:2017-10-18 06:53:25

标签: python tensorflow tensor

我还在使用tensorflow并尝试使用gather_nd操作,但返回值不是我想要的形状/格式...

Input Tensor: - shape: (2, 7, 4) 
array([[[ 0., 0., 1., 2.],
        [ 0., 0., 2., 2.],
        [ 0., 0., 3., 3.],
        [ 0., 0., 4., 3.],
        [ 0., 0., 5., 4.],
        [ 0., 0., 6., 4.],
        [ 0., 0., 7., 5.]],
       [[ 1., 1., 0., 2.],
        [ 1., 2., 0., 2.],
        [ 1., 3., 0., 3.],
        [ 1., 4., 0., 3.],
        [ 1., 5., 0., 4.],
        [ 1., 6., 0., 5.],
        [ 1., 7., 0., 5.]]], dtype=float32) 

Indices returned by tf.where op: - shape: (3, 2) 
array([[0, 0], 
       [0, 1],
       [1, 0]]) 

tf.gather results: (shape = [3, 4])
array([[ 0., 0., 1., 2.],
       [ 0., 0., 2., 2.],
       [ 1., 1., 0., 2.]], dtype=float32)

desired results: = (2, sparse, 4)
array([[[ 0., 0., 1., 2.],
        [ 0., 0., 2., 2.]],
       [[ 1., 1., 0., 2.]]], dtype=float32) 

实现这一目标的最佳方法是什么,请记住tf.where =动态形状并且不保证第二维(轴= 1)的形状一致性?

注意:忽略这个问题 - 请参阅我的回答

2 个答案:

答案 0 :(得分:0)

我认为它是Tensorflow版本的问题。在我的版本(1.2.1)中,我从输入中获得了所需的输出。但是,我还根据旧版本尝试了以下代码。

import tensorflow as tf

indices = [[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3]],
           [[0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 1, 3]],
           [[1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 0, 3]]]

params =  [[[ 0., 0., 1., 2.],
            [ 0., 0., 2., 2.],
            [ 0., 0., 3., 3.],
            [ 0., 0., 4., 3.],
            [ 0., 0., 5., 4.],
            [ 0., 0., 6., 4.],
            [ 0., 0., 7., 5.]],
           [[ 1., 1., 0., 2.],
            [ 1., 2., 0., 2.],
            [ 1., 3., 0., 3.],
            [ 1., 4., 0., 3.],
            [ 1., 5., 0., 4.],
            [ 1., 6., 0., 5.],
            [ 1., 7., 0., 5.]]]

output = tf.gather_nd(params, indices)

with tf.Session()as sess:
    print (sess.run(output))

希望这有帮助。

答案 1 :(得分:0)

我意识到我的问题是白痴。

# of tuples when 1st dim is 0    !=   # of tuples when 1st dim is 1 

我不确定我所要求的是可行的......