Реализация одного горячего кодирования - PullRequest
0 голосов
/ 31 августа 2018

Я уже понимаю использование и концепцию одного горячего кодирования с нейронными сетями. У меня вопрос только о том, как реализовать концепцию.

Скажем, например, у меня есть нейронная сеть, которая принимает до 10 букв (без учета регистра) и использует одну горячую кодировку. Каждый вход будет 26-мерным вектором некоторого вида для каждого пятна. Чтобы закодировать это, я действую так, как будто у меня 260 входов, каждый из которых отображает только 1 или 0, или есть какой-то другой стандартный способ реализации этих 26-мерных векторов?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Если у вас есть 10 различных элементов (например: a, b .... j ИЛИ 1,2 ... 10), которые должны быть представлены как вектор «одного горячего кодирования» измерения-26, то ваши входные данные равны 10 векторы, каждый из которых должен быть представлен 26-мерным вектором. Сделайте это:

y = torch.eye(26)      # If you want a tensor for each 'letter' of length 26.
y[torch.arange(0,10)]  #This line gives you 10 one hot-encoding vector each of dimension 26.

Надеюсь, это немного поможет.

0 голосов
/ 31 августа 2018

В вашем случае вы должны различаться между различными структурами. Я могу говорить за PyTorch , который является моей платформой goto при программировании нейронной сети.

Там горячее кодирование последовательностей обычно выполняется так, что ваша сеть будет ожидать последовательность индексов . Если взять в качестве примера 10 букв, это может быть последовательность ["a", "b", "c" , ...]
Слой встраивания будет инициализирован с «длиной словаря», т. Е. Количеством различных элементов (num_embeddings), которые ваша сеть может получить - в вашем случае 26. Кроме того, вы можете указать embedding_dim, т.е. выходное измерение один символ . Это уже прошло этап «горячих кодировок», поскольку вам, как правило, нужно, чтобы они знали, какое значение связать с этим элементом.

Затем вы должны передать кодированную версию приведенной выше строки в слой, который может выглядеть следующим образом: [0,1,2,3, ...]. Предполагая, что последовательность имеет длину 10, он будет выдавать [10,embedding_dim], то есть двумерный тензор.

Подводя итог, PyTorch, по сути, позволяет вам пропустить этот довольно утомительный этап его кодирования как одноразового кодирования. Это в основном связано с тем, что ваш словарный запас в некоторых случаях может быть довольно большим: рассмотрим, например, системы машинного перевода, в которых в вашем словаре может быть более 10 000 слов. Вместо того, чтобы хранить каждое отдельное слово как 10 000-мерный вектор, удобнее использовать один индекс.

Если это не должно полностью ответить на ваш вопрос (поскольку я, по сути, говорю вам, как это обычно предпочитается): вместо создания 260-мерного вектора вы бы снова использовали [10,26] Тензор, в котором каждая строка представляет другое письмо.

...