Форма сглаженного слоя в CNN

Вопрос или проблема

Если у меня есть сверточный слой с размерностью (5,5,4), (т.е. 4 блока признаков размером 5x5x1), какой будет размер сглаженного слоя, если я применю сглаживание к сверточному слою?

Для простой свертки (игнорируя padding и шаг), размерность выхода свертки равна input_size – filter_size + 1. Таким образом, для одномерной свертки с размером фильтра 3 на входе размера 5, выход будет размером 3. Для двумерной свертки размером входа (5,5) и размером фильтра (3,3), размер выхода будет (3,3). Теперь, если вы добавите несколько фильтров, вы просто умножаете выход на количество фильтров, так что если у вас 4 фильтра, то размер выхода будет 4x3x3, так что сглаживание даст выход размера 36.
Для mnist в keras, это выглядело бы примерно так (учтите, что за conv слоем идет max pooling):

model = keras.Sequential(
[
    keras.Input(shape=input_shape),
    layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
    layers.MaxPooling2D(pool_size=(2, 2)),
    layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
    layers.MaxPooling2D(pool_size=(2, 2)),
    layers.Flatten(),
    layers.Dropout(0.5),
    layers.Dense(num_classes, activation="softmax"),
])
model.summary()

Модель: “sequential”

Слой (тип) Размерность Выхода Кол-во Параметров

conv2d (Conv2D) (None, 26, 26, 32) 320


max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0


conv2d_1 (Conv2D) (None, 11, 11, 64) 18496


max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0


flatten (Flatten) (None, 1600) 0


dropout (Dropout) (None, 1600) 0


dense (Dense) (None, 10) 16010

Всего параметров: 34,826
Обучаемых параметров: 34,826
Необучаемых параметров: 0

hth.

.

Ответ или решение

Теория

При построении сверточной нейронной сети (CNN) flattening (сглаживание) представляет собой процесс перехода от многомерного тензора, генерируемого сверточными и полносвязанными слоями, к одномерному вектору. Это необходимый шаг перед передачей данных полносвязанному слою, который используется для классификации или регрессии. Сглаживание объединяет все элементы многомерного тензора в один вектор, сохраняя порядок. Теоретически размер выходного слоя после "сглаживания" равен произведению всех его измерений.

Пример

У вас есть сверточный слой с размерностью (5, 5, 4), что обозначает 4 карты признаков, каждая из которых имеет размерность 5×5. При сглаживании, как указано в условии задачи, вы преобразуете весь тензор в одномерный вектор. Чтобы это сделать, необходимо все размеры карты умножить между собой:

[
5 (высота) \times 5 (ширина) \times 4 (глубина) = 100
]

Это означает, что выходная размерность после преобразования в слой Flatten будет 100.

Применение

В современных нейронных сетях, особенно при работе с фреймворками, такими как TensorFlow и Keras, процесс Flatten является встроенной функцией. Он конвертирует многомерные результаты сверточных слоев в одномерные векторы, что позволяет передавать данные полносвязанным слоям. Например, как показано в условии задачи, в последовательной модели Keras используете Flattem после MaxPooling2D, чтобы подготовить выходные данные для последующих полносвязанных слоев.

Взгляните на приведенный выше фрагмент кода: после применения Flatten, выходной размер был преобразован в одномерный вектор размерности 1600. Это связано с тем, что MaxPooling2D изменил форма данных до (5, 5, 64) перед сглаживанием. Процесс Flatten включает в себя перемножение всех этих значений: (5 \times 5 \times 64 = 1600).

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

Оцените материал
Добавить комментарий

Капча загружается...