Как Keras может рассчитать количество параметров на ранней стадии, когда еще нет измерений?

Извините за очень простой вопрос (я новичок в Keras). Мне было интересно, как Keras может вычислить для каждого слоя количество параметров на ранней стадии (до подбора), несмотря на то, что model.summary показывает, что есть измерения, которые на этом этапе все еще имеют значения None. Определены ли эти значения каким-либо образом, и если да, то почему бы не показать их в сводке?

Я задаю вопрос, потому что мне трудно понять мою ошибку формы тензора (я пытаюсь определить выходные размеры блока C5 моей модели resnet50, но я не вижу их в model.summary, даже если я вижу количество параметров).

Ниже я привожу пример, основанный на слое C5_reduced в RetinaNet, который питается слоем C5 Resnet50. C5_reduced это

Conv2D(256,kernel_size=1,strides=1,pad=1)

На основе model.summary для этого конкретного слоя:

C5_reduced (Conv2D)    (None, None, None, 256)          524544 

Я сделал предположение, что C5 равно (None,1,1,2048), потому что 2048*256+256 = 524544 (я не знаю, как подтвердить или опровергнуть эту гипотезу). Так что, если это уже известно, почему бы не показать это в сводке? Если бы размеры 2 и 3 были бы другими, количество параметров тоже было бы другим, верно?


person Patrick    schedule 29.01.2021    source источник
comment
Можете добавить свои коды? Будет легко привести пример.   -  person Frightera    schedule 29.01.2021


Ответы (2)


Если вы передадите точную входную форму своему самому первому слою или входному слою в вашей сети, вы получите желаемый результат. Например, я использовал входной слой здесь:

input_1 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     

Ввод передан как (224,224,3). 3 представляет глубину здесь. Обратите внимание, что расчет сверточных параметров отличается от расчета плотных слоев.

Если вы сделаете следующее:

tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3))

Ты увидишь:

conv2d (Conv2D) ---> (None, 148, 148, 16)    

Размеры уменьшены до 148x148, в Keras отступы по умолчанию valid. Также strides равно 1. Тогда форма вывода будет 148 x 148. (Вы можете найти формулу.)

Итак, что такое значения None?

  • Первое значение Нет — это размер пакета. В Keras первое измерение — это размер партии. Вы можете передать их и сделать фиксированными, или вы можете определить их при подгонке модели или прогнозировании.
  • В 2D-свертке ожидаемыми входными данными являются (размер_пакета, высота, ширина, каналы), вы также можете использовать такие формы, как (Нет, Нет, Нет, 3), которые означает, что разрешены различные размеры изображений.

Редактировать:

tf.keras.layers.Input(shape = (None, None, 3)),
tf.keras.layers.Conv2D(16, (3,3), activation='relu')

Производит:

conv2d_21 (Conv2D)           (None, None, None, 16)    448       

Что касается вашего вопроса, как рассчитываются параметры, даже если мы передали высоту и ширину изображения как Нет?

Параметры свертки рассчитываются согласно:

(filter_height * filter_width * input_image_channels + 1) * number_of_filters

Когда мы помещаем их в формулу,

filter_height = 3
filter_width = 3
input_image_channel = 3
number_of_filters = 16

Параметры = (3 x 3 x 3 + 1) * 16 = 28 * 16 = 448

Обратите внимание, нам нужен только номер канала input_image, который равен 3, что означает, что это изображение RGB.

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

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

person Frightera    schedule 29.01.2021
comment
Спасибо, Frightera, но мой вопрос остается: почему бы не показать значения ширины и высоты (на верхних уровнях я понимаю, что это уже не размеры ширины и высоты) в сводке? Правильно ли я говорю, что эти значения известны, так как мы можем видеть количество параметров - person Patrick; 30.01.2021
comment
или указано иначе, как мы можем увидеть количество параметров в сводке, если некоторые измерения (кроме измерения партии) равны None? Вероятно, потому что эти значения известны, верно? Так если это так, то почему бы не показать их? - person Patrick; 30.01.2021
comment
а если это не так, то как можно определить количество параметров, так как оно зависит от конкретных значений размеров ширины и высоты? - person Patrick; 30.01.2021
comment
Я отредактировал свой ответ, посмотрите, есть ли ответ на ваш вопрос. Если нет, то не стесняйтесь спрашивать дальше :) - person Frightera; 30.01.2021

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

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

person devboydan    schedule 29.01.2021
comment
Спасибо девбойдан. Но у меня остается вопрос: почему бы не показать реальные цифры в model.summary, если они известны (а они известны, так как показывается количество параметров). - person Patrick; 29.01.2021