Keras的LSTM是否支持动态句子长度?

xxx*_*222 6 machine-learning neural-network deep-learning keras tensorflow

由于我看到人们在某个平台上争论说LSTMKeras不支持动态句子长度,我编写了以下代码.

embedding_size = 100
model = Sequential()
model.add(LSTM(32, return_sequences=True, input_shape=(None, embedding_size)))
Run Code Online (Sandbox Code Playgroud)

并且它给出了两个输入val1val2我馈送(这些输入的形状batch_size * sentence length * embedding size),

val1 = np.random.random((5,20,embedding_size))
val2 = np.random.random((5,10,embedding_size))
input = model.input
output = model.output

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    k1 = sess.run(output, feed_dict={input:val1})
    k2 = sess.run(output, feed_dict={input:val2})
    print k1.shape
    print k2.shape
Run Code Online (Sandbox Code Playgroud)

我有以下输出,满足了我的期望,LSTM在Keras是输入长度的动态,如果我们设定的input_shape(None, embedding_size),我在理解对吗?

(5,20,32)

(5,10,32)

Mar*_*jko 6

当然 - 正如您所提到的那样,可以将不同长度的序列馈送到Keras模型.情况是,在单个中,batch所有序列应具有相同的长度.从这个意义上说 - 实现动态序列长度支持是不可能的.

如果你更深入地考虑这个案例 - 你会发现即使你可以在不同的批次中输入不同长度的序列 - 这实际上可能会给你的训练过程带来一些偏见 - 因为相同/相似长度的序列总是在一起进行培训.