LSTM 自动编码器的可变长度输入 - Keras
Variable length input for LSTM autoencoder- Keras
我正在尝试使用 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 自动编码器模型中使用可变长度输入序列进行训练和预测。
如果我使用这种模型架构进行文本离群值检测的思考过程是正确的。
仍然需要进行填充以使输入可以是 3d 数组(张量),但 Keras 实际上提供了 masking 层供您忽略输入张量中填充的 0。这样模型就不会受到paddings的影响。
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')))
我正在尝试使用 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 自动编码器模型中使用可变长度输入序列进行训练和预测。
如果我使用这种模型架构进行文本离群值检测的思考过程是正确的。
仍然需要进行填充以使输入可以是 3d 数组(张量),但 Keras 实际上提供了 masking 层供您忽略输入张量中填充的 0。这样模型就不会受到paddings的影响。
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')))