Форма ввода для языковой модели Keras LSTM/GRU
Я пытаюсь обучить языковой модели на уровне слов в Керасе.
У меня есть свои X и Y, оба с формой (90582L, 517L)
Когда я пытаюсь соответствовать этой модели:
print('Build model...')
model = Sequential()
model.add(GRU(512, return_sequences=True, input_shape=(90582, 517)))
model.add(Dropout(0.2))
model.add(GRU(512, return_sequences=True))
model.add(Dropout(0.2))
model.add(TimeDistributedDense(1))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
model.fit(x_pad, y_pad, batch_size=128, nb_epoch=2)
Я получаю ошибку:
Exception: Error when checking model input:
expected gru_input_7 to have 3 dimensions, but got array with shape (90582L, 517L)
Мне нужно некоторое руководство относительно того, какой должна быть форма ввода? Я сделал метод проб и ошибок на всевозможных комбинациях, но, похоже, я неправильно понял нечто фундаментальное.
В примере генерации текста Keras матрица X имела 3 измерения. Я понятия не имею, каким должно быть третье измерение.
1 ответ
Это зависит от того, что вы пытаетесь сделать. Я предполагаю, что ваши данные формы (90582, 517) представляют собой набор из 90582 выборок по 517 слов в каждой. Если это так, вы должны преобразовать свои слова в векторы слов (= вложения), чтобы они имели смысл. Тогда у вас будет форма (90582, 517, embedding_dim), которая может быть обработана ГРУ.
Слой Keras Embedding может сделать это за вас. Добавьте его в качестве первого слоя вашей нейронной сети перед первым слоем GRU.
vocabulary_size = XXXXX # give your vocabulary size here (largest word ID in the input)
embedding_dim = XXXX # give your embedding dimension here (e.g. 100)
print('Build model...')
model = Sequential()
model.add(Embedding(vocabulary_size, embedding_dim, input_shape=(90582, 517)))
model.add(GRU(512, return_sequences=True))
model.add(Dropout(0.2))
model.add(GRU(512, return_sequences=True))
model.add(Dropout(0.2))
model.add(TimeDistributedDense(1))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
model.fit(x_pad, y_pad, batch_size=128, nb_epoch=2)