gpt4 book ai didi

python - LSTM如何处理变长序列

转载 作者:太空狗 更新时间:2023-10-30 02:25:13 25 4
gpt4 key购买 nike

我在 deep Deep Learning with Python 的第 7 章第 1 节中找到了一段代码如下:

from keras.models import Model
from keras import layers
from keras import Input

text_vocabulary_size = 10000
question_vocabulary_size = 10000
answer_vocabulary_size = 500

# Our text input is a variable-length sequence of integers.
# Note that we can optionally name our inputs!
text_input = Input(shape=(None,), dtype='int32', name='text')

# Which we embed into a sequence of vectors of size 64
embedded_text = layers.Embedding(64, text_vocabulary_size)(text_input)

# Which we encoded in a single vector via a LSTM
encoded_text = layers.LSTM(32)(embedded_text)

# Same process (with different layer instances) for the question
question_input = Input(shape=(None,), dtype='int32', name='question')
embedded_question = layers.Embedding(32, question_vocabulary_size)(question_input)
encoded_question = layers.LSTM(16)(embedded_question)

# We then concatenate the encoded question and encoded text
concatenated = layers.concatenate([encoded_text, encoded_question], axis=-1)

# And we add a softmax classifier on top
answer = layers.Dense(answer_vocabulary_size, activation='softmax')(concatenated)

# At model instantiation, we specify the two inputs and the output:
model = Model([text_input, question_input], answer)
model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['acc'])

如你所见,这个模型的输入没有原始数据的形状信息,那么在 Embedding 层之后,LSTM 的输入或 Embedding 的输出是一些可变长度的序列。

model_summary

所以我想知道:

  • 在这个模型中,keras如何确定LSTM层中lstm_unit的个数
  • 如何处理变长序列

附加信息:为了解释什么是lstm_unit(我不知道怎么调用它,所以只显示图像):

lstm_unit

最佳答案

提供的循环层继承自基础实现 keras.layers.Recurrent,其中包括选项 return_sequences,默认为 False。这意味着默认情况下,循环层将消耗可变长度的输入,并最终仅在最后的顺序步骤中产生层的输出。

因此,使用None指定变长输入序列维度没有问题。

但是,如果您希望该层返回完整的输出序列,即输入序列每一步的输出张量,那么您必须进一步处理该输出的可变大小。

你可以通过让下一层进一步接受一个可变大小的输入来做到这一点,并在你的网络中解决这个问题,直到你最终必须从一些可变长度的东西计算损失函数,或者计算一些固定长度的表示,然后再继续到后面的层,具体取决于您的模型。

或者您可以通过要求固定长度的序列来做到这一点,可能会用特殊的标记值填充序列的末尾,这些标记值仅表示一个空序列项,纯粹用于填充长度。

另外,Embedding 层是一个非常特殊的层,它也是为处理可变长度输入而构建的。对于输入序列的每个标记,输出形状将具有不同的嵌入向量,因此形状为(批量大小、序列长度、嵌入维度)。由于下一层是 LSTM,所以这没问题……它也会愉快地使用可变长度序列。

但是正如嵌入文档中提到的那样:

input_length: Length of input sequences, when it is constant.
This argument is required if you are going to connect
`Flatten` then `Dense` layers upstream
(without it, the shape of the dense outputs cannot be computed).

如果您想直接从Embedding 转到非可变长度表示,那么您必须提供固定序列长度作为层的一部分。

最后,请注意,当您表达 LSTM 层的维度时,例如 LSTM(32),您是在描述该层输出空间的维度。

# example sequence of input, e.g. batch size is 1.
[
[34],
[27],
...
]
--> # feed into embedding layer

[
[64-d representation of token 34 ...],
[64-d representation of token 27 ...],
...
]
--> # feed into LSTM layer

[32-d output vector of the final sequence step of LSTM]

为了避免批量大小为 1 的低效率,一种策略是按每个示例的序列长度对输入的训练数据进行排序,然后根据共同的序列长度分组到批处理中,例如使用自定义 Keras数据生成器。

这具有允许大批量大小的优势,特别是如果您的模型可能需要批量归一化或涉及 GPU 密集型训练,甚至只是为了减少批量更新梯度的噪声估计。但它仍然允许您处理针对不同示例具有不同批处理长度的输入训练数据集。

但更重要的是,它还有一个很大的优势,即您无需管理任何填充即可确保输入中的公共(public)序列长度。

关于python - LSTM如何处理变长序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49925374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com