Keras.io.preprocessing.sequence.pad_sequences 有啥作用?

Posted

技术标签:

【中文标题】Keras.io.preprocessing.sequence.pad_sequences 有啥作用?【英文标题】:What does Keras.io.preprocessing.sequence.pad_sequences do?Keras.io.preprocessing.sequence.pad_sequences 有什么作用? 【发布时间】:2017-08-14 01:46:32 【问题描述】:

可以在此处改进 Keras 文档。看完这篇,我还是不明白这到底是做什么的:Keras.io.preprocessing.sequence.pad_sequences

有人能说明这个函数的作用吗?最好提供一个例子?

【问题讨论】:

【参考方案1】:

一些例子:

>>> from keras.preprocessing.sequence import pad_sequences
>>> a = [[1, 2, 3], [3, 4, 5, 6], [7, 8]]

>>> # add the 0's on the beginning of sequences
>>> pad_sequences(a)
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [0, 0, 7, 8]])

>>> # add the 0's on the end of sequences
>>> pad_sequences(a, padding="post")
array([[1, 2, 3, 0],
       [3, 4, 5, 6],
       [7, 8, 0, 0]])

>>> # add a limit length of sequences
>>> pad_sequences(a, maxlen=3)
array([[1, 2, 3],
       [4, 5, 6],
       [0, 7, 8]])


>>> # add a limit length on the end of sequences
>>> pad_sequences(a, maxlen=3, padding="post")
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 0]])

【讨论】:

@oscfri 先生,我在这里有问题,***.com/questions/68429393/…。但是在将每一列转换为张量之后。如何实现 Lstm 或其他模型。有人建议使用 pad_sequence,但我不确定它是如何完成的。你能在那里回答吗? 您的列必须只包含数值,而不是使用pad_sequences 使所有批次的大小相等。比在 0-1 之间转换列中的所有数据。模型只能处理 1 个输入大小。【参考方案2】:

pad_sequences 用于确保列表中的所有序列具有相同的长度。默认情况下,这是通过在每个序列的开头填充 0 来完成的,直到每个序列的长度与最长序列的长度相同。

例如

>>> pad_sequences([[1, 2, 3], [3, 4, 5, 6], [7, 8]])
array([[0, 1, 2, 3],
       [3, 4, 5, 6],
       [0, 0, 7, 8]], dtype=int32)

[3, 4, 5, 6] 是最长的序列,因此0 将被填充到其他序列中,因此它们的长度与[3, 4, 5, 6] 匹配。

如果您想填充到序列的末尾,可以设置padding='post'

如果您想指定每个序列的最大长度,您可以使用maxlen 参数。这将截断所有长于maxlen 的序列。

>>> pad_sequences([[1, 2, 3], [3, 4, 5, 6], [7, 8]], maxlen=3)
array([[1, 2, 3],
       [4, 5, 6],
       [0, 7, 8]], dtype=int32)

现在每个序列的长度改为 3。

根据documentation 可以使用pad_sequences 控制截断。默认情况下,截断设置为pre,它会截断序列的开头部分。如果您想截断序列的结尾部分,可以将其设置为post

【讨论】:

在截断比maxlen更长的序列时,序列的开头部分是总是被删除还是随机选择的? @kasheemlew 根据documentation,您可以使用pad_sequencestruncating 参数来控制它。默认情况下,truncating 设置为 'pre',这会截断序列的开头部分。如果您想截断序列的结尾部分,可以将其设置为'post' @oscfri 关于如何在不使用 reshape 的情况下对张量执行填充的任何想法,因为 reshape 会破坏 tensorflow 中的梯度流 @DeepakM 正如我所知,重塑不应破坏梯度​​流。我已经做了很多次了,没有任何问题。我建议您就您的问题提出一个新问题。你看过这个question吗? 这样一个惊人的解释。非常感谢

以上是关于Keras.io.preprocessing.sequence.pad_sequences 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章