Обучите модель с помощью веб-воркера

В этом руководстве вы изучите пример веб-приложения, которое использует веб-работника для обучения рекуррентной нейронной сети (RNN) сложению целых чисел. В примере приложения явно не определен оператор сложения. Вместо этого он обучает RNN, используя примеры сумм.

Конечно, это не самый эффективный способ сложения двух целых чисел! Но в руководстве демонстрируется важная техника веб-ML: как выполнять длительные вычисления без блокировки основного потока, который обрабатывает логику пользовательского интерфейса.

Пример приложения для этого руководства доступен в Интернете , поэтому вам не нужно загружать какой-либо код или настраивать среду разработки. Если вы хотите запустить код локально, выполните дополнительные действия, описанные в разделе «Выполнение примера локально» . Если вы не хотите настраивать среду разработки, вы можете перейти к разделу «Изучите пример» .

Код примера доступен на GitHub .

(Необязательно) Запустите пример локально.

Предварительные условия

Чтобы запустить пример приложения локально, в вашей среде разработки необходимо установить следующее:

Установите и запустите пример приложения

  1. Клонируйте или загрузите репозиторий tfjs-examples .
  2. Перейдите в каталог addition-rnn-webworker :

    cd tfjs-examples/addition-rnn-webworker
    
  3. Установите зависимости:

    yarn
    
  4. Запустите сервер разработки:

    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 см. в разделе Модели обучения .