【发布时间】:2017-12-06 00:04:42
【问题描述】:
我有一个关于 Keras 中 LSTM 的不同序列长度的问题。我将大小为 200 的批次和具有 100 个特征的序列中每个对象的可变长度 (= x) 序列 (=> [200, x, 100]) 传递到 LSTM:
LSTM(100, return_sequences=True, stateful=True, input_shape=(None, 100), batch_input_shape=(200, None, 100))
我在以下随机创建的矩阵上拟合模型:
x_train = np.random.random((1000, 50, 100))
x_train_2 = np.random.random((1000, 10,100))
就我正确理解 LSTM(和 Keras 实现)而言,x 应该指的是 LSTM 单元的数量。对于每个 LSTM 单元,必须学习一个状态和三个矩阵(用于单元的输入、状态和输出)。如何在不填充到最大值的情况下将不同的序列长度传递到 LSTM 中。指定长度,像我一样?代码正在运行,但实际上不应该(在我的理解中)。 之后甚至可以传递另一个序列长度为 60 的 x_train_3,但不应该有额外的 10 个单元格的状态和矩阵。
顺便说一下,我使用的是 Keras 版本 1.0.8 和 Tensorflow GPU 0.9。
这是我的示例代码:
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
from keras import backend as K
with K.get_session():
# create model
model = Sequential()
model.add(LSTM(100, return_sequences=True, stateful=True, input_shape=(None, 100),
batch_input_shape=(200, None, 100)))
model.add(LSTM(100))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
# Generate dummy training data
x_train = np.random.random((1000, 50, 100))
x_train_2 = np.random.random((1000, 10, 100))
y_train = np.random.random((1000, 2))
y_train_2 = np.random.random((1000, 2))
# Generate dummy validation data
x_val = np.random.random((200, 50, 100))
y_val = np.random.random((200, 2))
# fit and eval models
model.fit(x_train, y_train, batch_size=200, nb_epoch=1, shuffle=False, validation_data=(x_val, y_val), verbose=1)
model.fit(x_train_2, y_train_2, batch_size=200, nb_epoch=1, shuffle=False, validation_data=(x_val, y_val), verbose=1)
score = model.evaluate(x_val, y_val, batch_size=200, verbose=1)
【问题讨论】:
标签: sequence keras padding lstm recurrent-neural-network