如何基于一些输入数据选择张量中的元素?

时间:2019-07-26 09:13:25

标签: python tensorflow lstm

我要解决的问题是图中的问题。给定一个带有单词嵌入的文本句子,并为每个句子指定指向我要保留的单词的固定索引,我该如何对感兴趣的嵌入进行切片?

Problem description 注意:我不能将其作为预处理步骤,因为嵌入是多层的结果。

作为一个玩具示例,假设我有2个输入数据集,一个包含数据本身作为2D张量,另一个包含我感兴趣的单词的索引。例如

NUM_SENTENCES=2
NUM_ENTITIES_PER_REL=3
LEN_SENTENCE=5
NUM_H_T=2
DIM_EMBEDDING=2

indices = tf.constant([
   [1, 3],
   [0, 4]
])
data = tf.constant(np.reshape(np.arange(NUM_SENTENCES*LEN_SENTENCE*DIM_EMBEDDING), [NUM_SENTENCES, LEN_SENTENCE, DIM_EMBEDDING]))

使用指定的索引,我要从第一个元素中检索元素1和3,从第二个元素中检索0和4以得出

array([[[ 2,  3],
        [ 6,  7]],

       [[10, 11],
        [18, 19]]])

如果这样做,我可以获得预期的结果

selector = [[[idx, elem]
              for elem in arr]
              for idx, arr in enumerate(indices)]
tf.gather_nd(data, selector)

,但这在模型中不起作用。这是我的代码:

input_text = keras.Input(shape=(LEN_SENTENCE, DIM_EMBEDDING), name="input_sentence")
input_ent = keras.Input(shape=(NUM_ENTITIES_PER_REL, 2), dtype=tf.int32, name="entities_to_classify")

class Selector(layers.Layer):
    def __init__(self, **kwargs):
        super(Selector, self).__init__(**kwargs)

    def call(self, inputs):
        h_s = inputs[1]
        indexes = inputs[0]
        idxs = indexes.numpy()
        selector = [[[idx, elem]
                      for elem in arr]
                      for idx, arr in enumerate(idxs)]

        return tf.gather_nd(h_s, selector)

x = Selector(name="selector")([input_ent, input_text])

model = keras.Model(inputs=[input_ent, input_text], outputs=x, name='language_model')

keras.utils.plot_model(model, '/tmp/model.jpg', show_shapes=True) 

及其执行结果(我正在使用tensorflow==2.0.0-beta1)。

AttributeError: 'Tensor' object has no attribute 'numpy'

,我不知道如何解决这个鸡蛋问题。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以这样做:

96 (6 * 16 partitions)

答案 1 :(得分:0)

张量不能强制转换为numpy使用数据

idxs = indexes[0].numpy()