тензор потока керас встраивания lstm - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы использовать слой Embedding до подачи моих входных данных в сеть LSTM, которую я пытаюсь создать. Вот соответствующая часть кода:

input_step1 = Input(shape=(SEQ_LENGTH_STEP1, NR_FEATURES_STEP1), 
                           name='input_step1')

step1_lstm = CuDNNLSTM(50,
                       return_sequences=True,
                       return_state = True,
                       name="step1_lstm")

out_step1, state_h_step1, state_c_step1 = step1_lstm(input_step1)

Я немного запуталсяотносительно того, как я должен добавить слой Embedding здесь ..

Вот описание слоя Embedding из документации:

keras.layers.Embedding(input_dim, 
                       output_dim, 
                       embeddings_initializer='uniform',
                       embeddings_regularizer=None, 
                       activity_regularizer=None, 
                       embeddings_constraint=None, 
                       mask_zero=False, 
                       input_length=None)

Запутанная часть состоит в том, что мой определенный Inputимеет длину последовательности и количество определенных функций.Пишем это здесь снова:

input_step1 = Input(shape=(SEQ_LENGTH_STEP1, NR_FEATURES_STEP1), 
                           name='input_step1')

При определении слоя Embedded, я довольно смущен тем, какие параметры функции Embedding соответствуют «числу последовательностей» и «количеству объектов в каждом временном шаге»,Кто-нибудь может подсказать мне, как я могу интегрировать слой Embedding в мой код выше?

ADDENDUM:

Если я попробую следующее:

SEQ_LENGTH_STEP1  = 5 
NR_FEATURES_STEP1 = 10 

input_step1 = Input(shape=(SEQ_LENGTH_STEP1, NR_FEATURES_STEP1), 
                           name='input_step1')

emb = Embedding(input_dim=NR_FEATURES_STEP1,
                output_dim=15,
                input_length=NR_FEATURES_STEP1)

input_step1_emb = emb(input_step1)

step1_lstm = CuDNNLSTM(50,
                       return_sequences=True,
                       return_state = True,
                       name="step1_lstm")

out_step1, state_h_step1, state_c_step1 = step1_lstm(input_step1_emb)

Я получаю следующую ошибку:

ValueError: Input 0 of layer step1_lstm is incompatible with the layer:
expected ndim=3, found ndim=4. Full shape received: [None, 5, 10, 15]

Я явно не правильно делаю .. Есть ли способ интегрировать Embedding в сеть LSTM, которую я пытаюсь попробовать?

1 Ответ

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

Из Keras Встраивание документации:

Аргументы

  • input_dim: int> 0. Размер словаря, т.е. максимальный целочисленный индекс + 1.
  • output_dim: int> = 0. Размер плотного вложения.
  • input_length: длина входных последовательностей, когда она постоянна.Этот аргумент необходим, если вы собираетесь соединить Flatten, а затем плотные слои вверх по течению (без него невозможно вычислить форму плотных выходов).

Следовательно, из вашего описания, Я предполагаю, что:

  • input_dim соответствует размеру словарного запаса (количеству отдельных слов) вашего набора данных.Например, размер словаря следующего набора данных равен 5:

    data = ["Come back Peter,",
            "Come back Paul"]
    
  • output_dim - произвольный гиперпараметр, который указывает размер вашего пространства внедрения.Другими словами, если вы установите output_dim=x, каждое слово в предложении будет характеризоваться x признаками.

  • input_length должно быть установлено в SEQ_LENGTH_STEP1 (целое числос указанием длины каждого предложения), предполагая, что все предложения имеют одинаковую длину.

Выходная форма встраиваемого слоя: (batch_size, input_length, output_dim).


Дополнительные примечания относительно приложения:

  • team_in_step1 не определено.
  • Предполагая, что ваш первый слой является слоем Embedding, ожидаемая форма входного тензораinput_step1 is (batch_size, input_length):

    input_step1 = Input(shape=(SEQ_LENGTH_STEP1,), 
                               name='input_step1')
    

    Каждое целое число в этом тензоре соответствует слову.

  • Как упомянуто выше, слой внедрения может быть создан какследует:

    emb = Embedding(input_dim=VOCAB_SIZE,
                    output_dim=15,
                    input_length=SEQ_LENGTH_STEP1)
    

    , где VOCAB_SIZE - размер вашего словаря.

  • Этот ответ содержит воспроизводимый пример, который может оказаться полезным.
...