Я пытаюсь использовать Brain.js для целей генерации текста.
См. Мой пример WIP по адресу: https://codepen.io/tomsoderlund/pen/WEPqzE (см. Также вывод консоли).
Я в основном:
wordsInOrder
dictionaryWords
со отсортированными уникальными словами.wordsInOrder
следующим образом: { input: [0.0326], output: [0.9565] }
, где input
- индекс словаря текущего словаря (нормализованный), а output
- следующий индекс словаря слова.Затем я генерирую новые слова:
brainJsNetwork.run([wordValue])
чтобы сгенерировать следующее слово. Однако, похоже, он застрял в словах в середине словаря, с wordValue
около 0,5:
Какие-нибудь подсказки, в чем проблема?
Я подозреваю, что это связано с вашим набором тренировок. Это должно отображать определенный ввод на правильный результат. Как в примере с цветовым контрастом brainjs:
net.train([{input: { r: 0.03, g: 0.7, b: 0.5 }, output: { black: 1 }},
{input: { r: 0.16, g: 0.09, b: 0.2 }, output: { white: 1 }},
{input: { r: 0.5, g: 0.5, b: 1.0 }, output: { white: 1 }}]);
Для списка входов это дает правильную категоризацию. Затем, если вы запустите обученную сеть, это дает вероятность категорий для вводимых вами данных:
var output = net.run({ r: 1, g: 0.4, b: 0 }); // { white: 0.99, black: 0.002 }
Вы создаете набор упражнений из словаInOrder. Это означает, что в вашем учебном наборе есть несколько слов, которые встречаются несколько раз. Слово типа "сделано" находится в вашем тренировочном наборе несколько раз с различными выходами:
made -> If (or the respective wordindex values, normalized to be between 0-1)
made -> It's
made -> outside
made -> in
Обученная сеть попытается компенсировать различные возможные результаты и усреднит вероятность, которую он выдает. Если затем вывести этот вывод для поиска слова в массиве dictionaryWords
слов, вы, вероятно, получите слова, которые находятся в середине массива (например, "нет" и "обязательно")
Вы должны учитывать, что нейронная сеть вернет вероятность ввода, принадлежащего определенной категории. поэтому, если вы хотите использовать его для прогнозирования следующего слова, вам нужно кодировать данные обучения по-разному. Есть 4 действительных следующих слова для "made", поэтому вам придется их кодировать, например...
{input: { (wordindex of 'made' }, output: { if: 1, its: 1, outside:1, in:1 }}
Конечно, это означает, что ваш результат будет иметь оценку вероятности для всех 92 уникальных слов в массиве dictionaryWords
слов. Я не уверен, может ли эта простая нейронная сеть использоваться с выходом с 92 измерениями.
Вы смотрели цепочки марков для генерации текста? Это упрощает моделирование того, какие переходы (от одного слова к следующему слову) более вероятны, чем другие.