我要解决的问题是图中的问题。给定一个带有单词嵌入的文本句子,并为每个句子指定指向我要保留的单词的固定索引,我该如何对感兴趣的嵌入进行切片?
作为一个玩具示例,假设我有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'
,我不知道如何解决这个鸡蛋问题。有什么想法吗?
答案 0 :(得分:1)
您可以这样做:
96 (6 * 16 partitions)
答案 1 :(得分:0)
张量不能强制转换为numpy使用数据
idxs = indexes[0].numpy()