Изменение формы: reshape, expandDims, squeeze

В работе с нейронными сетями часто возникает необходимость изменения формы тензоров. Библиотека Keras.js предоставляет инструменты для управления размерностями данных, аналогичные возможностям Keras в Python. Основные операции — reshape, expandDims и squeeze — позволяют корректно подготовить данные для передачи в слои сети и обработки внутри модели.


Метод reshape

Метод reshape позволяет изменить форму тензора без изменения его содержимого. Важно понимать, что операция не копирует данные, а создаёт новый тензор с той же памятью, но другой интерпретацией структуры.

Синтаксис:

const reshapedTensor = tensor.reshape([newShape]);
  • newShape — массив, определяющий новую форму тензора. Одно из значений может быть -1, что означает автоматическое вычисление этой размерности.

Пример использования:

const tensor = KerasJS.Tensor.ones([2, 3]);
const reshaped = tensor.reshape([3, 2]);
console.log(reshaped.shape); // [3, 2]

Особенности:

  • Размерность нового тензора должна совпадать с количеством элементов исходного тензора.
  • Если использовать -1, библиотека автоматически рассчитает соответствующую размерность, сохраняя количество элементов.
const tensor = KerasJS.Tensor.ones([2, 3, 4]);
const reshaped = tensor.reshape([-1, 4]); // [6, 4]

Метод expandDims

expandDims добавляет новую ось к существующему тензору. Эта операция необходима при работе с одномерными или двухмерными данными, когда слой сети ожидает вход с определённой размерностью.

Синтаксис:

const expandedTensor = tensor.expandDims(axis);
  • axis — индекс оси, где будет добавлена новая размерность.

Пример использования:

const tensor = KerasJS.Tensor.ones([5]);
const expanded = tensor.expandDims(0);
console.log(expanded.shape); // [1, 5]
  • Добавление новой оси позволяет корректно передавать одномерные данные в слои Conv2D или LSTM.

Особенности:

  • axis = 0 добавляет размерность в начало.
  • axis = -1 добавляет размерность в конец.
  • Полезно для добавления батч-измерения к отдельному вектору.

Метод squeeze

Squeeze выполняет обратную операцию к expandDims: удаляет оси размерности 1. Это важно для упрощения тензоров перед вычислениями или визуализацией.

Синтаксис:

const squeezedTensor = tensor.squeeze([axis]);
  • axis — необязательный параметр. Если не указан, будут удалены все оси с размерностью 1.
  • Можно указать конкретную ось для удаления.

Пример использования:

const tensor = KerasJS.Tensor.ones([1, 3, 1, 5]);
const squeezed = tensor.squeeze();
console.log(squeezed.shape); // [3, 5]
  • Удаление осей размерности 1 упрощает обработку данных в слоях, не меняя фактического содержимого.

Особенности:

  • Если указать ось, которая не равна 1, библиотека выбросит ошибку.
  • Позволяет корректно подготовить данные для функций, требующих определённой размерности без лишних измерений.

Совместное использование методов

Часто reshape, expandDims и squeeze используются в комбинации для подготовки данных. Например, при конвертации одномерного сигнала в формат, подходящий для 2D-свёртки:

const signal = KerasJS.Tensor.ones([128]);
const reshaped = signal.reshape([16, 8]); // [16, 8]
const expanded = reshaped.expandDims(0);  // [1, 16, 8]
const finalTensor = expanded.expandDims(-1); // [1, 16, 8, 1]
  • Сначала формируется матрица из сигнала.
  • Затем добавляется измерение для батча.
  • Наконец, добавляется канал для свёрточного слоя.

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


Практические рекомендации

  1. Всегда проверять совместимость формы входного тензора с ожидаемой формой слоя.
  2. Для динамических данных удобно использовать -1 в reshape, чтобы автоматически вычислять размерность.
  3. Использовать expandDims для добавления батч-измерения или каналов.
  4. Применять squeeze для очистки тензоров от лишних единичных измерений, чтобы избежать ошибок при передаче данных в слои или функции визуализации.
  5. Комбинация этих методов позволяет гибко преобразовывать данные без изменения их содержания, что повышает производительность и уменьшает вероятность ошибок.

Изменение формы тензоров — фундаментальный навык при работе с Keras.js, обеспечивающий корректное взаимодействие с различными слоями сети и подготовку данных для обучения и инференса. Понимание работы reshape, expandDims и squeeze позволяет уверенно управлять структурой данных, избегая ошибок и повышая читаемость кода.