Нормализация входных данных — ключевой этап подготовки изображений для нейронных сетей. Она обеспечивает:
В TensorFlow.js изображения обычно представлены как тензоры с типом
данных tf.Tensor. Пиксели могут быть в диапазоне
[0, 255] для формата Uint8Array или
[0, 1] для нормализованных данных с плавающей точкой
(float32).
Наиболее распространённая техника — деление каждого значения пикселя на 255:
const tf = require('@tensorflow/tfjs');
// Загрузка изображения
const img = tf.browser.fromPixels(document.getElementById('image'));
// Приведение к диапазону [0,1]
const normalized = img.toFloat().div(tf.scalar(255));
toFloat() конвертирует данные из int в
float32.div(tf.scalar(255)) делит каждый элемент тензора на
255.Это важно для активаций типа sigmoid или
relu, где большие значения пикселей могут вызывать
нестабильность градиентов.
Для некоторых архитектур полезно не только масштабировать данные, но и центрировать их вокруг нуля. Стандартная формула:
[ x_{} = ]
где μ — среднее значение пикселя по всему датасету, а
σ — стандартное отклонение.
Пример реализации в TensorFlow.js:
const mean = tf.scalar(0.5);
const std = tf.scalar(0.5);
const standardized = normalized.sub(mean).div(std);
Если данные изначально в диапазоне [0,1], вычитание 0.5
и деление на 0.5 приводит значения к диапазону [-1, 1].
Такой диапазон удобен для свёрточных сетей, особенно при использовании
функций активации tanh.
Когда изображения подаются в модель пакетами, важно, чтобы
нормализация применялась пакетно, чтобы каждый батч
имел одинаковую шкалу. Например, при обучении можно использовать
tf.batchNorm или слои BatchNormalization в
модели:
const model = tf.sequential();
model.add(tf.layers.conv2d({
inputShape: [128, 128, 3],
filters: 32,
kernelSize: 3,
activation: 'relu'
}));
model.add(tf.layers.batchNormalization());
BatchNormalization корректирует активации на каждом
слое, снижая влияние различий в диапазонах входных данных.Часто нормализация используется совместно с аугментацией изображений — поворотами, отражениями, изменением яркости. Важно применять нормализацию после аугментации, чтобы пиксели оставались в ожидаемом диапазоне:
const augmented = tf.image.flipLeftRight(normalized);
Если нормализация проведена до аугментации, операции изменения
яркости или контраста могут привести к выходу за пределы
[0,1] или [-1,1], что негативно сказывается на
обучении.
Многие предобученные модели, например MobileNet или
ResNet, требуют конкретной нормализации:
[-1, 1]Для TensorFlow.js предобученные модели обычно предоставляют функцию
preprocessInput:
import * as mobilenet from '@tensorflow-models/mobilenet';
const imgTensor = tf.browser.fromPixels(imageElement);
const processed = mobilenet.preprocessInput(imgTensor);
Эта функция автоматически приводит изображение к правильному диапазону, упрощая интеграцию с моделью.
Эффективная нормализация является фундаментом работы с изображениями в TensorFlow.js и напрямую влияет на точность и стабильность обучения нейросетей.