Keras model.summary () resultado - Compreender o # de Parâmetros

votos
17

Eu tenho um modelo NN simples para detectar dígitos escritos à mão a partir de uma imagem 28x28px escrito em python usando 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])

Isso funciona bem e fico com ~ 90% de precisão. Eu, então, execute o seguinte comando para obter um resumo da estrutura da minha rede fazendo print(model0.summary()). Isso gera o seguinte:

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

Eu não entendo como eles chegar a 7850 params totais e que isso realmente significa?

Publicado 29/04/2016 em 19:09
fonte usuário
Em outras línguas...                            


6 respostas

votos
12

yA número de parâmetros é 7850 porque com cada unidade escondido você tem 784 pesos de entrada e um peso de conexão com viés. Isto significa que cada unidade escondida dá-lhe 785 parâmetros. Você tem 10 unidades por isso resume a 7850.

UPDATE:

O papel deste termo viés adicional é realmente importante. Ele aumenta significativamente a capacidade do seu modelo. Você pode ler detalhes, por exemplo aqui:

Papel de Bias em Redes Neurais

Respondeu 29/04/2016 em 20:14
fonte usuário

votos
8

I alimentar uma entrada de valor real dimensional 514 para um Sequentialmodelo em Keras. Meu modelo é construído na seguinte forma:

    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'])

Quando eu imprimir model.summary()recebo seguinte resultado:

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
________________________________________________________________ 

Para a camada de dense_1, número de parâmetros é 264710. Este é obtido sob a forma: 514 (valores de entrada) * 514 (neurônios na primeira camada) + 514 (valores de polarização)

Para dense_2 camada, o número de parâmetros é 132355. Este é obtido sob a forma: 514 (valores de entrada) * 257 (neurônios na segunda camada) + 257 (valores de polarização para os neurónios na segunda camada)

Respondeu 20/07/2016 em 13:33
fonte usuário

votos
0

O "nenhum" na forma significa que não têm um número pré-definido. Por exemplo, pode ser o tamanho do lote que você usar durante o treinamento, e você quer torná-lo flexível por não atribuir qualquer valor a ele para que você pode alterar o tamanho do lote. O modelo será inferir a forma a partir do contexto das camadas.

Para obter nós conectados a cada camada, você pode fazer o seguinte:

for layer in model.layers:
    print(layer.name, layer.inbound_nodes, layer.outbound_nodes)
Respondeu 06/07/2017 em 16:50
fonte usuário

votos
0

A maneira mais fácil de calcular o número de neurónios em uma camada é: valor Param / (número de unidades * 4)

  • Número de unidades está em predictivemodel.add (Dense (514, ...)
  • Param valor é param em model.summary () função

Por exemplo, em Paul Lo resposta 's, o número de neurónios em uma camada é 264710 / (514 * 4) = 130

Respondeu 14/01/2018 em 11:17
fonte usuário

votos
0

Número de parâmetros é a quantidade de números que podem ser alterados no modelo. Matematicamente, isto significa número de dimensões de seu problema de otimização. Para você, como um programador, cada um destes parâmetros é um número de ponto flutuante, o que normalmente leva 4 bytes de memória, o que lhe permite prever o tamanho deste modelo uma vez salvo.

Esta fórmula para este número é diferente para cada tipo de camada de rede neural, mas para a camada densa, é simples: cada neurónio tem um parâmetro de polarização e um peso por entrada: N = n_neurons * ( n_inputs + 1).

Respondeu 24/03/2019 em 09:53
fonte usuário

votos
0

Para densas camadas:

output_size * (input_size + 1) == number_parameters 

Para Layers Conv:

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

Considere seguinte exemplo,

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      
=================================================================

params de calcular,

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
Respondeu 11/06/2019 em 02:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more