Предобработка: масштабирование, нормализация, изменение размера

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


Масштабирование данных

Масштабирование необходимо для приведения числовых данных к диапазону, удобному для работы нейронной сети. Без масштабирования значения признаков могут сильно различаться по порядку величины, что замедляет обучение и ухудшает сходимость.

Пример масштабирования числовых массивов:

import * as tf from '@tensorflow/tfjs';

const data = tf.tensor([10, 20, 30, 40, 50]);

// Масштабирование к диапазону [0, 1]
const scaledData = data.div(tf.max(data));
scaledData.print(); // [0, 0.25, 0.5, 0.75, 1]

Ключевые моменты масштабирования:

  • Масштабирование к диапазону [0,1] часто используется для входов нейронных сетей.
  • Для некоторых задач может быть полезно масштабирование к диапазону [-1,1], особенно при использовании активаций tanh.
  • Масштабирование помогает избежать численной нестабильности при больших значениях данных.

Нормализация данных

Нормализация данных подразумевает приведение признаков к единому масштабу на основе статистических характеристик: среднего значения и стандартного отклонения. В отличие от простого масштабирования, нормализация учитывает распределение данных.

Пример нормализации массива:

const data = tf.tensor([10, 20, 30, 40, 50]);

const mean = data.mean();
const std = data.sub(mean).square().mean().sqrt();

const normalizedData = data.sub(mean).div(std);
normalizedData.print();

Особенности нормализации:

  • Преобразует данные к распределению с нулевым средним и единичным стандартным отклонением.
  • Эффективно при работе с градиентными методами оптимизации, поскольку ускоряет сходимость.
  • Особенно полезна для глубинных сетей с множеством слоев.

Изменение размера изображений

Многие модели требуют входные изображения фиксированного размера. TensorFlow.js позволяет масштабировать изображения без потери структуры с помощью методов tf.image.resizeBilinear и tf.image.resizeNearestNeighbor.

Пример изменения размера изображения:

const image = tf.browser.fromPixels(document.getElementById('myImage'));

// Изменение размера до 128x128 пикселей
const resizedImage = tf.image.resizeBilinear(image, [128, 128]);
resizedImage.print();

Особенности изменения размера:

  • resizeBilinear сглаживает изображение, обеспечивая более естественный результат.
  • resizeNearestNeighbor используется для категориальных изображений, где важно сохранить исходные цвета без сглаживания.
  • После изменения размера часто применяется нормализация к диапазону [0,1] для подачи изображения в нейронную сеть.

Комбинация методов предобработки

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

  1. Извлечение изображения или числовых данных.
  2. Изменение размера (для изображений) или приведение к единой размерности.
  3. Масштабирование или нормализация.
  4. Формирование батчей для подачи в модель.

Пример полного предобработочного пайплайна для изображений:

const image = tf.browser.fromPixels(document.getElementById('myImage'))
    .resizeBilinear([128, 128])       // изменение размера
    .div(255.0)                        // масштабирование к [0,1]
    .expandDims();                     // добавление измерения батча

Ключевые аспекты такого подхода:

  • Добавление измерения батча обязательно для подачи данных в модели TensorFlow.js, так как сеть ожидает тензор формы [batch, height, width, channels].
  • Масштабирование после изменения размера предотвращает переполнение и ускоряет обучение.
  • Такой пайплайн может быть применен к потоковым данным, что важно для веб-приложений в реальном времени.

Заключение по методам предобработки

  • Масштабирование — простое приведение данных к удобному диапазону.
  • Нормализация — выравнивает распределение данных, улучшает обучение.
  • Изменение размера — необходимо для стандартизации входов моделей.

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