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_sequences
的truncating
参数来控制它。默认情况下,truncating
设置为 'pre'
,这会截断序列的开头部分。如果您想截断序列的结尾部分,可以将其设置为'post'
。
@oscfri 关于如何在不使用 reshape 的情况下对张量执行填充的任何想法,因为 reshape 会破坏 tensorflow 中的梯度流
@DeepakM 正如我所知,重塑不应破坏梯度流。我已经做了很多次了,没有任何问题。我建议您就您的问题提出一个新问题。你看过这个question吗?
这样一个惊人的解释。非常感谢以上是关于Keras.io.preprocessing.sequence.pad_sequences 有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章