Я уже понимаю использование и концепцию одного горячего кодирования с помощью нейронных сетей. Мой вопрос только в том, как реализовать эту концепцию.
Скажем, например, у меня есть нейронная сеть, которая принимает до 10 букв (без учета регистра) и использует одно горячее кодирование. Каждый вход будет 26-мерным вектором определенного вида для каждой точки. Чтобы закодировать это, я действую так, как будто у меня есть 260 входов, каждый из которых отображает только 1 или 0, или есть какой-то другой стандартный способ реализовать эти 26 размерных векторов?
В вашем случае вам нужно различать разные фреймворки. Я могу говорить о 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]
, в котором каждая строка представляет собой отдельную букву.
Если у вас есть 10 различных элементов (например: a, b .... j OR 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.
Надеюсь, что это помогает немного.
Тензор 10x26 (он же матрица) по-прежнему имеет 260 элементов, поэтому ответ на вопрос OP: да, ваша сеть будет иметь 260 входов.