В этом руководстве вы изучите пример веб-приложения, которое использует веб-работника для обучения рекуррентной нейронной сети (RNN) сложению целых чисел. В примере приложения явно не определен оператор сложения. Вместо этого он обучает RNN, используя примеры сумм.
Конечно, это не самый эффективный способ сложения двух целых чисел! Но в руководстве демонстрируется важная техника веб-ML: как выполнять длительные вычисления без блокировки основного потока, который обрабатывает логику пользовательского интерфейса.
Пример приложения для этого руководства доступен в Интернете , поэтому вам не нужно загружать какой-либо код или настраивать среду разработки. Если вы хотите запустить код локально, выполните дополнительные действия, описанные в разделе «Выполнение примера локально» . Если вы не хотите настраивать среду разработки, вы можете перейти к разделу «Изучите пример» .
Код примера доступен на GitHub .
(Необязательно) Запустите пример локально.
Предварительные условия
Чтобы запустить пример приложения локально, в вашей среде разработки необходимо установить следующее:
- Node.js ( скачать )
- Пряжа ( установить )
Установите и запустите пример приложения
- Клонируйте или загрузите репозиторий
tfjs-examples
. Перейдите в каталог
addition-rnn-webworker
:cd tfjs-examples/addition-rnn-webworker
Установите зависимости:
yarn
Запустите сервер разработки:
yarn run watch
Изучите пример
Откройте пример приложения . (Или, если вы запускаете пример локально, перейдите по адресу http://localhost:1234
в своем браузере.)
Вы должны увидеть страницу под названием TensorFlow.js: Addition RNN . Следуйте инструкциям, чтобы попробовать приложение.
Используя веб-форму, вы можете обновить некоторые параметры, используемые для обучения модели, в том числе следующие:
- Цифры : максимальное количество цифр в добавляемых терминах.
- Размер обучения : количество создаваемых обучающих примеров.
- Тип RNN : один из SimpleRNN , GRU или LSTM .
- Размер скрытого слоя RNN : Размерность выходного пространства (должно быть положительным целым числом).
- Размер пакета : количество образцов на одно обновление градиента.
- Итерации обучения : количество раз обучения модели путем вызова
model.fit()
- Количество тестовых примеров : количество строк примеров (например,
27+41
), которые нужно сгенерировать.
Попробуйте обучить модель с различными параметрами и посмотреть, сможете ли вы повысить точность прогнозов для различных наборов цифр. Также обратите внимание, как на время подгонки модели влияют различные параметры.
Изучите код
В примере приложения демонстрируются некоторые параметры, которые можно настроить для обучения RNN. Он также демонстрирует использование веб-работника для обучения модели вне основного потока. Веб-воркеры важны в веб-ML, поскольку они позволяют выполнять ресурсоемкие учебные задачи в фоновом потоке, тем самым избегая потенциально влияющих на пользователя проблем с производительностью в основном потоке. Основной и рабочий потоки взаимодействуют друг с другом посредством событий сообщений.
Дополнительные сведения о веб-воркерах см. в разделах API веб-воркеров и Использование веб-воркеров .
Основным модулем примера приложения является index.js
. Скрипт index.js
создает веб-воркера , который запускает модуль worker.js
:
const worker =
new Worker(new URL('./worker.js', import.meta.url), {type: 'module'});
index.js
в основном состоит из одной функции runAdditionRNNDemo
, которая обрабатывает отправку формы, обрабатывает данные формы, передает данные формы рабочему процессу, ждет, пока рабочий процесс обучит модель и вернет результаты, а затем отображает результаты на странице. .
Чтобы отправить данные формы работнику, скрипт вызывает postMessage
у работника:
worker.postMessage({
digits,
trainingSize,
rnnType,
layers,
hiddenSize,
trainIterations,
batchSize,
numTestExamples
});
Рабочий прослушивает это сообщение и передает данные формы функциям, которые подготавливают данные и начинают обучение:
self.addEventListener('message', async (e) => {
const { digits, trainingSize, rnnType, layers, hiddenSize, trainIterations, batchSize, numTestExamples } = e.data;
const demo = new AdditionRNNDemo(digits, trainingSize, rnnType, layers, hiddenSize);
await demo.train(trainIterations, batchSize, numTestExamples);
})
Во время обучения исполнитель может отправлять сообщения двух разных типов, в одном из которых для isPredict
установлено значение true
self.postMessage({
isPredict: true,
i, iterations, modelFitTime,
lossValues, accuracyValues,
});
а другой с isPredict
установленным в false
.
self.postMessage({
isPredict: false,
isCorrect, examples
});
Когда поток пользовательского интерфейса ( index.js
) обрабатывает события сообщения, он проверяет флаг isPredict
, чтобы определить форму данных, возвращаемых от работника. Если isPredict
имеет значение true, данные должны представлять собой прогноз, а сценарий обновляет страницу с помощью tfjs-vis
. Если isPredict
имеет значение false, сценарий запускает блок кода , предполагающий, что данные представляют собой примеры. Он оборачивает данные в HTML и вставляет HTML на страницу.
Что дальше
В этом руководстве представлен пример использования веб-работника, позволяющего избежать блокировки потока пользовательского интерфейса в ходе длительного процесса обучения. Дополнительные сведения о преимуществах выполнения дорогостоящих вычислений в фоновом потоке см. в разделе Использование веб-работников для запуска JavaScript вне основного потока браузера .
Дополнительные сведения об обучении модели TensorFlow.js см. в разделе Модели обучения .