Keras Lambda的工作原理



我正在努力理解 Lambda 层在 keras 中的工作方式。例如,我有以下示例:

add_layer = Lambda(lambda x:x[0]+x[1], output_shape=lambda x:x[0])

给定我的输入 x 我对Labmda输出层的确切期望是什么?

Lambda层的工作方式类似于Python lambda函数。但它返回的不是函数,而是Layer对象,该对象执行在该 lambda 函数中传递的任何内容。

您通常按如下方式使用 lambda 层。这是执行作为 Lambda 函数传入的任何内容的结果。

out = add_layer(<some_input>)

例如,在上面的函数中,您需要传入两个项目的列表(由x[0]x[1]表示。lambda 层将对这两个张量执行逐元素加法操作。

您可以在模型中使用此 lambda 层,如下所示。请注意,inp1inp2两个输入需要可广播(不一定需要具有相同的形状 - 例如(10,5(和(10,1(仍然可以工作(。

from tensorflow.keras import layers, models
inp1 = layers.Input(shape=(5))
inp2 = layers.Input(shape=(1))
add_layer = layers.Lambda(lambda x:x[0]+x[1], output_shape=lambda x:x[0])
out = add_layer([inp1, inp2])
model = models.Model(inputs=[inp1, inp2], outputs=out)
model.summary()

然后,您将按如下方式使用此图层。

x1 = np.ones(shape=(10, 5))*1.0
x2 = np.ones(shape=(10, 1))*2.0
print(model.predict([x1, x2]))

哪个会返回

[[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]
[3. 3. 3. 3. 3.]]

PS:我会省略output_shape参数,因为在这种情况下,Keras 会自动推断形状(这是一个简单的元素明智添加(。因为否则会发生什么,如果你通过

inp1 = layers.Input(shape=(1))
inp2 = layers.Input(shape=(5))

输出的形状将错误。因为它总是得到第一个张量的形状作为形状。然而,在这种情况下,形状将是第二个张量的形状。

在这里,您的 lambda 层正在添加 2 个输入。 您通常将其用作:

add_layer = Lambda(lambda x:x[0]+x[1])
input_1 = Input(input_1_shape)
input_2 = Input(input_2_shape)
output = add_layer([input_1, input_2])

这将计算 2 个张量之间的相加。

当然这是一个玩具示例,如果你真的想要 2 个张量之间的加法,你可以使用Add层。

另一件事,在大多数情况下,您不需要指定输出形状,除非您使用复张量或整数张量。

最新更新