我正在努力理解 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 层,如下所示。请注意,inp1
和inp2
两个输入需要可广播(不一定需要具有相同的形状 - 例如(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
层。
另一件事,在大多数情况下,您不需要指定输出形状,除非您使用复张量或整数张量。