python - Keras 功能 API 嵌入层输出到 LSTM
问题描述
将嵌入层的输出传递给 LSTM 层时,我遇到了一个ValueError
我无法弄清楚的问题。我的模型是:
def lstm_mod(self, n_cells,batch_size):
input = tf.keras.Input((self.n_seq, self.n_features))
embedding = tf.keras.layers.Embedding(batch_size,self.n_seq,input_length=self.n_clusters)(input)
x= tf.keras.layers.LSTM(n_cells)(embedding)
out = tf.keras.layers.Dense(1)(x)
model = tf.keras.Model(input, out,name="LSTM")
model.compile(loss='mse', optimizer='Adam')
return model
错误是:
ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 128, 7, 128]
鉴于传递给模型输入和嵌入层的维度通过模型的参数是一致的,我对此感到困惑。任何指导表示赞赏。
解决方案
None
当您通过模型提供数据时,Keras 添加了一个额外的维度 ( ),因为它会批量处理您的数据。
在这一行:
input = tf.keras.Input((self.n_seq, self.n_features))
您已经定义了一个二维输入,并且 Keras 添加了一个第三维(批次),因此expected ndim=3
.
但是,传递给输入层的数据是 4 维的,这意味着您的实际输入数据形状是 3 维 + 批次维度,而不是 2 维 + 批次。
要解决此问题,您需要将 3-D 输入重新整形为 2-D,或者向输入形状添加额外的维度。
打印出 和 的值self.n_seq
并 self.n_features
找出形状中缺少的内容128, 7, 128
,这应该可以指导您需要添加的内容。
推荐阅读
- python-3.x - 在会计odoo中过滤总帐报告中的日记帐项目
- java - 如何以编程方式配置 transaction-type="JTA"(没有 persistence.xml")?
- bash - Docker 无法将文件复制到挂载的卷
- java - 如何将文件的内容保存在 Java 的列表中?
- c# - DropdownlistFor 正在返回一个空值,如何解决?
- c++ - C++ 连接;字符串+双;运算符+ vs 运算符+=
- cxjs - 依赖字段验证
- adobe - adobe XD 无法创建文档(错误代码:3623)
- android - 在 Android 中创建动态 UI 后选择单选按钮时出错
- google-sheets - 将 strava/zapier 中的文本数据转换为用于计算