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

Posted

技术标签:

【中文标题】Keras:具有多个参数的 Lambda 层函数【英文标题】:Keras: Lambda layer function with multiple parameters 【发布时间】:2017-12-09 10:11:18 【问题描述】:

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

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

还有,

y = Lambda(connection)(x,k)

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

【问题讨论】:

“k”是常数吗?或者它是在模型中的某个地方计算出来的?作为输入数据的一部分,它是模型的输入吗? k 通过模型更新。 k 的值在不同的时间发生变化,我称之为Lambda 层。但我在 Keras GitHub 问题中找到了解决方案 here。使用y = Lambda(connection, arguments='k':k)(x) 成功了! 【参考方案1】:

随便用

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

然后是连接方法中的var[0]、var[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. @ArthurAttout python 变量可以使用本地上下文传递给 Lambda【参考方案2】:

在this GitHub Pull Request 中找到了问题的解决方案。使用

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

成功了!

【讨论】:

注意:默认情况下model.save_weights() 不会将k 识别为模型的一部分。 是的,这确实有效。但是对于其他读者.. 请知道这里的变量 k 已经定义为一些常量【参考方案3】:
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)

【讨论】:

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

以上是关于Keras:具有多个参数的 Lambda 层函数的主要内容,如果未能解决你的问题,请参考以下文章

如何用Keras自定义层?

Core ML 上具有两个参数功能的自定义层

keras.layers中Lambda()——匿名函数层解析

Keras 自定义损失函数

Keras 2:在“合并”图层中使用lambda函数

Keras 自定义 lambda 层:如何规范化/缩放输出