Keras:带有多个参数的Lambda层函数

15

我正在尝试在Keras中编写一个Lambda层,该层调用一个名为connection的函数,该函数运行循环for i in range(0,k),其中k作为输入提供给函数connection(x,k)。现在,当我尝试在Functional API中调用该函数时,我尝试使用:

k = 5
y = Lambda(connection)(x)

此外,
y = Lambda(connection)(x,k)

但是这两种方法都不起作用。我如何在不将其分配为全局参数的情况下输入k的值?


“k”是一个常数吗?还是在模型的某个地方计算出来的?它是模型的输入之一,作为输入数据的一部分吗? - Daniel Möller
1
模型通过 k 次更新。每次调用 Lambda 层时,k 的值都会改变。但是我在 Keras 的 GitHub 问题中找到了解决方案 here。使用 y = Lambda(connection, arguments={'k':k})(x) 即可解决问题! - Prabaha
3个回答

21

只需使用

y = Lambda(connection)((x,k)) 

然后在连接方法中使用var[0]、var[1]


这是正确的解决方案,应该被接受。 - nairouz mrabah
1
除非 xk 都是张量对象(参见:Layer lambda_4 was called with an input that isn't a symbolic tensor. Received type: <class 'int'>. Full input: [8]. All inputs to the layer should be tensors.),否则这将无法工作。 - Arthur Attout
@ArthurAttout Python变量可以使用本地上下文传递给Lambda。 - Andrey Nikishaev
我在最新的tensorflow中遇到了错误“缺少1个必需的位置参数k连接”。 - Daniel Wiczew

15

这个 GitHub Pull Request中找到了解决问题的方法。使用它。

y = Lambda(connection, arguments={'k':k})(x)

工作了!


注意:默认情况下,model.save_weights()将不会将k识别为模型的一部分。 - wrongu
2
是的,这确实起作用了。但是对于其他读者,请注意这里的变量k已经定义为某个常数。 - zwep

4
Tmodel = Sequential()
x = layers.Input(shape=[1,])   # Lambda on single input
out1 = layers.Lambda(lambda x: x ** 2)(x)

y = layers.Input(shape=[1,])   # Lambda on multiple inputs
z = layers.Input(shape=[1,])
def conn(IP):
    return IP[0]+IP[1]
out2 = layers.Lambda(conn)([y,z])

Tmodel = tf.keras.Model(inputs=[x,y,z], outputs=[out1,out2],name='Tmodel')  # Define Model
Tmodel.summary()

# output
O1,O2 = Tmodel([2,15,10])
print(O1)   # tf.Tensor(4, shape=(), dtype=int32)
print(O2)   # tf.Tensor(25, shape=(), dtype=int32)

请添加一些解释以获得更好的清晰度或参考文档。 - mybrave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接