我可以使用张量作为列表索引吗?
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 求和。
我有这个自定义 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
的结果取一个 - 3:将
softmax
的结果重塑为与上面堆叠结果相同的维数:shape(-1, number_of_layers, _other_dims_if_exist, 1)
- 4:将堆叠结果乘以(按元素
*
)重塑后的 softmax 并对轴 1 求和。
softmax