Понимание размерности ввода-вывода в свёрточной нейронной сети | Keras

Просто о размерности данных ввода - вывода в сверточной нейросети.

Короткая заметка от Шива Верма, очень полезная для начинающих работать в области компьютерного зрения.

4 минуты чтения

Даже если мы понимаем, как работает нейронная сверточная сеть (CNN), многие путаются с размерностью данных ввода и вывода. Это руководство поможет вам в этом разобраться.


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

Размерность ввода

Вы всегда должны предоставлять массив 4D в качестве входных данных для CNN. Таким образом, входные данные имеют форму (размер пакета , высота, ширина, глубина) , где первое измерение представляет размер пакета изображения, а другие три измерения представляют размеры изображения – высоту, ширину и глубину. Для некоторых из вас, кто задается вопросом, какова глубина изображения, это не что иное, как количество цветовых каналов. Например, изображение RGB будет иметь глубину 3, а изображение в градациях серого будет иметь глубину 1.

Размерность выхода

Выход CNN также является массивом 4D. Если размер пакета будет таким же, как и размер входной партии, но остальные 3 размера изображения могут измениться в зависимости от значений фильтра, размера ядра и заполнения, которые мы используем.


Давайте рассмотрим следующий фрагмент кода.

Не обманывайте себя аргументом input_shape здесь. Хотя это выглядит так, как будто входная размерность 3D, но вы должны передать 4D массив во время подготовки данных размерностью (размер пакета, 10, 10, 3) . Поскольку в аргументе input_shape нет значения размера пакета, мы можем использовать любой размер пакета при подготовке данных.

Как видно, выходная размерность (None, 10, 10, 64) . Первое измерение представляет размер пакета, который на данный момент равен None, поскольку сеть не знает размер пакета заранее. После того, как вы укажете данные, None будет заменен размером пакета, который вы определили при подборе данных.


Давайте рассмотрим другой фрагмент кода.

Здесь я заменил input_shape на batch_input_shape. Как видно из названия, в этом случае размер пакета определен заранее, и вы не сможете использовать какой-либо другой размер пакета во время подготовки данных. То есть, вы должны подать на вход сети пакет данных из 16 изображений.

Теперь вы можете видеть, что выходная форма также имеет размер пакета 16 вместо None .


Добавление слоя Dense к слою Convolution

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

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

Мы можем сделать это, вставив слой Flatten после слоя Convolution. Выровнять слой, преобразовав три измерения изображения до одного измерения. Теперь у нас есть 2D массив размерности (размер пакета, выровненный резмер), которая является приемлемой для Dense слоев.


Резюме

  • Вы всегда должны подавать 4D массив размерности (размер пакета , высота, ширина, глубина) на вход CNN .
  • Выходные данные из CNN также являются массивом 4D формы (размер пакета , высота, ширина, глубина).
  • Чтобы добавить Dense слой после слоя Convolution , мы должны изменить вывод 4D на 2D, используя слой Keras Flatten .
Поделиться...
Поделиться в facebook
Поделиться в twitter
Поделиться в vk