Я пытаюсь разработать 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")])