2017-08-17 8 views
1

J'ai quelques problèmes pour comprendre les modèles de DNN en utilisant la normalisation par batch, en particulier en utilisant keras. Quelqu'un peut-il m'expliquer la structure et le contenu de chaque couche dans ce modèle que j'ai construit?Questions théoriques sur les couches en dnn avec la normalisation par batch en utilisant keras

modelbatch = Sequential() 
modelbatch.add(Dense(512, input_dim=1120)) 
modelbatch.add(BatchNormalization()) 
modelbatch.add(Activation('relu')) 
modelbatch.add(Dropout(0.5)) 

modelbatch.add(Dense(256)) 
modelbatch.add(BatchNormalization()) 
modelbatch.add(Activation('relu')) 
modelbatch.add(Dropout(0.5)) 

modelbatch.add(Dense(num_classes)) 
modelbatch.add(BatchNormalization()) 
modelbatch.add(Activation('softmax')) 
# Compile model 
modelbatch.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) 
# Train the model 
start = time.time() 
model_info = modelbatch.fit(X_2, y_2, batch_size=500, \ 
         epochs=20, verbose=2, validation_data=(X_test, y_test)) 
end = time.time() 

Ceci est, je pense, toutes les couches de mon modèle:

print(modelbatch.layers[0].get_weights()[0].shape) 
(1120, 512) 
print(modelbatch.layers[0].get_weights()[1].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[0].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[1].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[2].shape) 
(512,) 
print(modelbatch.layers[1].get_weights()[3].shape) 
(512,) 
print(modelbatch.layers[4].get_weights()[0].shape) 
(512, 256) 
print(modelbatch.layers[4].get_weights()[1].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[0].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[1].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[2].shape) 
(256,) 
print(modelbatch.layers[5].get_weights()[3].shape) 
(256,) 
print(modelbatch.layers[8].get_weights()[0].shape) 
(256, 38) 
print(modelbatch.layers[8].get_weights()[1].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[0].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[1].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[2].shape) 
(38,) 
print(modelbatch.layers[9].get_weights()[3].shape) 
(38,) 

Je vous saurais gré de votre aide, merci à l'avance.

Répondre

0

Parcourons votre modèle:

Vous avez votre couche d'entrée avec la dimension 1120, relié à celui-là, vous avez votre première couche cachée avec 512 neurones, une fois que vous avez votre couche de normalisation par lots. Après cela, votre fonction d'activation et ensuite votre couche de décrochage. Notez que vous pouvez utiliser la commande model.summary() pour visualiser votre modèle

En théorie, vous pouvez (et devez) considérer ces couches comme une seule couche sur laquelle vous appliquez la transformation suivante: normalisation par lot, activation et suppression. En pratique, chaque couche est implémentée individuellement dans Keras car vous gagnez en modularité pour l'implémentation: au lieu de coder toutes les possibilités de conception d'une couche, l'utilisateur peut choisir d'ajouter à la norme ou à l'abandon de la couche. Pour regarder la mise en œuvre modulaire, je vous recommande de jeter un oeil à http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf et en général au http://cs231n.stanford.edu/syllabus.html si vous voulez approfondir vos connaissances. Pour la couche de normalisation par lots, vous pouvez remarquer 4 paramètres: deux paramètres réglables: gamma et bêta, et deux paramètres définis par les données (la moyenne et l'écart-type). Pour en savoir ce que c'est, regardez la classe Stanford, vous pouvez également le trouver dans l'article original sur la normalisation des lots https://arxiv.org/abs/1502.03167. C'est juste une astuce pour améliorer la vitesse d'apprentissage et améliorer la précision en normalisant vos données à chaque couche, comme vous le feriez dans une étape de prétraitement pour vos données d'entrée. D'après ce que j'ai dit, vous pouvez déduire le reste de votre modèle.

N-B: Je n'utiliserais pas la couche de normalisation de batch dans la dernière étape avant la softmax.

Est-il plus clair?

+0

oui, merci, c'est plus clair, mais juste les 4 paramètres de la normalisation par lots, je ne sais pas si je pourrais utiliser pour évaluer avec d'autres données (comment savoir, il est possible de sauvegarder des modèles dans keras ou dans le cas d'un DNN simple vous pouvez prendre les poids et biais avec model.layers.get_weights() pour évaluer une autre donnée), donc, je vais faire la même chose, dans ce cas en utilisant la normalisation par lots, mais je ne sais pas lequel de toutes les couches a montré est nécessaire de prendre pour évaluer dans un autre environnement? Merci d'avance! –

+0

Vous voulez dire que vous voulez utiliser le modèle que vous avez appris pour faire des prédictions sans l'API Keras et que vous voulez copier tous vos poids et votre architecture dans quelque chose d'autre? – Nathan

+0

oui, comme par exemple avec un simple DNN je reçois les poids avec ceci: 'weights1 = modelbatch.layers [0] .get_weights() [0]' #Le 1 couche cachée 'biases1 = ...' 'weights2 = modelbatch.layers [1] .get_weights() [0] '#Couche 2 cachée ' biases2 = ..... ' ' weights3 = modelbatch.layers [4] .get_weights() [0] '#Le # couche de sortie 'biases3 = ....' –