【问题标题】:initial state lstm encoder decoder keras初始状态 lstm 编码器 解码器 keras
【发布时间】:2025-03-01 03:50:02
【问题描述】:

我正在尝试构建一个 LSTM 编码器解码器,我的主要目标是解码器的初始状态与编码器相同。我从here 找到了下面的代码,并试图将其附加到我的案例中。我有一个形状为 (1000,20,1) 的数据。我希望编码器解码器在输出中将我的输入返回给我。即使我理解错误,我也不知道如何更正它正在工作的代码。当我尝试运行它时,我收到以下错误:

The model expects 2 input arrays, but only received one array. Found: 
array with shape (10000, 20, 1)




from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
from keras.layers import Dense
from keras.models import Sequential

latent_dim = 128
encoder_inputs = Input(shape=(20,1))
encoder = LSTM(latent_dim, return_state=True)
encoder_outputs, state_h, state_c = encoder(encoder_inputs)
# We discard `encoder_outputs` and only keep the states.
encoder_states = [state_h, state_c]
# Set up the decoder, using `encoder_states` as initial state.
decoder_inputs = Input(shape=(20, 1))
decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(1, activation='tanh')
decoder_outputs = decoder_dense(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
model.compile(optimizer='adam', loss='mse', metrics=['acc', 'mae'])

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

我也有这个模型,但我不确定如何在这里初始化与解码器状态相同的编码器状态。重复向量是这样做的吗?

#define model

model = Sequential()
model.add(LSTM(100, input_shape=(n_timesteps_in, n_features)))
model.add(RepeatVector(n_timesteps_in))
model.add(LSTM(100, return_sequences=True))
model.add(TimeDistributed(Dense(n_features, activation='tanh')))
model.compile(loss='mse', optimizer='adam', metrics=['mae'])

history=model.fit(train, train, epochs=epochs, verbose=2, shuffle=False)

【问题讨论】:

    标签: python keras lstm autoencoder


    【解决方案1】:

    您正在构建一个具有 2 个输入的模型,即 encoder_inputsdecoder_inputs 但只提供一个输入 .fit(xtrain, xtrain, ...) 第二个参数是输出。如果您需要提供另一个.fit([xtrain, the_inputs_for_decoder], xtrain, ...)

    形式的参数

    【讨论】:

    • 这取决于你如何预处理你的数据,你想要达到什么目标等等,你必须像定义xtrain一样为你的解码器定义你的输入。简单地说,您的模型需要另一个输入,您需要将其作为列表提供[enc_inputs, dec_inputs]
    • 从哪里定义 inputs_for_decoder ?模型不会自动定义解码器的这个输入吗?
    • 我只知道 lstm 编码器解码器必须预测相同的数据,因此 xtrain,xtrain。但我不知道如何定义 dec_inputs。我的意思是我不能说模型对输入进行编码并将其作为解码器的输入吗?这对我来说没有意义,或者我完全理解它。此外,重要的是编码器的初始状态与解码器的初始状态相同。也许你有一个例子告诉我如何解决这个问题?
    • 如果您为解码器提供相同的输入,那么它只会学习身份!您的代码旨在执行教师强制,仅在序列不同时才有效。你追求的是 seq2seq 自动编码器,看看thisthis
    • 我用额外的代码更新了我的帖子,这也是一个 seq2seq 自动编码器。但是不知道编码器和解码器的初始状态是否相同。重复向量是这样做的吗?
    最近更新 更多