Как интерпретировать выходные данные model.summary () в CNN? - PullRequest
1 голос
/ 06 апреля 2020

Я новичок в области глубокого обучения и CNN. Если CNN был создан, как показано на скриншоте, то как объяснить выходы, как описано model.summary(). Я не могу понять выходные формы различных слоев.

Краткое описание модели:

Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_14 (Conv2D)           (None, 29, 29, 32)        1568      
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_15 (Conv2D)           (None, 11, 11, 32)        16416     
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 5, 5, 32)          0         
_________________________________________________________________
flatten_3 (Flatten)          (None, 800)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 32)                25632     
_________________________________________________________________
dense_7 (Dense)              (None, 10)                330       
=================================================================
Total params: 43,946
Trainable params: 43,946
Non-trainable params: 0

neural network design

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Предположим, что размер каждого изображения (32, 32, 3) в соответствии с вопросом.

Затем Keras добавляет дополнительное измерение для обработки нескольких пакетов, т. Е. Для обучения нескольких изображений на каждом шаге одной эпохи. , Так как размер партии может варьироваться, его размер представлен как Нет. Следовательно, форма ввода становится (None, 32, 32, 3).

. Свертывание изображения (32, 32) с фильтром (4, 4), с шагом и степенью расширения 1 и «действительным» заполнением приводит к выводу размера (32 - 4 + 1, 32 - 4 + 1) = (29, 29). Поскольку у вас есть 32 таких фильтра, выходная форма становится (29, 29, 32).

Ядро MaxPooling по умолчанию имеет форму (2, 2) и шаги (2, 2). Применение этого к (29, 29) изображению приводит к изображению формы (((29 - 2)//2) + 1, ((29 - 2)//2) + 1)) = (14, 14).

. Этот шаблон можно распространить на все слои Conv2D и MaxPooling.

Слой Flatten принимает все пиксели. вдоль всех каналов и создает одномерный вектор (без учета размера партии). Поэтому вход (5, 5, 32) сглаживается до значений (5 * 5 * 32) = 800.

Количество параметров

Количество параметров для слоя Conv2D определяется следующим образом:

(kernel_height * kernel_width * input_channels * output_channels) + (output_channels, если используется смещение).

Итак, для первого слоя Conv2D с 3 входными каналами, 32 выходными каналами и размером ядра (4, 4) число параметров равно (4 * 4 * 3 * 32) + 32 = 1568 .

0 голосов
/ 06 апреля 2020

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

Input shape

4D tensor with shape: (batch, channels, rows, cols) if data_format is "channels_first" 
or 4D tensor with shape: (batch, rows, cols, channels) if data_format is 
"channels_last".

Output shape

4D tensor with shape: (batch, filters, new_rows, new_cols) if data_format is 
"channels_first" or 4D tensor with shape: (batch, new_rows, new_cols, filters) if 
data_format is "channels_last". rows and cols values might have changed due to 
padding.

Для слоев maxpool2d значения такие же, как указано выше для небольшое изменение следующим образом.

**Input**

If data_format='channels_last': 4D tensor with shape: (batch_size, rows, cols, channels)
If data_format='channels_first': 4D tensor with shape: (batch_size, channels, rows, cols)

**Output**

If data_format='channels_last': 4D tensor with shape: (batch_size, pooled_rows, pooled_cols, channels)
If data_format='channels_first': 4D tensor with shape: (batch_size, channels, pooled_rows, pooled_cols)

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

Мы можем сделать это, вставив слой Flatten поверх слоя Convolution. Выровняйте слой squa sh 3 измерения изображения в одном измерении. Теперь у нас есть только двумерный массив формы (batch_size, squashed_size),, который приемлем для плотных слоев.

Надеюсь, это поможет вам.

0 голосов
/ 06 апреля 2020

Ваш первый слой - это свертка, которая принимает неизвестную входную форму (она известна вам, вы определили ее где-то с помощью input_shape= ....

У первой свертки есть выход с формой (None, 29, 29, 32), где:

  • None - размер пакета
  • 29 и 29 - размер полученного изображения
  • 32 - количество фильтров этого свертка, а также количество каналов на ее выходе

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

Затем у вас есть другая свертка, принимая вывод пула в качестве входного, форма вывода этой новой свертки будет (None, 11, 11, 32). Вы использовали 32 здесь тоже фильтры.

.... .....

....

Тогда у вас есть слой Flatten, который берет изображения и преобразует их в один вектор, выходная форма равна (None, 800), где None i все еще размер пакета остается неизменным, 800 - это все элементы, которые были у вас во входном тензоре, теперь в одном векторе, по одному вектору на выборку в пакете.

Затем Dense слоев, первый с 32 единицами вторая с 10 ед.

Конечная форма вывода вашей модели (None, 10). Он выводит 10 значений на образец в партии.


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

В вашей модели в общей сложности из 43946 весов, все обучаемые.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...