tl; dr, какой самый эффективный способ динамически выбирать некоторые записи тензора.
Я пытаюсь реализовать синтаксический GCN в Tensorflow. По сути, мне нужно иметь разные весовые матрицы для каждой метки (давайте проигнорируем отклонения для этого вопроса) и выбирать при каждом запуске соответствующие записи для использования, которые будут выбираться разреженной матрицей (для каждой записи существует не более одной метки в одном направлении и в основном без края, так что даже не это).
Конкретнее, когда у меня есть разреженная матрица помеченных ребер (ноль-один), лучше ли использовать ее в маске, умножении с разреженной тензором или, может быть, просто использовать нормальное умножение (я думаю, не последнее, но для простоты используйте его в примере)
пример:
units = 6 # output size
x = ops.convert_to_tensor(inputs[0], dtype=self.dtype)
labeled_edges = ops.convert_to_tensor(inputs[1], dtype=self.dtype)
edges_shape = labeled_edges.get_shape().as_list()
labeled_edges = expand_dims(labeled_edges, -2)
labeled_edges = tile(
labeled_edges, [1] * (len(edges_shape) - 1) + [units, 1])
graph_kernel = math_ops.multiply(self.kernel, labeled_edges) # here is the question basically
outputs = standard_ops.tensordot(x, graph_kernel, [[1], [0]])
outputs = math_ops.reduce_sum(outputs, [-1])