我正在尝试构建一个Keras模型model_B
,该模型输出另一个Keras模型model_A
的输出。现在,model_A
的输出是根据来自多个Keras embedding层且具有不同词汇量的几个张量的级联来计算的。模型model_A
和model_B
基本相同。
问题:我训练model_A
时,一切正常。但是,当我在同一数据集上训练model_B
时,出现以下错误:
tensorflow.python.framework.errors_impl.InvalidArgumentError: index [1] = 3不在[0,2)[[{{node model_1 / embedding_1 / embedding_lookup}}]]
从本质上讲,该错误是说一个单词的索引超出了预期的词汇范围,但事实并非如此。有人可以弄清楚为什么会这样吗?
以下是该问题的可复制示例:
from keras.layers import Input,Dense,Lambda,concatenate,Embedding
from keras.models import Model
import numpy as np
# Constants
A = 2
vocab_sizes = [2,4]
# Architecture
X = Input(shape=(A,))
embeddings = []
for a in range(A):
X_a = Lambda(lambda x: x[:,a])(X)
embedding = Embedding(input_dim=vocab_sizes[a],output_dim=1)(X_a)
embeddings.append(embedding)
h = concatenate()(embeddings)
h = Dense(1)(h)
# Model A
model_A = Model(inputs=X,outputs=h)
model_A.compile('sgd','mse')
# Model B
Y = Input(shape=(A,))
model_B = Model(inputs=Y,outputs=model_A(Y))
model_B.compile('sgd','mse')
# Dummy dataset
x = np.array([[vocab_sizes[0] - 1,vocab_sizes[1] - 1]])
y = np.array([1])
# Train models
model_A.fit(x,y,epochs=10) # Works well
model_B.fit(x,epochs=10) # Fails
根据上述错误,似乎输入x[:,1]
被错误地馈送到词汇量为2的第一嵌入层,而不是第二词汇层。有趣的是,当我交换词汇量(例如设置vocab_sizes = [4,2]
)时,它可以工作,并支持先前的假设。