Совместимость архитектур

ConvNetJS — это чисто клиентская библиотека на JavaScript для построения и обучения нейронных сетей, включая полносвязные сети (fully connected), свёрточные (convolutional) и рекуррентные (recurrent) архитектуры. Одной из ключевых особенностей является гибкость в построении сетей с различными слоями, однако важно понимать нюансы совместимости архитектур при их проектировании и обучении.


Типы слоев и их взаимодействие

Полносвязные (Dense) слои принимают входные векторы фиксированной размерности. Любой выходной слой предыдущего слоя должен быть преобразован в одномерный вектор. Если входной слой имеет трёхмерную форму (например, результат свёрточного слоя), необходимо использовать слой Flatten для конвертации данных.

Свёрточные (Convolutional) слои ожидают на вход трёхмерный тензор: ширина × высота × каналы. Они могут быть совместимы с другими свёрточными слоями или слоями подвыборки (pooling). Использование полносвязного слоя после свёрточных требует внимательного преобразования формы данных.

Слои подвыборки (Pooling) уменьшают пространственные размеры тензора и обычно применяются после свёрточных слоев. Их параметры (stride, filter size) должны быть согласованы с размерами входного тензора, чтобы избежать отрицательных или дробных размеров на выходе.

Слои активации (ReLU, Sigmoid, Tanh) не изменяют размерность данных, но влияют на совместимость через форматы данных: они должны следовать сразу после слоя, который производит выход в корректной форме.


Совместимость входных и выходных форм

Размерность тензоров является критическим аспектом совместимости. В ConvNetJS каждый слой хранит out_sx, out_sy, out_depth — параметры выходного тензора. Несовпадение этих параметров при последовательном подключении слоев приведёт к ошибкам.

Пример:

  • Свёрточный слой: вход 32×32×3, фильтр 5×5, stride 1 → выход 28×28×10.
  • Pooling 2×2 с stride 2 → выход 14×14×10.
  • Полносвязный слой требует 14×14×10 = 1960 входных нейронов.

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


Совместимость обучающих алгоритмов

ConvNetJS поддерживает несколько оптимизаторов: SGD, AdaGrad, RMSProp. Совместимость с архитектурой определяется типом слоя и используемой функцией потерь (loss).

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

  • Softmax слой совместим только с задачами классификации.
  • Regression слой подходит для предсказания непрерывных величин.
  • Использование рекуррентных слоев требует корректного задания длины временной последовательности (temporal length), иначе оптимизатор не сможет обновлять веса правильно.

Оптимизаторы RMSProp и AdaGrad автоматически корректируют скорость обучения для каждого параметра, но при неправильной архитектуре (например, неправильные формы входа) могут вызвать некорректное обновление весов.


Передача весов между архитектурами

ConvNetJS позволяет сохранять и загружать веса нейросети через объекты JSON. Для успешной передачи весов необходимо совпадение структуры слоев: количество нейронов, размер фильтров, stride и форма входа должны быть идентичны.

Важно:

  • При изменении количества фильтров в свёрточном слое веса предыдущей версии становятся несовместимыми.
  • Добавление или удаление слоев также делает старые веса непригодными для загрузки.
  • Совместимость с предобученными весами возможна только при полной идентичности архитектуры.

Взаимодействие с разными типами данных

ConvNetJS работает как с изображениями, так и с табличными данными. При проектировании архитектуры необходимо учитывать:

  • Изображения: вход width × height × channels; свёрточные слои обязательны для извлечения локальных признаков.
  • Векторные данные: полносвязные слои предпочтительны; свёрточные слои обычно не применяются, если данные одномерные.
  • Временные последовательности: рекуррентные слои требуют правильного формирования входного тензора с учётом длины временного окна.

Некорректное сочетание типа данных и слоя приводит к ошибкам совместимости на этапе вызова forward и backward.


Принципы проверки совместимости

  1. Проверка форм выходов каждого слоя (out_sx, out_sy, out_depth).
  2. Проверка соответствия типа последнего слоя задаче (классификация/регрессия).
  3. Проверка корректности параметров оптимизатора относительно выбранной архитектуры.
  4. Тестирование передачи весов между сетями через JSON перед использованием в новой архитектуре.
  5. Прогон через функцию forward с небольшим количеством данных для выявления проблем с размерностями.

Совместимость архитектур в ConvNetJS требует тщательного контроля всех параметров слоев и согласования их между собой. Нарушение этих правил приводит к логическим и вычислительным ошибкам, которые могут быть неочевидны на первый взгляд.