我可以使用张量作为列表索引吗?

Can I use a Tensor as a list index?

我有这个自定义 Keras 层,它可以在列表的元素之间进行选择,例如密集层,我希望它 return 它直接预测的列表元素。 该列表是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,这是可以理解的,但我找不到让它工作的方法。 "pred" Tensor 没有 .numpy 属性,虽然我很想 运行 这个程序,因为这是在构建层时发生的。

我知道可能没有解决方案,如果是这样,请提交有关如何以其他方式对该层进行编码的想法。

有一个更大的问题。

这一层将不起作用,因为您无法获得 argmax 的导数,kernel 将无法训练。你会收到类似 "An operation has None for gradient"

的错误消息

作为解决方法,我建议您:

  • 1:计算所有图层(希望它们的形状相同?)
  • 2:在第二个维度中堆叠他们的结果:tf.stack([listf_of_outputs],axis=1)
  • 2: 对 matmul
  • 的结果取一个 softmax
  • 3:将softmax的结果重塑为与上面堆叠结果相同的维数:shape (-1, number_of_layers, _other_dims_if_exist, 1)
  • 4:将堆叠结果乘以(按元素 *)重塑后的 softmax 并对轴 1 求和。