在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函数。
可能会有更优雅的解决方案,我很想知道它们。