簡體   English   中英

LSTM 自動編碼器的可變長度輸入 - Keras

[英]Variable length input for LSTM autoencoder- Keras

我正在嘗試使用 Keras 中的 LSTM 層的自動編碼器 model 進行文本異常值檢測。 我將每個句子編碼成一個數字序列,每個數字代表一個字母。

到目前為止,我已經訓練了一個具有固定長度輸入的 model,通過將零填充到 4000 個序列中的每一個直到 maxlength = 40 從而使用 [4000,40,1] 形狀的數組([batch_size,timesteps特征])。

現在我想知道如何使用這樣的自動編碼器 model 而不向每個序列(句子)填充零,從而使用每個句子(序列)的實際大小進行訓練和預測。

目前我已經標准化了每個序列,所以我的火車數據(x_train)是一個 arrays 列表,並且列表中的每個數組都代表不同長度的標准化數字序列。

要將這些數據輸入到 LSTM model 我正在嘗試重塑為 3d 數組:

x_train=np.reshape(x_train, (len(x_train), 1, 1))

不確定這是否正確。

我的 model 看起來像這樣(我刪除了 input_shape 參數,因此 model 可以接受可變長度輸入):


model = Sequential()
model.add(LSTM(20, activation='tanh',return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(5, activation='tanh', return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(20, activation='tanh', return_sequences=True))
model.add((Dense(1,activation='tanh')))

然后在嘗試編譯和訓練 model

nb_epoch = 10
model.compile(optimizer='rmsprop', loss='mse')
checkpointer = ModelCheckpoint(filepath="text_model.h5",
                               verbose=0,
                               save_best_only=True)

es_callback = keras.callbacks.EarlyStopping(monitor='val_loss')

history = model.fit(x_train, x_train,
                    epochs=nb_epoch,
                    shuffle=True,
                    validation_data=(x_test, x_test),
                    verbose=0,
                    callbacks=[checkpointer,es_callback])

我收到錯誤:“ValueError:使用序列設置數組元素。”

我的 model 總結如下:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_6 (LSTM)                (None, 1, 20)             1760      
_________________________________________________________________
lstm_7 (LSTM)                (None, 1, 15)             2160      
_________________________________________________________________
lstm_8 (LSTM)                (None, 1, 5)              420       
_________________________________________________________________
lstm_9 (LSTM)                (None, 1, 15)             1260      
_________________________________________________________________
lstm_10 (LSTM)               (None, 1, 20)             2880      
_________________________________________________________________
dense_2 (Dense)              (None, 1, 1)              21        
=================================================================
Total params: 8,501
Trainable params: 8,501
Non-trainable params: 0
_________________________________________________________________

所以我的問題是,是否可以在 LSTM 自動編碼器 model 中使用可變長度輸入序列進行訓練和預測。

如果我對使用這種 model 架構的文本異常值檢測的思考過程是正確的。

仍然必須進行填充,以便輸入可以是 3d 數組(張量),但 Keras 實際上為您提供了掩蔽層,以忽略輸入張量中填充的 0。 這樣 model 就不會受到填充的影響。

from keras.models import Sequential
from keras.layers import LSTM, Dense, Masking

model = Sequential()
model.add(Masking(mask_value=0.0, input_shape=(timesteps, features)))
model.add(LSTM(20, activation='tanh',return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(5, activation='tanh', return_sequences=True))
model.add(LSTM(15, activation='tanh', return_sequences=True))
model.add(LSTM(20, activation='tanh', return_sequences=True))
model.add((Dense(1,activation='tanh')))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM