keras Двунаправленный слой с использованием 4-х мерных данных - PullRequest
0 голосов
/ 26 ноября 2018

Я разрабатываю модель keras для классификации на основе данных товара.

У меня есть данные с четырьмя измерениями следующим образом

[batch, article_num, word_num, word embedding size]

, и я хочу кормить каждого (word_num, вложение слова) данные в керас Двунаправленный слой

, чтобы получить результат с 3 измерениями следующим образом.

[batch, article_num, bidirectional layer output size]

, когда я попытался передать данные 4 измерений для тестирования, подобного этому

inp = Input(shape=(article_num, word_num, ))
# dims = [batch, article_num, word_num]

x = Reshape((article_num * word_num, ), input_shape = (article_num, word_num))(inp)
# dims = [batch, article_num * word_num]

x = Embedding(word_num, word_embedding_size, input_length = article_num * word_num)(x)
# dims = [batch, article_num * word_num, word_embedding_size]

x = Reshape((article_num , word_num, word_embedding_size), 
             input_shape = (article_num * word_num, word_embedding_size))(x)
# dims = [batch, article_num, word_num, word_embedding_size]

x = Bidirectional(CuDNNLSTM(50, return_sequences = True), 
                  input_shape=(article_num , word_num, word_embedding_size))(x)

и я получил ошибку

ValueError: Input 0 is incompatible with layer bidirectional_12: expected ndim=3, found ndim=4

как мне этого добиться?

1 Ответ

0 голосов
/ 26 ноября 2018

Если вы не хотите, чтобы оно касалось размера article_num, вы можете попробовать использовать оболочку TimeDistributed.Но я не уверен, что он будет совместим с двунаправленными и другими вещами.

inp = Input(shape=(article_num, word_num))    

x = TimeDistributed(Embedding(word_num, word_embedding_size)(x))

#option 1
#x1 shape : (batch, article_num, word_num, 50)
x1 = TimeDistributed(Bidirectional(CuDNNLSTM(50, return_sequences = True)))(x)

#option 2
#x2 shape : (batch, article_num, 50)
x2 = TimeDistributed(Bidirectional(CuDNNLSTM(50)))(x)

Подсказки:

  • Не используйте input_shape везде, вам это нужно толькона Input тензоре.
  • Вероятно, вам не понадобятся какие-либо изменения, если вы также используете TimeDistributed во вложении.
  • Если вы не хотите, чтобы word_num в конечном измерении, используйте return_sequences=False.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...