Могу ли я использовать Тензор как индекс списка? - PullRequest
0 голосов
/ 05 марта 2020

У меня есть этот пользовательский слой Keras, который выбирает между элементами списка, например, плотный слой, и я хочу, чтобы он возвращал элемент списка, который он предсказал напрямую. Список представляет собой список Keras.layers.Layer. У меня есть этот кусок кода:

def call(self, inputs, context):   
    pred = tf.argmax(tf.matmul(context, self.kernel))
    return self.layers[pred](inputs)

Выдает ошибку: TypeError: list indices must be integers or slices, not Tensor, что понятно, но я не могу найти способ заставить его работать. Tensor "pred" не имеет свойства .numpy, хотя я запускаю программу с нетерпением, так как это происходит при построении слоя.

Я понимаю, что, возможно, не будет никаких решений, если так, подайте идеи о том, как я мог бы кодировать этот слой другим способом.

1 Ответ

1 голос
/ 05 марта 2020

Есть большая проблема.

Этот слой не будет работать, потому что вы не можете получить производные от argmax, kernel будет невозможно обучить. И вы получите сообщение об ошибке типа «У операции нет градиента»

В качестве обходного пути я бы предложил вам:

  • 1: рассчитать все слои (надеюсь, что они имеют одинаковую форму?)
  • 2: сложить их результаты во второе измерение: tf.stack([listf_of_outputs],axis=1)
  • 2: взять softmax результата matmul
  • 3: изменить форму результата softmax до того же числа измерений, что и для суммированного результата, указанного выше: shape (-1, number_of_layers, _other_dims_if_exist, 1)
  • 4: умножить (поэлементно *) результаты суммирования на измененное значение softmax и сумму ось 1.
...