Входные слои: tf.input

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

Создание входного слоя

В TensorFlow.js входной слой создаётся с помощью функции tf.input(config). Аргумент config представляет собой объект с ключевыми параметрами:

  • shape — массив, задающий размерность входных данных, исключая размер пакета (batch size). Например, для изображений размером 28×28 пикселей в градациях серого это будет [28, 28, 1].
  • dtype — тип данных входного тензора ('float32', 'int32' и т.д.). По умолчанию 'float32'.
  • name — необязательное имя слоя. Используется для удобства отладки и сохранения модели.
  • sparse — логическое значение, указывающее, будет ли вход разреженным. По умолчанию false.

Пример создания входного слоя для изображений:

const input = tf.input({shape: [28, 28, 1], name: 'input_image'});

Здесь создаётся тензор с формой [null, 28, 28, 1], где null соответствует размеру пакета данных, который может изменяться при обучении или инференсе.

Свойства объекта InputLayer

Объект, возвращаемый функцией tf.input, является экземпляром InputLayer и имеет следующие ключевые свойства:

  • shape — форма входного тензора без учета пакета.
  • batchShape — форма входного тензора с размером пакета.
  • dtype — тип данных.
  • name — имя слоя.
  • trainable — всегда false, так как входной слой не содержит обучаемых параметров.

Взаимодействие с другими слоями

Входной слой не выполняет никаких вычислений. Его основная задача — определить форму данных и передать их следующему слою. Для соединения с другими слоями используется метод вызова слоя как функции:

const dense = tf.layers.dense({units: 64, activation: 'relu'});
const output = dense.apply(input);

Здесь dense.apply(input) создаёт новый тензор, который будет выходом плотного слоя с 64 нейронами и активацией ReLU, используя входной слой input.

Использование нескольких входов

TensorFlow.js поддерживает модели с несколькими входными слоями. Для этого создаются несколько объектов tf.input:

const inputA = tf.input({shape: [32], name: 'input_a'});
const inputB = tf.input({shape: [16], name: 'input_b'});

Далее эти входы могут передаваться в разные ветви сети и объединяться на промежуточных слоях, например, через tf.layers.concatenate():

const merged = tf.layers.concatenate().apply([inputA, inputB]);
const output = tf.layers.dense({units: 1, activation: 'sigmoid'}).apply(merged);

Прямое использование в tf.model

Для создания модели входной слой используется как обязательный аргумент при определении модели:

const model = tf.model({inputs: input, outputs: output});

Если несколько входов:

const model = tf.model({inputs: [inputA, inputB], outputs: output});

Совместимость с различными типами данных

Входные слои способны принимать данные в виде:

  • tf.Tensor — тензор TensorFlow.js.
  • TypedArray — массив чисел, автоматически преобразуемый в тензор.
  • Array — стандартный JavaScript массив, который конвертируется в тензор через tf.tensor().

Важно, чтобы форма подаваемых данных соответствовала форме, указанной в shape входного слоя, иначе будет сгенерирована ошибка.

Применение batchInputShape

Вместо обычного shape можно использовать batchInputShape, чтобы явно задать размер пакета:

const input = tf.input({batchInputShape: [32, 28, 28, 1], name: 'fixed_batch_input'});

В этом случае модель ожидает пакеты фиксированного размера 32. Это полезно для сценариев, где размер пакета должен быть постоянным, например, при некоторых типах рекуррентных слоёв.

Основные рекомендации

  • Всегда задавать корректную форму входных данных, чтобы избежать ошибок на этапе обучения.
  • Для моделей с несколькими входами давать каждому слою уникальное имя для удобства отладки.
  • Использовать tf.input как отправную точку построения модели; любые операции, выполняемые с этим слоем, не изменяют данные, а лишь создают граф вычислений.

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