3-мерный массив в качестве входных данных с Embedded Layer и LSTM в Keras - PullRequest
0 голосов
/ 04 марта 2019

Эй, ребята, я построил модель LSTM, которая работает, и теперь я пытаюсь (безуспешно) добавить слой Embedding в качестве первого слоя.

Это решение не работает длямне.Я также прочитал эти вопросы перед тем, как спросить: Объяснение ввода Keras: input_shape, unit, batch_size, dim и т. Д. , Понимание примеров LSTM Keras и примеров keras .

Мой ввод - горячая кодировка (единиц и нулей) символов языка, состоящая из 27 букв.Я решил представлять каждое слово как последовательность из 10 символов.Размер ввода для каждого слова (10,27), у меня их 465, поэтому X_train.shape (465,10,27), у меня также есть метка размером y_train.shape (465,1).Моя цель состоит в том, чтобы обучить модель и в то же время сделать это для встраивания символов.

Теперь эта модель компилируется и умещается.

main_input = Input(shape=(10, 27))
rnn = Bidirectional(LSTM(5))
x = rnn(main_input)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)

После добавления слоя Embedding:

main_input = Input(shape=(10, 27))
emb = Embedding(input_dim=2, output_dim = 10)(main_input)
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)

output: ValueError: Вход 0 несовместим со слоем bidirectional_31: ожидаемый ndim = 3, найденный ndim = 4

Как исправить форму вывода?Ваши идеи будут высоко оценены.

1 Ответ

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

Мой ввод - горячая кодировка (единиц и нулей) символов языка, состоящая из 27 букв.

Вы не должны передавать горячее кодирование в Embedding.Embedding слои отображают целочисленный индекс на n-мерный вектор.В результате вы должны напрямую передать индексы с предварительным подогревом.

Т.е. до того, как у вас будет ввод с горячим вводом, например [[0, 1, 0], [1, 0, 0], [0, 0, 1]], который был создан из набора целых чисел, таких как [1, 0, 2].Вместо того, чтобы передавать (10, 27) однонаправленный векторный проход в исходный вектор (10,).

main_input = Input(shape=(10,)) # only pass in the indexes
emb = Embedding(input_dim=27, output_dim = 10)(main_input) # vocab size is 27
rnn = Bidirectional(LSTM(5))
x = rnn(emb)
de = Dense(1, activation='sigmoid')(x)
model = Model(inputs = main_input, outputs = de)
model.compile(loss='binary_crossentropy',optimizer='adam')
model.fit(X_train, y_train, epochs=10, batch_size=1, verbose=1)
...