python-3.x - 如何解决“logits 和 labels 必须具有相同的第一维”错误
问题描述
我正在为基于单词的 NLP 尝试不同的神经网络架构。
到目前为止,我已经在本教程的指导下使用了 GRU 的双向、嵌入式和模型:https ://towardsdatascience.com/language-translation-with-rnns-d84d43b40571 ,一切都很好。但是,当我尝试使用 LSTM 时,我收到一条错误消息:
logits 和 labels 必须具有相同的第一维,得到 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
- 目标词汇大小 = 186
我已经在这里查看过类似的问题并尝试添加 Reshape 图层
simple_lstm_model.add(Reshape((-1,)))
但这只会导致以下错误:
“TypeError:__int__ 返回非 int(类型 NoneType)”
这真的很奇怪,因为我对所有模型都以相同的方式预处理数据集,并且除了上述之外它工作得很好。
解决方案
您应该拥有return_sequences=True
并return_state=False
调用 LSTM 构造函数。
在您的代码段中,LSTM 仅返回其最后一个状态,而不是每个输入嵌入的状态序列。理论上,您可以从错误消息中发现它:
logits 和 labels 必须具有相同的第一维,得到 logits 形状 [32,186] 和标签形状 [4704]
logits 应该是三维的:批量大小 × 序列长度 × 类数。序列的长度是 147,实际上是 32 × 147 = 4704(标签数)。这可能告诉你序列的长度消失了。
推荐阅读
- python - 我如何检查两个 request.form 元素以查看它们在 python 中是否相等?
- excel - 在 2 或 3 页上运行宏
- xml - 如何对具有 XMLType 列的表使用 Order by、Group by、Count() 等操作?
- jquery - Json 响应数据获取到 html 表
- java - 使用 SSL 的 Nexus Repository Manager 3 浏览器或 Docker 无法访问
- java - 在 8 谜题游戏中获得继任者
- c++ - 在 C++ 中返回一个 lambda 函数
- uwp - 警告 NU1605 检测到包降级:Microsoft.NETCore.UniversalWindowsPlatform 从 6.0.8 到 5.2.3
- javascript - 如何让动画淡入淡出
- 使用 React 还是 CSS?
- python - 未知初始化器:加载 Keras 模型时的 GlorotUniform