为什么在使用 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 应用于一系列文本(如您提供的代码片段中)时,您将获得列表索引列表,其中每个列表可能具有不同的长度。这是 kerasnumpy 的问题,它们期望列表的列表采用 类似数组的形式 - 这意味着每个子列表应该具有相等的,固定长度。

这是通过 pad_sequences 函数完成的,该函数使每个子列表都具有固定长度。