keras Lambda“ TypeError:__call __()接受2个位置参数,但给出了3个”和“ TypeError:<lambda>()缺少1个必需的位置参数:”

时间:2019-07-07 16:53:27

标签: lambda keras arguments layer

在Keras与Lambda一起工作时,我遇到了这些问题,但我尚不完全清楚为什么会这样。这是解决这些问题的方法。如果那里还有其他人,我会很感兴趣。

import tensorflow as tf

get_lambda = lambda a,b: tf.matmul(a,b)
get_lambda(tf.zeros((1,2)),tf.zeros((2,1)))

给出正确的解决方案:

<tf.Tensor 'MatMul_6:0' shape=(1, 1) dtype=float32>

但是,如果我在Lambda图层中使用此Lambda,则会出现错误:

get_lambda_layer = keras.layers.Lambda(get_lambda)
get_lambda_layer(tf.zeros((1,2)),tf.zeros((2,1)))

TypeError: __call__() takes 2 positional arguments but 3 were given

因此,Lambda层需要2个参数,如https://keras.io/layers/core/所述,并且输入必须是一个张量或张量列表。因此,如果像这样将输入作为列表传递给Lambda层,则该层应该没问题:

get_lambda_layer( [ tf.zeros((1,2)),tf.zeros((2,1)) ] )

TypeError: <lambda>() missing 1 required positional argument: 'b'

它适用于该层,但不适用于我需要参数a:b的初始lambda函数,因此在这种情况下,我的整个输入列表将被视为a = [tf.zeros((1,2)),tf。 zeros((2,1))],而b没有值,因此是错误。

我的解决方案是使用一个参数作为列表创建lamda函数,并像这样使用它:

get_lambda2 = lambda x: tf.matmul(x[0],x[1])
get_lambda_layer2 = keras.layers.Lambda(get_lambda2)
get_lambda_layer2([tf.zeros((1,2)),tf.zeros((2,1))])

结果:

<tf.Tensor 'lambda_25/MatMul:0' shape=(1, 1) dtype=float32>

这是可行的,因为参数(作为列表)从Lambda层传递到lambda函数。

可能会有更优雅的解决方案,我很想知道它们。

0 个答案:

没有答案