размеры целевого вектора для LSTM RNN со слоем внедрения - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь построить модель LSTM для генерации текста.В керасе моя модель выглядела бы примерно так:

model= Sequential()
model.add( Embedding(vocab_size, embedding_dim) )
model.add( LSTM( units=embedding_dim, input_shape=(None, embedding_dim), return_sequences=True) )
model.add( LSTM( units=embedding_dim, input_shape=(None, embedding_dim), return_sequences=True) )
model.add( Dense(vocab_size, activation='softmax') )
model.compile( optimizer='adam', loss='categorical_crossentropy')

Я понимаю преимущества слоя внедрения для моделей LSTM: уменьшенный объем памяти входного массива, аналогичные переменные отображаются в закрытые области в скрытом пространствеи т. д. Это позволяет мне передавать массив категорий непосредственно в мой LSTM без необходимости в одном горячем кодировании.Рассмотрим следующий категориальный набор данных с vocab_size = 9:

X= [ [1,2,3], [4,5,6], [7,8,9] ]

Мой вклад в слой внедрения будет

X= [ [1,2], [4,5], [7,8] ]

Мой вопрос касается формы целевого вектора Y.категориальная перекрестная потеря энтропии, я все еще вынужден один горячий кодировать Y. Непосредственно, мне нужно один горячий кодировать следующий вектор:

Y= [ [2,3], [5,6], [8,9] ]

Мне странно, что я могу обойтись безодно горячее кодирование X, но все еще нужно одно горячее кодирование Y. Это, кажется, идет вразрез с аргументами использования памяти, которые я прочитал для использования слоя встраивания, поскольку я все еще вынужден использовать одно горячее кодирование Y, которое теоретически может быть очень большимдля большого vocab_size.

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

1 Ответ

0 голосов
/ 15 февраля 2019

Вы можете использовать sparse_categorical_crossentropy как потерю вместо categorical_crossentropy.В этом случае ваши ярлыки не должны иметь горячее кодирование, что действительно может сэкономить память, когда у вас большой словарный запас.

model.compile( optimizer='adam', loss='sparse_categorical_crossentropy')
...