Как кодировать категориальные данные, которые имеют переменную длину, чтобы их можно было извлечь в nn.Embedding в PyTorch - PullRequest
1 голос
/ 10 июля 2019

Допустим, у меня есть поле данных с именем movie_genre для каждого образца movie, оно выбрано из следующих жанров:

Action
Adventure
Animation
Comedy
...

И для каждого movie оно может содержать несколько жанров:

mid    genres
1      Action | Adventure
2      Animation
3      Comedy | Adventure | Action

, что означает, что жанры фильма - это список переменных.

Если я использую один горячий вектор для кодирования genre, действие может быть закодировано как (1, 0, 0,0), приключение может быть закодировано как (0, 1, 0, 0) и т. Д.

Таким образом, фильм с mid1 может быть закодирован как (1, 1, 0, 0), жанр mid2 может бытькодируется как (0, 0, 1, 0) и т. д.

Тем не менее, слой вложения Pytorch nn.Embedding принимает в качестве входных данных тензор, содержащий индексы, но не один горячий вектор.Так как же мне кодировать данные, чтобы их можно было извлечь в слой внедрения?

1 Ответ

0 голосов
/ 10 июля 2019

На данный момент я могу придумать два пути:

  • Превратите вашу проблему с несколькими метками в проблему с несколькими категориями. То есть для каждой комбинации меток создайте новую метку (например, Action | Adventure станьте ее собственной меткой), а затем вставьте эти новые метки как обычно.
  • Вставить отдельно каждую категорию и суммировать вложение всех категорий, отображаемых в вашем списке.

Редактировать: Вы можете использовать pytorch nn.EmbeddingBag для эффективного выполнения второй операции: https://pytorch.org/docs/stable/nn.html?highlight=nn%20e#torch.nn.EmbeddingBag

...