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

构建Decoder初始状态与Encoder一致的LSTM编解码器遇问题求助

问题解决与模型解析

第一个模型:输入不匹配错误修复

你遇到的The model expects 2 input arrays, but only received one array错误,根源在于你的函数式API模型定义了两个输入层(编码器输入和解码器输入),但调用model.fit()时只传入了一组数据。

因为你做的是序列自编码任务(输出与输入一致),解码器的输入可以直接复用编码器的输入序列。只需要修改训练代码,把输入数据以列表形式传入两次即可:

history=model.fit([xtrain, xtrain], xtrain, epochs=200, verbose=2, shuffle=False)

这样模型就能同时接收到编码器和解码器的输入,匹配你定义的输入层结构。

第二个模型:RepeatVector的作用与状态传递说明

先明确一个关键点:RepeatVector并没有将编码器的LSTM状态(隐藏状态h和细胞状态c)作为解码器的初始状态。它的核心作用是把编码器最后输出的单个向量(形状为(latent_dim,))重复n_timesteps_in次,转换成(n_timesteps_in, latent_dim)的序列,作为解码器LSTM的输入序列——本质是传递输出值,而非状态。

如果想让这个Sequential风格的模型实现“解码器初始状态与编码器一致”,Sequential API会比较受限(它无法直接跨层传递状态),推荐改用函数式API调整,既保留原模型的输入逻辑,又实现状态传递:

from keras.models import Model
from keras.layers import Input, LSTM, RepeatVector, TimeDistributed, Dense

n_timesteps_in = 20
n_features = 1
latent_dim = 100

# 编码器部分:保留原逻辑,同时提取最终状态
encoder_inputs = Input(shape=(n_timesteps_in, n_features))
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
encoder_states = [state_h, state_c]

# 解码器部分:用RepeatVector生成输入序列,同时传入编码器状态作为初始状态
decoder_inputs = RepeatVector(n_timesteps_in)(encoder_outputs)
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = TimeDistributed(Dense(n_features, activation='tanh'))
decoder_outputs = decoder_dense(decoder_outputs)

# 构建并训练模型:此时只需传入一组输入数据
model = Model(encoder_inputs, decoder_outputs)
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
history=model.fit(train, train, epochs=epochs, verbose=2, shuffle=False)

这个修改后的模型既保留了原Sequential模型的输入逻辑,又让解码器的初始状态与编码器的最终状态完全对齐,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:30