По какой-то странной причине зацикливание тензора вызывает эту ошибку. Вы можете заменить нарезку на tf.split
, использовать необходимые настройки, и она будет работать хорошо:
Дополнительный импорт:
import tensorflow as tf
from keras.layers import Flatten
# Architecture
X = Input(shape=(A,))
X_as = Lambda(lambda x: tf.split(x, A, axis=1))(X)
embeddings = []
for a, x in enumerate(X_as):
embedding = Embedding(input_dim=vocab_sizes[a],
output_dim=1)(x)
embeddings.append(embedding)
h = Concatenate(axis=1)(embeddings)
h = Flatten()(h)
h = Dense(1)(h)
Почему это происходит?
Ну, очень сложно догадаться. Я предполагаю, что система пытается применить лямбда-слой, используя фактическую переменную a
вместо значения, которое вы указали ранее (я полагаю, этого не должно происходить, но я однажды столкнулся с этой проблемой при загрузке модели: одинпеременные сохранили свое последнее значение при загрузке модели вместо того, чтобы иметь зацикленное значение)
Одна вещь, которая поддерживает это объяснение, это попытка использования констант вместо a
:
#Architecture
X = Input(shape=(A,))
embeddings = []
X_a1 = Lambda(lambda x: x[:, 0], name = 'lamb_'+str(0))(X)
X_a2 = Lambda(lambda x: x[:, 1], name = 'lamb_'+str(1))(X)
xs = [X_a1, X_a2]
for a, X_a in enumerate(xs):
embedding = Embedding(input_dim=vocab_sizes[a],
output_dim=1)(X_a)
embeddings.append(embedding)
h = Concatenate()(embeddings)
h = Dense(1)(h)
Решение, если вы хотите избежать tf.split
Еще одна вещь, которая работает (и поддерживает объяснение, что лямбда может использовать последнее значение a
в вашем коде для model_B
),делая весь цикл внутри слоя Lambda
, таким образом, a
не получает неожиданных значений:
#Architecture
X = Input(shape=(A,))
X_as = Lambda(lambda x: [x[:, a] for a in range(A)])(X)
embeddings = []
for a, X_a in enumerate(X_as):
embedding = Embedding(input_dim=vocab_sizes[a],
output_dim=1)(X_a)
embeddings.append(embedding)
h = Concatenate()(embeddings)
h = Dense(1)(h)