В нейронных сетях часто возникает необходимость преобразовывать форму данных между различными слоями. Два ключевых слоя для изменения структуры тензоров в TensorFlow.js — это Flatten и Reshape. Они позволяют адаптировать многомерные данные для подачи в полносвязные (Dense) слои или изменять форму тензора без изменения его содержимого.
Слой Flatten преобразует многомерный тензор в
одномерный. Это особенно важно при переходе от сверточных слоев (Conv2D)
к полносвязным слоям, где требуется одномерный вектор.
Синтаксис:
const flattenLayer = tf.layers.flatten({
inputShape: [height, width, channels]
});
Параметры:
inputShape — массив чисел, задающий форму входных
данных без учета размера батча. Например, [28, 28, 1] для
изображений 28×28 с одним каналом.Пример использования:
const model = tf.sequential();
model.add(tf.layers.conv2d({
inputShape: [28, 28, 1],
filters: 32,
kernelSize: 3,
activation: 'relu'
}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({ units: 128, activation: 'relu' }));
model.add(tf.layers.dense({ units: 10, activation: 'softmax' }));
В данном примере Flatten преобразует тензор размерности
[batch, 26, 26, 32] в [batch, 26*26*32] для
подачи в Dense слой.
Ключевые моменты работы Flatten:
Слой Reshape предоставляет гибкий способ изменения формы
тензора на заданную, при этом количество элементов должно оставаться
неизменным. Он более универсален, чем Flatten.
Синтаксис:
const reshapeLayer = tf.layers.reshape({ targetShape: [newShape] });
Параметры:
targetShape — массив чисел, задающий новую форму без
учета размера батча.targetShape можно использовать -1, чтобы
TensorFlow.js автоматически вычислил размер одной из осей.Пример использования:
const model = tf.sequential();
model.add(tf.layers.dense({ inputShape: [784], units: 128, activation: 'relu' }));
model.add(tf.layers.reshape({ targetShape: [16, 8] }));
В данном случае Dense слой возвращает тензор
[batch, 128]. Слой Reshape преобразует его в
[batch, 16, 8]. Использование -1 позволяет
автоматически вычислять размер одной из осей:
model.add(tf.layers.reshape({ targetShape: [16, -1] }));
Здесь TensorFlow.js подставит значение 8 автоматически,
так как 128 элементов делятся на 16.
Особенности Reshape:
Сверточные сети: После нескольких Conv2D и
MaxPooling слоев тензор обычно имеет форму
[batch, height, width, channels]. Перед Dense слоем
необходимо использовать Flatten:
model.add(tf.layers.flatten());
model.add(tf.layers.dense({ units: 64, activation: 'relu' }));Изменение размерности для RNN или LSTM: Иногда
требуется преобразовать одномерный входной вектор в форму
[timesteps, features]:
model.add(tf.layers.reshape({ targetShape: [10, 16] }));Подготовка данных для многоканальных входов: При объединении нескольких источников данных или при работе с графическими тензорами можно использовать Reshape для согласования форм.
| Характеристика | Flatten | Reshape |
|---|---|---|
| Цель | Преобразует любой многомерный тензор в одномерный | Преобразует тензор в любую указанную форму |
| Гибкость | Низкая | Высокая |
| Количество элементов | Не меняется | Не меняется, но форма может быть произвольной |
| Автоматический расчет оси | Нет | Можно использовать -1 для автоматического вычисления
размера оси |
Flatten — это частный случай Reshape, где цель всегда одномерный вектор. Reshape же позволяет создавать сложные многомерные формы, сохраняя все данные неизменными.
-1 при неизвестных
размерностях: это упрощает адаптацию модели к разным входным
данным.Flatten и Reshape являются фундаментальными инструментами для управления формой данных в TensorFlow.js, позволяя строить гибкие и эффективные нейронные сети.