如何解决“ Logit和标签必须具有相同的第一维”错误

时间:2019-10-24 14:06:29

标签: python-3.x tensorflow machine-learning keras nlp

我正在为基于单词的NLP尝试不同的神经网络体系结构。

到目前为止,在本教程https://towardsdatascience.com/language-translation-with-rnns-d84d43b40571的指导下,我已经使用了双向,嵌入式和GRU模型。 但是,当我尝试使用LSTM时,出现错误消息:

  

logit和标签的第一维必须相同,logits形状为[32,186],标签形状为[4704]

我该如何解决?

我的源数据集和目标数据集包含7200个例句。它们是整数标记并嵌入的。源数据集被后期填充以匹配目标数据集的长度。

这是我的模型和相关代码:

lstm_model = Sequential()
lstm_model.add(Embedding(src_vocab_size, 128, input_length=X.shape[1], input_shape=X.shape[1:]))
lstm_model.add(LSTM(128, return_sequences=False, dropout=0.1, recurrent_dropout=0.1))
lstm_model.add(Dense(128, activation='relu'))
lstm_model.add(Dropout(0.5))
lstm_model.add((Dense(target_vocab_size, activation='softmax')))

lstm_model.compile(optimizer=Adam(0.002), loss='sparse_categorical_crossentropy', metrics=['accuracy'])

history = lstm_model.fit(X, Y, batch_size = 32, callbacks=CALLBACK, epochs = 100, validation_split = 0.25) #At this line the error is raised!

具有以下形状:

  • X.shape =(7200,147)
  • Y.shape =(7200,147,1)
  • src_vocab_size = 188
  • target_vocab_size = 186

我已经在这里查看过类似的问题,并尝试添加一个Reshape层

simple_lstm_model.add(Reshape((-1,)))

但这只会导致以下错误:

  

“ TypeError:__int__返回了非int(类型NoneType)”

这真的很奇怪,因为我对所有模型都以相同的方式对数据集进行了预处理,并且除上面所述之外,一切都很好。

1 个答案:

答案 0 :(得分:1)

调用LSTM构造函数时,您应该有return_sequences=Truereturn_state=False

在您的代码段中,LSTM仅返回其最后一个状态,而不是每个输入嵌入的状态序列。从理论上讲,您可能已经从错误消息中发现了它:

  

logit和标签的第一维必须相同,logits形状为[32,186],标签形状为[4704]

日志必须是三维的:批处理大小×序列长度×类数。序列的长度是147,实际上是32×147 = 4704(标签的数量)。这本可以告诉您序列的长度消失了。