Как реализовать One2Seq NN в Keras / Tensorflow, который генерирует предложения на основе одного ввода? - PullRequest
0 голосов
/ 07 июля 2019

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

Упрощенный входной вектор - [isCat ?, isFish ?, isDog?, HasFurr?]

Выходной вектор - ['number, number, number, number ...'] - числа представляют собой словарные индексы.

Пример ввода: [0,0,1,1] - собака

Пример выходных данных: [«Это хорошая собачка!», «Конечно, он любит есть»]

Пример ввода: [1,0,0,1] - кошка

Пример выходных данных: [«Какая милая кошка :)», «Мяу-мяу-мяу!»]

Какая архитектура лучше всего подходит для моих требований?

Я прочитал несколько статей и прошел уроки, но обычно есть модели Seq2Seq (кодировщик-декодер). Я думаю, что это не так в моей ситуации, поскольку у меня нет последовательности входных данных, а теги не чувствительны к порядку.

На данный момент я собрал все данные, векторизованные входные и выходные данные - предложения представлены в виде словарных индексов (около 5000 слов) - и попытался создать некоторое DNN без использования RNN, но на самом деле эффекты плохие.

Я новичок в терминах ML, но я думаю, что должен быть какой-то RNN (LSTM, GRU), который получает теги в качестве входных данных , выдает какое-то слово и передает внутреннее состояние ( предыдущие слова + ввод тега) и вывод слова до следующей итерации, пока мы не встретим ожидаемую длину предложения. Однако я не уверен, как мне этого добиться.

Пример моего простого подхода DNN, который не сработал. Он принимает массив тегов с длиной input_size и возвращает предложение из 10 слов, где 3490 - текущий размер словаря. Обучено ~ 10 тыс. Предложений.

model = keras.Sequential([
    keras.layers.Dense(512, activation=tf.nn.relu, input_shape=(input_size,)),
    keras.layers.Dense(512, activation=tf.nn.relu),
    keras.layers.Dense(512, activation=tf.nn.relu),
    keras.layers.Dense(34900, activation=None),
    keras.layers.Reshape((10, 3490)),
    keras.layers.Activation("softmax")])
...