2016-06-03 11 views
2

IntroductionWie kann man BatchNormLayer korrekt hinzufügen und verwenden?

Nach den Lasagne docs: „Diese Schicht sollte zwischen einer linearen Transformation (wie ein DenseLayer oder Conv2DLayer) und deren Nichtlinearitäts eingefügt Die Komfortfunktion batch_norm() ändert eine bestehende Schicht. vor der Nichtlinearität die Chargennormierung einfügen. "

jedoch lasagne haben auch die Nutzenfunktion:

lasagne.layers.batch_norm

Aufgrund Implementierung auf mein Ende, kann ich nicht diese Funktion verwenden.

Meine Frage ist: Wie und wo sollte ich den BatchNormLayer hinzufügen?

class lasagne.layers.BatchNormLayer(incoming, axes='auto', epsilon=1e-4, alpha=0.1, beta=lasagne.init.Constant(0), gamma=lasagne.init.Constant(1), mean=lasagne.init.Constant(0), inv_std=lasagne.init.Constant(1), **kwargs) 

Kann ich es nach einer Faltungsschicht hinzufügen? oder sollte ich nach dem maxpool hinzufügen? Muss ich die Vorspannung der Schichten manuell entfernen?

Ansatz verwendet ich es so verwendet haben, nur,:

try: 
     import lasagne 
     import theano 
     import theano.tensor as T 

     input_var = T.tensor4('inputs') 
     target_var = T.fmatrix('targets') 

     network = lasagne.layers.InputLayer(shape=(None, 1, height, width), input_var=input_var) 

     from lasagne.layers import BatchNormLayer 

     network = BatchNormLayer(network, 
           axes='auto', 
           epsilon=1e-4, 
           alpha=0.1, 
           beta=lasagne.init.Constant(0), 
           gamma=lasagne.init.Constant(1), 
           mean=lasagne.init.Constant(0), 
           inv_std=lasagne.init.Constant(1)) 

     network = lasagne.layers.Conv2DLayer(
      network, num_filters=60, filter_size=(3, 3), stride=1, pad=2, 
      nonlinearity=lasagne.nonlinearities.rectify, 
      W=lasagne.init.GlorotUniform()) 

     network = lasagne.layers.Conv2DLayer(
      network, num_filters=60, filter_size=(3, 3), stride=1, pad=1, 
      nonlinearity=lasagne.nonlinearities.rectify, 
      W=lasagne.init.GlorotUniform()) 


     network = lasagne.layers.MaxPool2DLayer(incoming=network, pool_size=(2, 2), stride=None, pad=(0, 0), 
               ignore_border=True) 


     network = lasagne.layers.DenseLayer(
      lasagne.layers.dropout(network, p=0.5), 
      num_units=32, 
      nonlinearity=lasagne.nonlinearities.rectify) 


     network = lasagne.layers.DenseLayer(
      lasagne.layers.dropout(network, p=0.5), 
      num_units=1, 
      nonlinearity=lasagne.nonlinearities.sigmoid) 


     return network, input_var, target_var 

Referenzen:

https://github.com/Lasagne/Lasagne/blob/master/lasagne/layers/normalization.py#L120-L320

http://lasagne.readthedocs.io/en/latest/modules/layers/normalization.html

Antwort

2

Wenn nichtmit:

  • BatchNormLayer sollte nach der dichten oder Faltungsschicht vor der Nichtlinearität hinzugefügt werden.
  • Maxpool ist ein nichtlineares Downsampling, bei dem die höchsten Werte auf dieser Ebene beibehalten werden. Die Stichprobenwerte werden normalisiert, wenn Sie BatchNormLayer nach oder faltung/dichte Schicht hinzugefügt haben.
  • Wenn Sie nicht batch_norm verwenden, entfernen Sie den Bias manuell, da er redundant ist.

Bitte testen Sie den folgenden Code und lassen Sie uns wissen, ob es für das, was Sie erreichen möchten, funktioniert. Wenn es nicht funktioniert, können Sie versuchen, die batch_norm code anzupassen.

import lasagne 
import theano 
import theano.tensor as T 
from lasagne.layers import batch_norm 

input_var = T.tensor4('inputs') 
target_var = T.fmatrix('targets') 

network = lasagne.layers.InputLayer(shape=(None, 1, height, width), input_var=input_var) 

network = lasagne.layers.Conv2DLayer(
    network, num_filters=60, filter_size=(3, 3), stride=1, pad=2, 
    nonlinearity=lasagne.nonlinearities.rectify, 
    W=lasagne.init.GlorotUniform()) 
network = batch_norm(network) 

network = lasagne.layers.Conv2DLayer(
    network, num_filters=60, filter_size=(3, 3), stride=1, pad=1, 
    nonlinearity=lasagne.nonlinearities.rectify, 
    W=lasagne.init.GlorotUniform()) 
network = batch_norm(network) 

network = lasagne.layers.MaxPool2DLayer(incoming=network, pool_size=(2, 2), stride=None, pad=(0, 0), 
             ignore_border=True) 

network = lasagne.layers.DenseLayer(
    lasagne.layers.dropout(network, p=0.5), 
    num_units=32, 
    nonlinearity=lasagne.nonlinearities.rectify) 
network = batch_norm(network) 

network = lasagne.layers.DenseLayer(
    lasagne.layers.dropout(network, p=0.5), 
    num_units=1, 
    nonlinearity=lasagne.nonlinearities.sigmoid) 
network = batch_norm(network) 

Wenn die params bekommen die Grafik zu erstellen für Sie Weise aktualisieren, erinnern auf True trainierbar zu setzen:

params = lasagne.layers.get_all_params(l_out, trainable=True) 
updates = lasagne.updates.adadelta($YOUR_LOSS_HERE, params)` 
Verwandte Themen