Предварительная обработка для модели seq2seq - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь построить модель seq2seq, я пытался следовать официальному учебному пособию Tensorflow, но никаких шагов предварительной обработки не упоминалось. Я пытался выполнить поиск в Интернете, каждый учебник начинается с модели, нет информации о шагах предварительной обработки.

Мне нужна информация о шагах предварительной обработки, используемых в seq2seq:

Если у меня есть такой набор данных: (после кодирования с помощью словаря index2word)

encoder [1, 2, 1, 3, 4] decoder [2, 3, 4]
encoder [2, 3, 4, 1] decoder [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65]
encoder [4, 5, 3, 11, 23, 1, 33, 44, 1, 3] decoder [4, 2, 3, 5]
encoder [44, 55] decoder [5, 6, 3, 2, 4, 22, 42, 11, 34]
encoder [1] decoder [55, 6, 3, 2, 4, 5, 6, 7, 7]
encoder [4, 2, 3, 4, 5] decoder [6, 5, 3, 5, 6, 7, 8, 2, 4, 5]
encoder [44, 2, 1, 22, 5, 3, 2] decoder [6, 5, 3, 4, 5, 6, 7]
encoder [55, 3, 1, 5, 1] decoder [5, 3, 2, 3, 4, 5]
encoder [14] decoder [5, 6, 7]

Если я возьму 5 в качестве размера партии, то первая партия:

encoder [1, 2, 1, 3, 4] decoder [2, 3, 4]
encoder [2, 3, 4, 1] decoder [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65]
encoder [4, 5, 3, 11, 23, 1, 33, 44, 1, 3] decoder [4, 2, 3, 5]
encoder [44, 55] decoder [5, 6, 3, 2, 4, 22, 42, 11, 34]
encoder [1] decoder [55, 6, 3, 2, 4, 5, 6, 7, 7]

Теперь, прочитав много статей, я обнаружил, что есть четыре специальных токена, которые вы должны использовать для кодирования данных:

<PAD>: во время обучения нам нужно будет передать наши примеры сеть в пакетном режиме.

<EOS>: это еще одна необходимость дозирования, но больше о сторона декодера. Это позволяет нам сказать декодеру, где предложение заканчивается, и это позволяет декодеру указывать то же самое в его также выводит.

<UNK>: заменить неизвестное на.

<GO>: это вход для первого временного шага декодера, чтобы декодер знает, когда начинать генерировать вывод.

Теперь, если я возьму свой пакетный пример, у меня возникнет вопрос после заполнения:

должен ли пакет кодера быть такого же размера, что и пакет декодера?

Если пакет данных моего дополненного кодировщика выглядит следующим образом:

encoder_input=[[1, 2, 1, 3, 4],
[2, 3, 4, 1],
[4, 5, 3, 11, 23, 1, 33, 44, 1, 3],
[44, 55],
[1]]

#after padding ( max time stamp is 10 )

encoder_padded=[[1, 2, 1, 3, 4, 0, 0, 0, 0, 0],
                [2, 3, 4, 1, 0, 0, 0, 0, 0, 0],
                [4, 5, 3, 11, 23, 1, 33, 44, 1, 3],
                [44, 55, 0, 0, 0, 0, 0, 0, 0, 0],
                [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

Теперь я должен добавить длину последовательности моего декодера к тому же размеру? (максимум 10?) или я должен дополнить последовательность макс. декодера (максимум 12) следующим образом:

decoder_input=[[2, 3, 4],
               [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65],
               [4, 2, 3, 5],
               [5, 6, 3, 2, 4, 22, 42, 11, 34],
               [55, 6, 3, 2, 4, 5, 6, 7, 7]]

#after padding ( decoder batch max length is 12)

decoder_padded=[[2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
               [11, 3, 4, 5, 1, 22, 45, 1, 3, 42, 32, 65],
               [4, 2, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0],
               [5, 6, 3, 2, 4, 22, 42, 11, 0, 0, 0, 0],
               [55, 6, 3, 2, 4, 5, 6, 7, 7, 0, 0, 0]]

и как должны выглядеть мои последние предварительно обработанные данные:

encoder_input  = ['hello','how','are','you','<PAD>','<PAD>','<PAD'>]

decoder_output = ['<GO>','i','am','fine','<EOS>','<PAD>','<PAD>']   

это правильный формат?

1 Ответ

0 голосов
/ 29 июня 2018

Надеюсь, это полезно.

должен ли пакет кодера быть того же размера, что и пакет декодера?

Нет, расчеты декодера следуют за кодером, поэтому соответствующие данные будут поступать в сеть в разное время. Пример, который вы показали, верен.

Одна небольшая поправка в последнем примере, которую вы упоминаете как decoder_output, должна быть decoder_input. Для этой пары входных данных целевая метка должна иметь:

encoder_input  = ['hello','how','are','you','<PAD>','<PAD>','<PAD'>]
decoder_input  = ['<GO>','i','am','fine','<EOS>','<PAD>','<PAD>'] 
target_label   = ['i','am','fine','<EOS>','<PAD>','<PAD>'] 
...