Фронтенд также может машинное обучение (ноль): основные концепции TensorFlow.js

машинное обучение TensorFlow внешний интерфейс JavaScript
Шок! ! Да здравствует! ! Внешний интерфейс также может писать машинное обучение! ! Первый JS во вселенной молчит за считанные секунды! ! !
Как "фронт-энд не полный", см. всем известную алхимическую печьTensorFlow Когда вышла JS-версия, мое сердце было очень холодным.Ха-ха-ха, школьные алхимики обычно смотрят на нас свысока за то, что мы рисуем страницы. Сегодня я покажу вам, как наш интерфейс также занимается машинным обучением! ! !

Ну, на самом деле, у меня просто немного больше внутренней драмы (орз. Так как TensorFlow.js вышел не так давно, китайских материалов в интернете относительно мало, поэтому я собираюсь поставитьTensorFlow.jsСтатьи на официальном сайте переведены и оформлены для читателей.

Этот перевод является первой статьей в учебнике, оригинальный адрес:

TensorFlow.js​js.tensorflow.org图标

Введение

TensorFlow.js — это библиотека машинного обучения, использующая для ускорения WebGL, основанная на браузере и предоставляющая высокоуровневый интерфейс JavaScript API. Он предоставляет высокопроизводительные стандартные блоки машинного обучения, позволяя обучать нейронные сети в браузере или запускать предварительно обученные модели в режиме логического вывода. Руководство по установке/настройке TensorFlow.js см.Руководство по началу работы.


Тензоры

Основное представление данных в TensorFlow.js:Тензор: одномерный или многомерный массив, образованный набором значений. каждыйTensorЭкземпляры имеютshapeАтрибуты используются для определения размерной формы массива, то есть массив имеет несколько измерений, и каждое измерение имеет несколько значений. вtensorГлавный конструктор этоtf.tensor:

// 2x3 张量
const shape = [2, 3]; // 2 行, 3 列
const a = tf.tensor([1.0, 2.0, 3.0, 10.0, 20.0, 30.0], shape);
a.print(); // 输出张量的值
// 输出: [[1 , 2 , 3 ],
//       [10, 20, 30]]

// 张量的维度形状是可以被推测的:
const b = tf.tensor([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]);
b.print();
// 输出: [[1 , 2 , 3 ],
//       [10, 20, 30]] 

Однако, если необходимо построить только низкоразмерные тензоры, мы рекомендуем использовать следующие функции вместоtf.tensorЧтобы улучшить читаемость кода:tf.scalar,tf.tensor1d,tf.tensor2d,tf.tensor3dиtf.tensor4d.

В следующем примере используетсяtf.tensor2dчтобы создать тот же тензор, что и в примере выше:

const c = tf.tensor2d([[1.0, 2.0, 3.0], [10.0, 20.0, 30.0]]);
c.print();
// 输出: [[1 , 2 , 3 ],
//       [10, 20, 30]]

TensorFlow.js также предоставляет некоторые конструкторы тензоров с функциями инициализации, такими как создание всех значений 0tf.zerosили 1tf.ones:

// 所有值均为 0 的 3x5 张量
const zeros = tf.zeros([3, 5]);
// 输出: [[0, 0, 0, 0, 0],
//       [0, 0, 0, 0, 0],
//       [0, 0, 0, 0, 0]]

В TensorFlow.js тензоры неизменяемы. После того, как они созданы, вы не можете изменять их значения, однако вы можете создавать новые тензоры, выполняя над ними операции.


Переменные

Variablesинициализируется значением тензора. Однако, в отличие от тензоров, их значения изменяемы. ты можешь использовать этоassignметод присваивает новый тензор существующей переменной:

const initialValues = tf.zeros([5]);
const biases = tf.variable(initialValues); // 初始化 biases
biases.print(); // 输出: [0, 0, 0, 0, 0]

const updatedValues = tf.tensor1d([0, 1, 0, 1, 0]);
biases.assign(updatedValues); // 更新 biases 的值
biases.print(); // 输出: [0, 1, 0, 1, 0]

Переменные в основном используются для хранения и обновления значений во время обучения модели.


Операции

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

Доступно множество операций, включая унарные операции, такие какsquare:

const d = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]);
const d_squared = d.square();
d_squared.print();
// 输出: [[1, 4 ],
//       [9, 16]]

Существуют также бинарные операции, такие какadd,subиmul:

const e = tf.tensor2d([[1.0, 2.0], [3.0, 4.0]]);
const f = tf.tensor2d([[5.0, 6.0], [7.0, 8.0]]);

const e_plus_f = e.add(f);
e_plus_f.print();
// 输出: [[6 , 8 ],
//       [10, 12]]

API TensorFlow.js поддерживает цепочку, поэтому вы можете продолжать вызывать операции для результата операций:

const sq_sum = e.add(f).square();
sq_sum.print();
// 输出: [[36 , 64 ],
//       [100, 144]]

// 所有的操作符在主命名空间中都是公开的,
// 所以你可以像?这么做:
const sq_sum = tf.square(tf.add(e, f));

Модели и слои

Концептуально модель — это функция, которая при заданных входных данных выдает некоторый желаемый результат. В TensorFlow.js есть два способа создания моделей. Вы можете использовать операции непосредственно для представления работы, проделанной моделью. Например:

// 定义常量: y = 2x^2 + 4x + 8
const a = tf.scalar(2);
const b = tf.scalar(4);
const c = tf.scalar(8);

// 定义函数
function predict(input) {
  // y = a * x ^ 2 + b * x + c
  // 下一节中会有更多关于 tf.tidy 的内容
  return tf.tidy(() => {
    const x = tf.scalar(input);

    const ax2 = a.mul(x.square());
    const bx = b.mul(x);
    const y = ax2.add(bx).add(c);

    return y;
  });
}

// 预测当输入值为2时的输出
const result = predict(2);
result.print() // 输出: 24

Вы также можете использовать более высокий API абстракцииtf.modelдля построения многослойных моделей, довольно популярной абстракции в глубоком обучении. Следующий код создаетtf.sequentialМодель:

const model = tf.sequential();
model.add(
  tf.layers.simpleRNN({
    units: 20,
    recurrentInitializer: 'GlorotNormal',
    inputShape: [80, 4]
  })
);

const optimizer = tf.train.sgd(LEARNING_RATE);
model.compile({optimizer, loss: 'categoricalCrossentropy'});
model.fit({x: data, y: labels)});

В TensorFlow.js есть много разных типов слоев, таких какtf.layers.simpleRNN,tf.layers.gruиtf.layers.lstmЖдать.


Управление памятью: dispose и tf.tidy

Поскольку TensorFlow.js использует GPU для ускорения математических операций, при работе с тензорами и переменными необходимо управлять памятью GPU.

TensorFlow.js предоставляет две функции, которые помогают решить эту проблему:disposeиtf.tidy.

dispose

вы можете вызывать тензоры или переменныеdisposeЧтобы очистить занятую память графического процессора:

const x = tf.tensor2d([[0.0, 2.0], [4.0, 6.0]]);
const x_squared = x.square();

x.dispose();
x_squared.dispose();

tf.tidy

Выполнив множество тензорных операций, вызовите одну за другойdisposeМожет быть громоздко. Поэтому TensorFlow.js предоставляет еще одну функциюtf.tidy, что несколько похоже на «области» в JavaScript, но для «тензоров, поддерживаемых графическим процессором».tf.tidyПосле выполнения все промежуточные тензоры очищаются, а их память GPU освобождается. Но это не очищает возвращаемое значение внутренней функции.

// tf.tidy takes a function to tidy up after
const average = tf.tidy(() => {
  // tf.tidy 将会清除此函数内由张量使用的所有GPU内存
  // 但是不会清除作为返回值的那个张量
  //
  // 即使在像下面这样这么短的操作中,
  // TensorFlow.js 也会创建一些中间张量。 因此,
  // 将您的数学运算放在一个 tf.tidy 中是一个很不错的选择!
  const y = tf.tensor1d([1.0, 2.0, 3.0, 4.0]);
  const z = tf.ones([4]);

  return y.sub(z).square().mean();
});

average.print() // 输出: 3.5

добросовестное использованиеtf.tidyПоможет смягчить утечку памяти в приложении, а также поможет контролировать, когда память освобождается.

Два важных совета

  • Перейти кtf.tidyФункция должна быть синхронной и не должна возвращать обещание. Мы рекомендуем размещать асинхронный код, такой как обновление пользовательского интерфейса или сетевых запросов, вtf.tidyвне функции.
  • tf.tidyПеременные не очищаются. Переменные обычно живут в течение всего срока службы модели машинного обучения, поэтому TensorFlow.js не очистит их, даже если они были созданы вtf.tidyсреди. Однако вы можете вручную вызватьdisposeочистить их.