TensorFlow.js предоставляет возможность работы с
переменными через объект tf.Variable. Переменные
используются для хранения параметров моделей, которые изменяются в
процессе обучения. В отличие от тензоров tf.Tensor, которые
неизменяемы, tf.Variable допускает изменение значений без
необходимости пересоздавать объект.
Переменная создается на основе тензора:
const tf = require('@tensorflow/tfjs');
// Создание тензора
const initial = tf.tensor([1, 2, 3, 4]);
// Создание переменной на основе тензора
const v = tf.variable(initial);
Ключевые моменты:
tf.variable(initialTensor, trainable=true, name=null)
initialTensor — исходный тензор, на основе которого
создается переменная.trainable — логическое значение, определяющее, будут ли
веса обновляться в процессе оптимизации. По умолчанию
true.name — необязательное имя переменной для идентификации
в графе модели.Переменная наследует форму и тип исходного тензора:
console.log(v.shape); // [4]
console.log(v.dtype); // 'float32'
Изменение значений переменной осуществляется через метод
.assign():
v.assign(tf.tensor([5, 6, 7, 8]));
console.log(v.dataSync()); // [5, 6, 7, 8]
Особенности метода assign:
TensorFlow.js поддерживает математические операции напрямую с
переменной, но результат таких операций возвращается в виде нового
тензора, а не переменной. Для сохранения результата в исходной
переменной требуется .assign():
const increment = tf.scalar(1);
v.assign(v.add(increment));
console.log(v.dataSync()); // [6, 7, 8, 9]
Другие распространенные операции:
v.sub(tensor) — вычитаниеv.mul(tensor) — умножениеv.div(tensor) — делениеv.square() — возведение в квадратv.neg() — инверсия знакаКаждую из этих операций можно использовать в цикле обучения, чтобы корректировать веса модели.
Оптимизаторы TensorFlow.js работают с переменными, автоматически обновляя их значения на основе градиентов:
const learningRate = 0.1;
const optimizer = tf.train.sgd(learningRate);
const w = tf.variable(tf.scalar(0.5));
function loss() {
return w.square().sub(tf.scalar(1)).square();
}
for (let i = 0; i < 10; i++) {
optimizer.minimize(loss);
}
console.log(w.dataSync()); // значение стремится к 1
Принцип работы:
optimizer.minimize(fn) вычисляет градиенты функции
fn относительно переменных, участвующих в вычислениях.trainable: true,
автоматически обновляются.tf.tidy() для управления памятью и assign для
ручного изменения значений.Иногда необходимо получить неизменяемый тензор из переменной:
const tensorFromVar = v.tensor;
console.log(tensorFromVar instanceof tf.Tensor); // true
Методы v.data() или v.dataSync() позволяют
получить значения в виде массива:
v.data().then(data => console.log(data)); // [6, 7, 8, 9]
tf.Variable поддерживает тензоры любой размерности:
const matrix = tf.tensor([[1, 2], [3, 4]]);
const mVar = tf.variable(matrix);
// Изменение значений
mVar.assign(tf.tensor([[5, 6], [7, 8]]));
Форма и тип должны совпадать, иначе будет выброшена ошибка:
// Ошибка: форма не совпадает
// mVar.assign(tf.tensor([1, 2, 3]));
tf.Variable — изменяемый тензор для хранения
параметров.tf.variable(initialTensor).assign().assign.Хотите, я могу сделать отдельный раздел с эффективными стратегиями обновления переменных и управлением памятью в больших моделях TensorFlow.js? Это будет логическое продолжение и крайне полезно для учебника.