You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为搭配LSTM的Ragged张量设置输入格式 解决多输入传递报错问题

问题根因
  1. Sequential模型仅支持单输入单输出结构,你传入的是包含2个ragged张量的列表,与模型输入要求不匹配,这是触发报错的直接原因。
  2. Input层的shape参数设置错误:你每个样本仅包含input、date22个特征,配置的(None,4)与实际特征维度不符。
  3. 两个独立的特征张量没有做特征维度拼接,无法直接输入到序列模型中。
解决方案

方案1:拼接为单输入(适配Sequential模型)

第一步:修改输入处理逻辑,拼接特征

# 分别生成两个特征的ragged张量
input_feat = tf.ragged.constant(d0.groupby("id")["input"].apply(list))
date2_feat = tf.ragged.constant(d0.groupby("id")["date2"].apply(list))
# 扩展维度后沿最后一维拼接,得到形状为(样本数, 序列长度, 2)的统一输入张量
inputs = tf.concat([tf.expand_dims(input_feat, axis=-1), tf.expand_dims(date2_feat, axis=-1)], axis=-1)

第二步:修正模型Input层配置

mod1 = keras.Sequential([
    # 特征维度调整为2,移除固定batch_size配置适配自动批量计算
    keras.layers.Input(shape=(None, 2), dtype=tf.float32, ragged=True),
    keras.layers.LSTM(units=32, dtype=tf.float32, return_sequences=True, use_bias=False),
    keras.layers.Dense(units=32),
    keras.layers.Dense(units=1)
])

第三步:训练时直接传入拼接后的输入

history = mod1.fit(
    x=inputs,
    y=target,
    epochs=1,
    batch_size=1 # 若要保留原单样本批量训练逻辑可保留该参数
)

方案2:使用Functional API实现多输入

如果你需要保留多输入结构,无需提前拼接特征,可以改用Keras函数式API构建模型:

# 定义两个输入层
input1 = keras.layers.Input(shape=(None,), dtype=tf.float32, ragged=True)
input2 = keras.layers.Input(shape=(None,), dtype=tf.float32, ragged=True)
# 层内拼接特征
feat1 = tf.expand_dims(input1, axis=-1)
feat2 = tf.expand_dims(input2, axis=-1)
concat_feat = keras.layers.Concatenate(axis=-1)([feat1, feat2])
# 后续网络结构
lstm_layer = keras.layers.LSTM(units=32, return_sequences=True, use_bias=False)(concat_feat)
dense_layer1 = keras.layers.Dense(32)(lstm_layer)
output_layer = keras.layers.Dense(1)(dense_layer1)
# 实例化多输入模型
mod1 = keras.Model(inputs=[input1, input2], outputs=output_layer)

编译和训练逻辑无需修改,可直接传入原inputs列表训练。

内容的提问来源于stack exchange,提问作者Scuba Steve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:15:04