Почему pad_sequence необходимы, когда используется кодировка one_hot? - PullRequest
1 голос
/ 10 октября 2019

В 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 уже создает равную длину каждого документа на основе размера словарного запаса. Итак, почему каждый документ должен быть дополнен снова?

РЕДАКТИРОВАТЬ: еще один пример для большей ясности:

Кодирование в одно касание - это представление категориальных переменных (например, кошка, собака, крыса)как двоичные векторы (например, [1,0,0], [0,1,0], [0,0,1]).

Таким образом, в этом случае кошка, собака и крыса кодируются как равныедлина вектора. Чем это отличается от приведенного выше примера?

1 Ответ

1 голос
/ 10 октября 2019

TLDR; one_hot делает каждый индекс из фиксированного диапазона, а список результатов не должен иметь фиксированную длину.

Чтобы понять эту проблему, нужно понятьчто на самом деле делает функция one_hot. Он преобразует документ в последовательность int индексов, длина которой приблизительно равна числу слов (токенов) в документе. Например:

'one hot encoding' -> [0, 2, 17]

, где каждый индекс - это индекс слова в словаре (например, one имеет индекс 0). Это означает, что когда вы применяете one_hot к последовательности текстов (как в предоставленном вами фрагменте кода), вы получаете список индексов списков, где каждый список может иметь разную длину. Это проблема для keras и numpy, которая ожидает, что список списков будет иметь вид в виде массива - это означает, что каждый подсписок должен иметь равную фиксированную длину.

Это делается с помощью функции pad_sequences, которая делает каждый из списков фиксированной длины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...