Как рассчитать количество параметров во втором конверсионном слое? - PullRequest
0 голосов
/ 11 марта 2019

Я кодирую модель CNN с Mnist в Керасе. Код и распечатать его резюме так: код для cnn:

    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3),
                     activation='relu',
                     input_shape=input_shape))
    model.add(Conv2D(63, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128, name='dense', activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))

    model.compile(loss=keras.losses.categorical_crossentropy,
                  optimizer=keras.optimizers.Adadelta(),
                  metrics=['accuracy'])

Сводка модели:

x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 26, 26, 32)        320       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 24, 24, 63)        18207     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 12, 12, 63)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 12, 12, 63)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 9072)              0         
_________________________________________________________________
dense (Dense)                (None, 128)               1161344   
_________________________________________________________________
dropout_2 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                1290      
=================================================================
Total params: 1,181,161
Trainable params: 1,181,161
Non-trainable params: 0
_________________________________________________________________

kernel_size первого и второго слоев conv2D - все (3,3).

Я не понимаю, почему во втором слое conv2D есть 18207 параметров. Разве это не должно быть вычислено как (3*3+1)*63=630?

1 Ответ

2 голосов
/ 11 марта 2019

Чтобы получить количество параметров, необходимо применить следующую формулу:

(FxFxCi+1)xC0

Где FxF - размер ядра, C0 Выходные каналы и Ci входные каналы.Так что в вашем случае вы просто забыли параметр входных каналов:

18207 = 63*(32*3*3+1)

Редактировать, чтобы отвечать на комментарии :

, когда у вас есть выход первого полученного слоя«изображение» формы: (Нет, 26, 26, 32) (Нет, это размер партии).Таким образом, интуитивно вам нужно будет изучать ядра для каждого измерения (канала) и, следовательно, вам нужно ядро ​​для каждого измерения, а затем отображать его в выходном измерении.Размер выходного сигнала зависит от параметров ядра, а также от количества ядер. Свертки обычно рассчитываются для каждого канала и суммируются.Так, например, у вас есть (28,28,3) рис с конвом из 3 ядер (5,5,3), и ваш вывод будет (24,24) рис (1 выходной канал).У вас есть 1 ядро ​​для каждого измерения, которое вы затем суммируете, чтобы получить результат.

Но у вас также может быть несколько извилин:

у вас все еще есть та же картинка (28,28,3), но затем у вас есть сверточный слой размером (5,5,3,4),Это означает, что у вас есть 4 свертки, которые мы описали выше.чтобы получить вывод размером (24,24,4), вы не суммируете число, а складываете их, чтобы получить изображение с несколькими каналами.Вы изучаете несколько независимых извилин одновременно.Итак, вы видите, откуда исходит расчет.И почему входные каналы действительно очень важны, как и выходные.Но они представляют очень разные параметры.(см. это для более подробного и визуального объяснения)

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