weights python machine-learning neural-network keras theano

python - weights - Resultado de Keras model.summary()-Comprensión del número de parámetros



keras sequential model get weights (4)

Alimino una entrada de valor real de 514 dimensiones a un modelo Sequential en Keras. Mi modelo está construido de la siguiente manera:

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

Cuando model.summary() obtengo el siguiente 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 la capa dense_1, el número de parámetros es 264710. Esto se obtiene como: 514 (valores de entrada) * 514 (neuronas en la primera capa) + 514 (valores de sesgo)

Para la capa densa_2, el número de parámetros es 132355. Esto se obtiene como: 514 (valores de entrada) * 257 (neuronas en la segunda capa) + 257 (valores de sesgo para las neuronas en la segunda capa)

Tengo un modelo NN simple para detectar dígitos escritos a mano desde una imagen de 28x28px escrita en python utilizando Keras (backend de Theano):

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

Esto funciona bien y obtengo ~ 90% de precisión. Luego ejecuto el siguiente comando para obtener un resumen de la estructura de mi red al hacer print(model0.summary()) . Esto produce lo siguiente:

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

¿No entiendo cómo llegan a 7850 parámetros totales y qué significa eso realmente?


El "ninguno" en la forma significa que no tiene un número predefinido. Por ejemplo, puede ser el tamaño de lote que usa durante el entrenamiento, y desea hacerlo flexible al no asignarle ningún valor para que pueda cambiar el tamaño de su lote. El modelo inferirá la forma del contexto de las capas.

Para obtener nodos conectados a cada capa, puede hacer lo siguiente:

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


El número de parámetros es 7850 porque con cada unidad oculta tiene 784 pesos de entrada y un peso de conexión con sesgo. Esto significa que cada unidad oculta le da 785 parámetros. Tienes 10 unidades por lo que suma hasta 7850.

ACTUALIZACIÓN:

El papel de este término de sesgo adicional es realmente importante. Aumenta significativamente la capacidad de su modelo. Puedes leer los detalles, por ejemplo aquí:

Papel del sesgo en las redes neuronales


La forma más fácil de calcular el número de neuronas en una capa es: Valor de parámetro / (número de unidades * 4)

  • El número de unidades está en predictivemodel.add (Denso (514, ...)
  • El valor del parámetro es Param en la función model.summary ()

Por ejemplo, en la respuesta de , el número de neuronas en una capa es 264710 / (514 * 4) = 130