【发布时间】:2020-03-05 15:15:42
【问题描述】:
我有这个自定义 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,这是可以理解的,但我找不到让它工作的方法。 “pred”张量没有.numpy 属性,尽管我急切地运行程序,因为这发生在构建层时。
我知道可能没有解决方案,如果有,请提交关于如何以其他方式对这一层进行编码的想法。
【问题讨论】:
-
我不确定,但我认为在子类化
tf.keras.Layer时不能调用.numpy。我认为 call 函数中的所有内容都必须在tensorflow本身中声明。所以让我们试试吧!如何使用tf.concatenate、tf.stack或tf.layers.Concatenate或其他东西(而不是在列表中)对self.layers进行分组,然后使用tf.gather按索引选择正确的? -
@Frederik Bode 你实际上不能在
tf.keras.layers.Layer中调用.numpy。你的想法听起来不错,但是一旦堆叠(还没有尝试过其他选项),层就会变成张量,你不能把它作为一个函数来调用。 -
eurgh - 它超级难看,但你可以嵌套
tf.cond:tf.cond(tf.equals(pred, 0), self.layers[0](inputs), tf.cond(tf.equals(pred,1), self.layers[1](inputs), ...)。您可能可以使用递归或 for 循环来格式化这一点图形构造。 -
@Frederik Bode 我什至不知道 tf.cond 存在。这是你推荐的吗?
for i, layer in enumerate(self.layers): tf.cond(tf.equals(pred, i), layer(inputs))
标签: python tensorflow keras deep-learning keras-layer