Python 当包含索引的张量长度大于32时,使用tensorflow.gather发出

Python 当包含索引的张量长度大于32时,使用tensorflow.gather发出,python,tensorflow,keras,tensorflow2.0,Python,Tensorflow,Keras,Tensorflow2.0,我使用的是tensorflow 2.3.0版和keras。我对函数tensorflow.gather\n的工作原理感到困惑。当我运行这段代码时: import tensorflow as tf import numpy as np SIZE = 32 INDEX = 2 def build_model(): data_input = tf.keras.layers.Input(4,) index_input = tf.keras.layers.Input(2,) in

我使用的是tensorflow 2.3.0版和keras。我对函数tensorflow.gather\n的工作原理感到困惑。当我运行这段代码时:

import tensorflow as tf
import numpy as np

SIZE = 32
INDEX = 2

def build_model():
    data_input = tf.keras.layers.Input(4,)
    index_input = tf.keras.layers.Input(2,)
    indices = tf.keras.backend.cast(index_input, dtype='int32')
    output = tf.gather_nd(data_input, indices)
    model = tf.keras.Model([data_input, index_input],
                           [output])
    return model

if __name__ == '__main__':
    data = np.arange(4 * SIZE).reshape((SIZE, 4))
    indices = INDEX * np.ones((SIZE, 2))
    indices[:, 0] = np.arange(SIZE)

    test_model = build_model()
    indexed_data = test_model.predict([data, indices])
    print(indexed_data)
它运行正常,输出正确

[  2.   6.  10.  14.  18.  22.  26.  30.  34.  38.  42.  46.  50.  54.
  58.  62.  66.  70.  74.  78.  82.  86.  90.  94.  98. 102. 106. 110.
 114. 118. 122. 126.]
但是,当我将输入数据的批量大小增加到大于32的数字时:

import tensorflow as tf
import numpy as np


SIZE = 33
INDEX = 2


def build_model():
    data_input = tf.keras.layers.Input(4,)
    index_input = tf.keras.layers.Input(2,)
    indices = tf.keras.backend.cast(index_input, dtype='int32')
    output = tf.gather_nd(data_input, indices)
    model = tf.keras.Model([data_input, index_input],
                           [output])
    return model


if __name__ == '__main__':
    data = np.arange(4 * SIZE).reshape((SIZE, 4))
    indices = INDEX * np.ones((SIZE, 2))
    indices[:, 0] = np.arange(SIZE)

    test_model = build_model()
    indexed_data = test_model.predict([data, indices])
    print(indexed_data)
我收到这个错误:

2020-09-05 13:46:40.165636: W tensorflow/core/framework/op_kernel.cc:1767] OP_REQUIRES failed at gather_nd_op.cc:47 : Invalid argument: indices[0] = [32, 2] does not index into param shape [1,4]
Traceback (most recent call last):
  File "C:/Users/user/PycharmProjects/Project/Gather_Test.py", line 25, in <module>
    indexed_data = test_model.predict([data, indices])
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 130, in _method_wrapper
    return method(self, *args, **kwargs)
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1599, in predict
    tmp_batch_outputs = predict_function(iterator)
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\eager\def_function.py", line 780, in __call__
    result = self._call(*args, **kwds)
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\eager\def_function.py", line 814, in _call
    results = self._stateful_fn(*args, **kwds)
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\eager\function.py", line 2829, in __call__
    return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\eager\function.py", line 1848, in _filtered_call
    cancellation_manager=cancellation_manager)
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\eager\function.py", line 1924, in _call_flat
    ctx, args, cancellation_manager=cancellation_manager))
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\eager\function.py", line 550, in call
    ctx=ctx)
  File "C:\Users\user\PycharmProjects\Project\venv\lib\site-packages\tensorflow\python\eager\execute.py", line 60, in quick_execute
    inputs, attrs, num_outputs)
tensorflow.python.framework.errors_impl.InvalidArgumentError:  indices[0] = [32, 2] does not index into param shape [1,4]
     [[node functional_1/tf_op_layer_GatherNd/GatherNd (defined at /Users/user/PycharmProjects/Project/Gather_Test.py:25) ]] [Op:__inference_predict_function_105]

Function call stack:
predict_function
2020-09-05 13:46:40.165636:W tensorflow/core/framework/op_kernel.cc:1767]op_REQUIRES在聚集和操作时失败。cc:47:无效参数:索引[0]=[32,2]未索引到参数形状[1,4]
回溯(最近一次呼叫最后一次):
文件“C:/Users/user/PycharmProjects/Project/Gather_Test.py”,第25行,在
索引数据=测试模型。预测([数据,索引])
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\keras\engine\training.py”,第130行,在方法包装中
返回方法(self、*args、**kwargs)
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\keras\engine\training.py”,第1599行,在predict中
tmp_批处理_输出=预测_函数(迭代器)
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\eager\def_function.py”,第780行,在调用中__
结果=自身调用(*args,**kwds)
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\eager\def_function.py”,第814行,在调用中
结果=self.\u stateful\u fn(*args,**kwds)
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\eager\function.py”,第2829行,在调用中__
返回图形\函数。\过滤\调用(args,kwargs)\ pylint:disable=受保护的访问
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\eager\function.py”,第1848行,在_filtered_调用中
取消管理器=取消管理器)
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\eager\function.py”,第1924行,位于调用平面中
ctx,args,取消管理器=取消管理器)
调用中第550行的文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\eager\function.py”
ctx=ctx)
文件“C:\Users\user\PycharmProjects\Project\venv\lib\site packages\tensorflow\python\eager\execute.py”,第60行,快速执行
输入、属性、数量(输出)
tensorflow.python.framework.errors\u impl.InvalidArgumentError:索引[0]=[32,2]未索引到参数形状[1,4]
[[node functional_1/tf_op_layer_gatrend/gatrend(定义于/Users/user/PycharmProjects/Project/Gather_Test.py:25)][op:[u推理_预测_function_105]
函数调用堆栈:
预测函数

我也使用tensorflow版本2.0.0、2.1.0和2.2.0尝试过这一点,但仍然得到了相同的结果。如何使其成为批量大于32的索引数据?

您可以添加完整的错误回溯吗?@AniketBote我已编辑此帖子以包含整个错误回溯。您可以添加完整的错误回溯吗?@AniketBote我已编辑此帖子以包含整个错误回溯。