С помощью 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, которая выполняется в вашем браузере. Отсюда у вас есть основа для продвижения вперед с более продвинутыми концепциями.
Удачи!