keras Lambda «TypeError: __call __ () принимает 2 позиционных аргумента, но 3 были заданы» и «TypeError: <lambda>() отсутствует 1 обязательный позиционный аргумент:» - PullRequest
0 голосов
/ 07 июля 2019

Я сталкивался с этими проблемами при работе с 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>

Так что это работает, поскольку аргумент (в виде списка) передается от лямбда-слоя к лямбда-функции.

Там могут быть более элегантные решения, и мне интересно их знать.

...