2016-04-29 5 views
14

У меня есть простая модель NN для обнаружения рукописных цифр от 28x28px изображения, написанного в Python с использованием Keras (Theano бэкенда):Keras model.summary() результат - Понимание # Параметров

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 общих параметров и что это на самом деле означает?

ответ

10

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

UPDATE:

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

Role of Bias in Neural Networks

+0

Спасибо! Почему существует один вес связи с предубеждением? В чем его цель? – user3501476

6

я кормить 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 слоя, количество Params является 264710. Это получается: 514 (входные значения) * 514 (нейроны в первом слое) + 514 (значения смещения)

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

0

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

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

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

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

  • Количество единиц в predictivemodel.add (Плотные (514, ...)
  • значение Param является Param в model.summary функция()

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

Смежные вопросы