【问题标题】:Variable length input for LSTM autoencoder- KerasLSTM 自动编码器的可变长度输入 - Keras
【发布时间】:2019-09-20 08:58:41
【问题描述】:

我正在尝试在 Keras 中使用 LSTM 层的自动编码器模型来检测文本异常值。我已经将每个句子编码成一个数字序列,每个数字代表一个字母。

到目前为止,我已经训练了一个具有固定长度输入的模型,通过将零填充到 4000 个序列中的每个序列直到 maxlength = 40,从而使用 [4000,40,1] 形状的数组([batch_size , 时间步长, 特征])。

现在我想知道如何在不向每个序列(句子)填充零的情况下使用这种自动编码器模型,从而使用每个句子(序列)的实际大小进行训练和预测。

目前我已经标准化了每个序列,因此我的训练数据 (x_train) 是一个数组列表,并且列表中的每个数组都代表不同长度的数字的标准化序列。

要将这些数据输入到 LSTM 模型中,我正在尝试将其重塑为 3d 数组:

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

不确定这是否正确。

我的模型看起来像这样(我已经删除了 input_shape 参数,因此模型可以接受可变长度输入):


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')))

然后在尝试编译和训练模型时

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: setting an array element with a sequence。”

我的模型总结如下:

_________________________________________________________________
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 自动编码器模型中使用可变长度输入序列进行训练和预测。

如果我对使用这种模型架构进行文本异常值检测的思考过程是正确的。

【问题讨论】:

    标签: python tensorflow keras lstm autoencoder


    【解决方案1】:

    仍然必须进行填充,以便输入可以是 3d 数组(张量),但 Keras 实际上提供了masking 层让您忽略输入张量中填充的 0。这样模型就不会受到填充的影响。

    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')))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2019-10-13
      • 2016-11-06
      • 1970-01-01
      • 2017-11-27
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多