Я сталкивался с этими проблемами при работе с 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, я получаю ошибку:
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
Таким образом, лямбда-слой ожидает 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, поэтому в этом случае весь мой список входных данных будет считаться a = [tf.zeros ((1,2)), tf. нули ((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>
Так что это работает, поскольку аргумент (в виде списка) передается от лямбда-слоя к лямбда-функции.
Там могут быть более элегантные решения, и мне интересно их знать.