Результат Keras model.summary() - Понимание № параметров

У меня есть простая модель NN для обнаружения рукописных цифр из изображения 28x28px, написанного на питоне с использованием Keras (Theano backend):

model0 = Sequential()

#number of epochs to train for
nb_epoch = 12
#amount of data each iteration in an epoch sees
batch_size = 128

model0.add(Flatten(input_shape=(1, img_rows, img_cols)))
model0.add(Dense(nb_classes))
model0.add(Activation('softmax'))
model0.compile(loss='categorical_crossentropy', 
         optimizer='sgd',
         metrics=['accuracy'])

model0.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch,
      verbose=1, validation_data=(X_test, Y_test))

score = model0.evaluate(X_test, Y_test, verbose=0)

print('Test score:', score[0])
print('Test accuracy:', score[1])

Это хорошо работает, и я получаю точность ~ 90%. Затем я выполнил следующую команду, чтобы получить сводку моей сетевой структуры, выполнив print(model0.summary()). Это выдает следующее:

Layer (type)         Output Shape   Param #     Connected to                     
=====================================================================
flatten_1 (Flatten)   (None, 784)     0           flatten_input_1[0][0]            
dense_1 (Dense)     (None, 10)       7850        flatten_1[0][0]                  
activation_1        (None, 10)          0           dense_1[0][0]                    
======================================================================
Total params: 7850

Я не понимаю, как они добираются до 7850 общих параметров и что это значит?

Ответы

Ответ 1

Количество параметров равно 7850, потому что с каждым скрытым блоком у вас есть 784 входных веса и один вес соединения со смещением. Это означает, что каждая скрытая единица дает вам 785 параметров. У вас есть 10 единиц, так что это сумма до 7850.

ОБНОВИТЬ:

Роль этого дополнительного термина смещения действительно важна. Это значительно увеличивает емкость вашей модели. Вы можете прочитать подробности, например, здесь:

Роль предвзятости в нейронных сетях

Ответ 2

Я подаю 514-мерный вещественный вход в модель Sequential в Keras. Моя модель построена следующим образом:

    predictivemodel = Sequential()
    predictivemodel.add(Dense(514, input_dim=514, W_regularizer=WeightRegularizer(l1=0.000001,l2=0.000001), init='normal'))
    predictivemodel.add(Dense(257, W_regularizer=WeightRegularizer(l1=0.000001,l2=0.000001), init='normal'))
    predictivemodel.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

Когда я печатаю model.summary(), я получаю следующий результат:

Layer (type)    Output Shape  Param #     Connected to                   
================================================================
dense_1 (Dense) (None, 514)   264710      dense_input_1[0][0]              
________________________________________________________________
activation_1    (None, 514)   0           dense_1[0][0]                    
________________________________________________________________
dense_2 (Dense) (None, 257)   132355      activation_1[0][0]               
================================================================
Total params: 397065
________________________________________________________________ 

Для слоя dense_1 число параметров составляет 264710. Это получается как: 514 (входные значения) * 514 (нейроны в первом слое) + 514 (значения смещения)

Для слоя dense_2 число параметров составляет 132355. Это получается как: 514 (входные значения) * 257 (нейроны во втором слое) + 257 (значения смещения для нейронов во втором слое)

Ответ 3

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

Чтобы подключить узлы к каждому слою, вы можете сделать следующее:

for layer in model.layers:
    print(layer.name, layer.inbound_nodes, layer.outbound_nodes)

Ответ 4

Самый простой способ рассчитать число нейронов в одном слое: Значение параметра/(количество единиц * 4)

  • Число единиц находится в файле predivemodel.add(Dense (514,...)
  • Параметрическое значение Параметр в функции model.summary()

Например, в ответе Paul Lo число нейронов в одном слое равно 264710/(514 * 4) = 130

Ответ 5

Число параметров - это количество чисел, которые можно изменить в модели. Математически это означает количество аспектов вашей задачи оптимизации. Для вас, как для программиста, каждый из этих параметров является числом с плавающей запятой, которое обычно занимает 4 байта памяти, что позволяет вам прогнозировать размер этой модели после сохранения.

Эта формула для этого числа различна для каждого типа слоя нейронной сети, но для плотного слоя она проста: у каждого нейрона есть один параметр смещения и один вес на вход: N = n_neurons * ( n_inputs + 1).

Ответ 6

Для плотных слоев:

output_size * (input_size + 1) == number_parameters 

Для слоев Conv:

output_channels * (input_channels * window_size + 1) == number_parameters

Рассмотрим следующий пример,

model = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
Conv2D(64, (3, 3), activation='relu'),
Conv2D(128, (3, 3), activation='relu'),
Dense(num_classes, activation='softmax')
])

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 222, 222, 32)      896       
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 220, 220, 64)      18496     
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 218, 218, 128)     73856     
_________________________________________________________________
dense_9 (Dense)              (None, 218, 218, 10)      1290      
=================================================================

Расчет параметров,

assert 32 * (3 * (3*3) + 1) == 896
assert 64 * (32 * (3*3) + 1) == 18496
assert 128 * (64 * (3*3) + 1) == 73856
assert num_classes * (128 + 1) == 1290