为什么在使用 one_hot 编码时需要 pad_sequences?
Why is does pad_sequences necessary when one_hot encoding is used?
在Keras中,我可以有如下代码:
docs
Out[9]:
['Well done!',
'Good work',
'Great effort',
'nice work',
'Excellent!',
'Weak',
'Poor effort!',
'not good',
'poor work',
'Could have done better.']
labels = array([1,1,1,1,1,0,0,0,0,0])
voc_size = 50
encoded = [one_hot(d, voc_size) for d in docs]
max_length = 4
padded_docs = pad_sequences(encoded, maxlen=max_length, padding='post')
我的理解是,'one_hot' 编码已经根据词汇量大小为每个文档创建了相等的长度。那为什么每个doc都需要重新padding呢?
编辑:另一个更清楚的例子:
one-hot 编码是将分类变量(例如猫、狗、老鼠)表示为二进制向量(例如 [1,0,0]、[0,1,0]、[0,0, 1]).
所以在这种情况下,猫、狗和老鼠被编码为等长的向量。这与上面的示例有何不同?
TLDR; one_hot
使每个索引都来自固定范围,没有结果列表具有固定长度。
为了理解这个问题,首先需要理解 one_hot
函数的实际作用。它将文档转换为一系列 int
索引,其长度与文档中的单词(标记)的数量大致相同。例如:
'one hot encoding' -> [0, 2, 17]
其中每个索引都是词汇表中单词的索引(例如 one
有索引 0
)。这意味着当您将 one_hot
应用于一系列文本(如您提供的代码片段中)时,您将获得列表索引列表,其中每个列表可能具有不同的长度。这是 keras
和 numpy
的问题,它们期望列表的列表采用 类似数组的形式 - 这意味着每个子列表应该具有相等的,固定长度。
这是通过 pad_sequences
函数完成的,该函数使每个子列表都具有固定长度。
在Keras中,我可以有如下代码:
docs
Out[9]:
['Well done!',
'Good work',
'Great effort',
'nice work',
'Excellent!',
'Weak',
'Poor effort!',
'not good',
'poor work',
'Could have done better.']
labels = array([1,1,1,1,1,0,0,0,0,0])
voc_size = 50
encoded = [one_hot(d, voc_size) for d in docs]
max_length = 4
padded_docs = pad_sequences(encoded, maxlen=max_length, padding='post')
我的理解是,'one_hot' 编码已经根据词汇量大小为每个文档创建了相等的长度。那为什么每个doc都需要重新padding呢?
编辑:另一个更清楚的例子:
one-hot 编码是将分类变量(例如猫、狗、老鼠)表示为二进制向量(例如 [1,0,0]、[0,1,0]、[0,0, 1]).
所以在这种情况下,猫、狗和老鼠被编码为等长的向量。这与上面的示例有何不同?
TLDR; one_hot
使每个索引都来自固定范围,没有结果列表具有固定长度。
为了理解这个问题,首先需要理解 one_hot
函数的实际作用。它将文档转换为一系列 int
索引,其长度与文档中的单词(标记)的数量大致相同。例如:
'one hot encoding' -> [0, 2, 17]
其中每个索引都是词汇表中单词的索引(例如 one
有索引 0
)。这意味着当您将 one_hot
应用于一系列文本(如您提供的代码片段中)时,您将获得列表索引列表,其中每个列表可能具有不同的长度。这是 keras
和 numpy
的问题,它们期望列表的列表采用 类似数组的形式 - 这意味着每个子列表应该具有相等的,固定长度。
这是通过 pad_sequences
函数完成的,该函数使每个子列表都具有固定长度。