Шок! ! Да здравствует! ! Внешний интерфейс также может писать машинное обучение! ! Первый JS во вселенной молчит за считанные секунды! ! !
Как "фронт-энд не полный", см. всем известную алхимическую печьTensorFlow Когда вышла JS-версия, мое сердце было очень холодным.Ха-ха-ха, школьные алхимики обычно смотрят на нас свысока за то, что мы рисуем страницы. Сегодня я покажу вам, как наш интерфейс также занимается машинным обучением! ! !
Ну, на самом деле, у меня просто немного больше внутренней драмы (орз. Так как TensorFlow.js вышел не так давно, китайских материалов в интернете относительно мало, поэтому я собираюсь поставитьTensorFlow.jsСтатьи на официальном сайте переведены и оформлены для читателей.
Этот перевод является первой статьей в учебнике, оригинальный адрес:
TensorFlow.jsjs.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
очистить их.