Keras.js представляет собой JavaScript-библиотеку, позволяющую выполнять предобученные модели Keras непосредственно в браузере или на Node.js. Генерация текста символ за символом — одна из классических задач, где модель обучается предсказывать следующий символ на основе предыдущих, что позволяет создавать последовательности текста, имитирующие стиль исходного корпуса.
Для генерации текста требуется нейронная сеть, обученная на последовательностях символов. Наиболее подходящая архитектура — рекуррентная нейронная сеть (RNN), чаще всего с LSTM-ячейками:
Модель создается и обучается в Python с использованием Keras, а затем экспортируется для Keras.js. Экспорт включает:
model.to_json()).model.save_weights()),
после чего веса конвертируются в формат Keras.js
(kerasjs-converter).Для работы с моделью в браузере используется следующий порядок:
const model = new KerasJS.Model({
filepath: 'model.bin', // бинарный файл с весами
gpu: true // использование WebGL для ускорения
});
await model.ready();
Ключевой момент: загрузка модели является
асинхронной, поэтому любые вычисления можно начинать только после
await model.ready().
Генерация текста начинается с подготовки входной последовательности:
[длина_последовательности, размер_алфавита], где каждый
символ представлен вектором с единицей на позиции индекса символа.Пример функции преобразования символа в one-hot:
function charToOneHot(char, charToIndex, vocabSize) {
const vector = new Float32Array(vocabSize).fill(0);
vector[charToIndex[char]] = 1;
return vector;
}
Алгоритм генерации текста:
seed), который станет первой
последовательностью.seed в one-hot представление.Пример функции генерации одного символа:
async function sampleNextChar(model, inputSeq, temperature = 1.0) {
const output = await model.predict({ input: inputSeq });
const probs = output.data;
// Применение температуры
const adjustedProbs = probs.map(p => Math.pow(p, 1 / temperature));
const sum = adjustedProbs.reduce((a, b) => a + b, 0);
const normalizedProbs = adjustedProbs.map(p => p / sum);
let r = Math.random();
let cumulative = 0;
for (let i = 0; i < normalizedProbs.length; i++) {
cumulative += normalizedProbs[i];
if (r < cumulative) return i;
}
return normalizedProbs.length - 1;
}
Температура генерации:
temperature < 1 делает распределение более
«консервативным», символы с высокой вероятностью выбираются чаще.temperature > 1 увеличивает разнообразие текста,
появляется больше случайных символов.Для генерации длинного текста важно поддерживать окно фиксированной длины:
seqLength, при генерации нужно передавать только последние
seqLength символов.gpu: true
при инициализации модели позволяет использовать графический процессор
для вычислений, что ускоряет генерацию.Эта методика позволяет эффективно использовать Keras.js для генерации текста символ за символом, обеспечивая баланс между производительностью и разнообразием создаваемых последовательностей.