构建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
相关产品推荐
相关产品推荐

