Как правильно добавить и использовать BatchNormLayer?

Введение

Согласно документам лазаньи: «Этот слой должен быть вставлен между линейным преобразованием (таким как DenseLayer или Conv2DLayer) и его нелинейностью. Удобная функция batch_norm() изменяет существующий слой, чтобы вставить пакетную нормализацию перед его нелинейностью».

Однако у лазаньи есть и функция полезности:

лазанья.layers.batch_norm

Однако из-за реализации с моей стороны я не могу использовать эту функцию.

Мой вопрос: как и где я должен добавить BatchNormLayer?

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)

Могу ли я добавить его после слоя свертки? или я должен добавить после maxpool? Нужно ли вручную удалять смещение слоев?

Используемый подход Я использовал его вот так, только:

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

Ссылки:

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

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


person SHASHA    schedule 03.06.2016    source источник


Ответы (1)


Если не использовать batch_norm:

  • BatchNormLayer следует добавлять после плотного слоя или слоя свертки, перед слоем нелинейности.
  • Maxpool — это нелинейная субдискретизация, которая сохраняет самые высокие значения на этом слое. Выборочные значения будут нормализованы, если вы добавили BatchNormLayer после свертки/плотного слоя.
  • Если batch_norm не используется, удалите смещение вручную, поскольку оно избыточно.

Пожалуйста, протестируйте приведенный ниже код и сообщите нам, работает ли он для того, чего вы пытаетесь достичь. Если это не сработает, попробуйте адаптировать batch_norm код.

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)

При получении параметров для создания графика для вашего метода обновления не забудьте установить для обучаемого значение True:

params = lasagne.layers.get_all_params(l_out, trainable=True)
updates = lasagne.updates.adadelta($YOUR_LOSS_HERE, params)`
person rafaelvalle    schedule 05.10.2016