Результат 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