如何为搭配LSTM的Ragged张量设置输入格式 解决多输入传递报错问题
问题根因
- Sequential模型仅支持单输入单输出结构,你传入的是包含2个ragged张量的列表,与模型输入要求不匹配,这是触发报错的直接原因。
- Input层的shape参数设置错误:你每个样本仅包含
input、date22个特征,配置的(None,4)与实际特征维度不符。 - 两个独立的特征张量没有做特征维度拼接,无法直接输入到序列模型中。
解决方案
方案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
相关产品推荐
相关产品推荐

