С помощью TensorFlow.js вы можете не только запускать в браузере модели с машинным обучением для выполнения логического вывода, но и обучать их. В этом супер-простом руководстве я покажу вам базовый пример «Hello World», который научит вас строительным конструкциям, которые помогут вам начать работу.

Начнем с простейшей веб-страницы, которую только можно представить:

<html>
<head></head>
<body></body>
</html>

Когда у вас есть это, первое, что вам нужно сделать, это добавить ссылку на TensorFlow.js, чтобы вы могли использовать API TensorFlow. Для вашего удобства файл JS доступен на CDN:

<html>
<head>
 <!-- Load TensorFlow.js -->
 <!-- Get latest version at https://github.com/tensorflow/tfjs -->
 <script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]"> </script>

Сейчас я использую версию 0.11.2, но не забудьте проверить последнюю версию на GitHub.

Теперь, когда TensorFlow.js загружен, давайте займемся с ним кое-чем интересным.

Рассмотрим прямую по формуле Y = 2X-1. Это даст вам набор таких точек, как (-1, -3), (0, -1), (1, 1), (2, 3), (3, 5) и (4, 7). Хотя мы знаем, что формула дает нам значение Y для данного X, это хорошее упражнение по обучению модели для компьютера, которая явно не запрограммирована с помощью этой формулы, чтобы увидеть, может ли он вывести значения Y для заданных значений X при обучении на этих данных.

Так как это будет работать?

Что ж, во-первых, мы можем создать суперпростую нейронную сеть для вывода. Поскольку есть только 1 входное значение и 1 выходное значение, это может быть один узел. Затем в JavaScript я могу создать tf.sequential и добавить к нему определение своего слоя. Ничего более простого, чем это:

const model = tf.sequential();
model.add(tf.layers.dense({units: 1, inputShape: [1]}));

Чтобы закончить определение моей модели, я компилирую ее, указывая свой тип потерь и оптимизатор. Я выберу самый простой тип потерь - meanSquaredError, и моим оптимизатором будет стандартный стохастический градиентный спуск (также известный как «sgd»):

model.compile({
   loss: 'meanSquaredError',
   optimizer: 'sgd'
  });

Чтобы обучить модель, мне понадобится тензор с моими входными (т.е. 'X') значениями, а другой - с моими выходными (т. Е. 'Y') значения. С помощью TensorFlow мне также нужно определить форму данного тензора:

const xs = tf.tensor2d([-1, 0, 1, 2, 3, 4], [6, 1]);
const ys = tf.tensor2d([-3, -1, 1, 3, 5, 7], [6, 1]);

Итак, мои X - это значения -1,0,1,2,3 и 4, определенные как тензор 6x1. Мои Y -3, -1, 1, 3, 5, 7 в той же форме. Обратите внимание, что n-я запись Y - это значение для n-й записи X, когда мы говорим, что Y = 2X-1.

Для обучения модели мы используем метод fit. Сюда мы передаем набор значений X и Y, а также количество эпох (циклическое прохождение данных), в которых мы будем тренировать его. Обратите внимание, что это асинхронно, поэтому мы должны дождаться возвращаемого значения, прежде чем продолжить, поэтому весь этот код должен быть в функции async (подробнее об этом позже):

await model.fit(xs, ys, {epochs: 500});

Как только это будет сделано, модель будет обучена, так что мы можем предсказать значение для нового X. Так, например, если мы хотим вычислить Y для X = 10 и записать его на странице в ‹div›, код будет выглядеть так:

document.getElementById('output_field').innerText =
   model.predict(tf.tensor2d([10], [1, 1]));

Обратите внимание, что входные данные - это тензор, где мы указываем, что это тензор 1x1, содержащий значение 10.

Результат записывается на странице в div и должен выглядеть примерно так:

Подождите, вы можете спросить - а почему не 19? Довольно близко, но уже не 19! Это потому, что алгоритму никогда не давали формулу - он просто учится на основе предоставленных данных. С более релевантными данными любая модель машинного обучения даст большую точность, но эта неплохая, учитывая, что у нее было всего 6 фрагментов данных, на которых можно было учиться!

Для вашего удобства вот весь код страницы, включая объявление всего этого кода в виде асинхронной функции под названием «learnLinear»:

<html>
 <head>
 <!-- Load TensorFlow.js -->
 <!-- Get latest version at https://github.com/tensorflow/tfjs -->
 <script src="https://cdn.jsdelivr.net/npm/@tensorflow/[email protected]">   
 </script>
 </head>
 <body>
   <div id="output_field"></div>
 </body>
 <script>
 async function learnLinear(){
  const model = tf.sequential();
  model.add(tf.layers.dense({units: 1, inputShape: [1]}));
  model.compile({
   loss: 'meanSquaredError',
   optimizer: 'sgd'
  });
  
  const xs = tf.tensor2d([-1, 0, 1, 2, 3, 4], [6, 1]);
  const ys = tf.tensor2d([-3, -1, 1, 3, 5, 7], [6, 1]);
  
  await model.fit(xs, ys, {epochs: 500});
  
  document.getElementById('output_field').innerText =
   model.predict(tf.tensor2d([10], [1, 1]));
 }
 learnLinear();
 </script>
<html>

И это все, что нужно для создания очень простой модели машинного обучения с помощью TensorFlow.js, которая выполняется в вашем браузере. Отсюда у вас есть основа для продвижения вперед с более продвинутыми концепциями.

Удачи!