Получите последовательность -1, 0 и 1 для объекта в качестве вывода из двунаправленного LSTM в кератах - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь построить двунаправленную модель 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 - этометка для заполнения) для каждого слова во введенной последовательности.

Любая помощь приветствуется.

...