Я пытаюсь построить двунаправленную модель LSTM, в которой поверх слоя находится слово.Входной последовательностью будет массив, который содержит размер вложения 128 для каждого слова.Цель (метка) будет массивом -1, 0 и 1. Обе функции и метки дополняются, и длина самого длинного предложения (массива слов) используется в качестве длины ввода.При прогнозировании выходных данных должна быть последовательность -1, 0, 1. Прежде чем читать дальше, знайте, что я очень новичок в Keras.
Это мой код, а под ним объяснены переменные:
self.model = Sequential()
embedding_layer = Embedding(self.vocab_size, self.embedding_dimension, weights=[self.weight_matrix],
input_length=self.max_sentence_length, trainable=False)
self.model.add(embedding_layer)
bidirectional = Bidirectional(LSTM(self.units, return_sequences=self.return_sequences),
input_shape=self.input_shape)
self.model.add(bidirectional)
self.model.add(TimeDistributed(Dense(3)))
self.model.compile(loss=self.loss_function, optimizer=self.optimizer, metrics="acc")
Ниже перечислены переменные:
vocab_size = 100003
embedding_dimension = 128
weight_matrix = (100003, 128)
max_sentence_length = 267
units = 20
return_sequences = True
input_shape = (500, 267) # where 500 = number of sequences
loss_function = "binary_crossentropy"
optimizer = "adam"
Я пытаюсь тренироваться, используя следующую строку кода:
self.model.fit([self.padded_features], [self.padded_labels], epochs=layer_epochs, batch_size=batch_size, verbose=verbose, validation_split=validation_frac, callbacks=self.custom_metrics)`
padded_features и padded_labels имеют размер (500, 267) означает 500 последовательностей, каждая из которых имеет в общей сложности 267 отдельных целочисленных значений, причем каждое значение представляет собой слово (и заполнение).Весовая матрица, используемая для слоя внедрения, может быть видна как словарь, в котором целочисленное значение, представляющее слово, затем переводится в его слой внедрения 128.
Однако, когда я запускаю свой код, я получаюследующая ошибка:
ValueError: Error when checking target: expected time_distributed_1 to have 3 dimensions, but got array with shape (500, 267)
Я думал, что вывод LSTM является 3D.Я пытался решить эту проблему в течение нескольких часов, но не нашел способа ее исправить.Я пытался отлаживать и смотреть на фигуры, когда они переходят из одного слоя в другой, и пытался поместить слои Reshape между ними, но мне это тоже не удалось.
Мне нужно, чтобы конечный результат LSTM составлял 3 значения на слово в последовательности, чтобы затем я получал одну выходную последовательность на входную последовательность, которая заполнена 0, 1 и -1 (-1 - этометка для заполнения) для каждого слова во введенной последовательности.
Любая помощь приветствуется.