Пакетная нормализация с 3-мя свертками (временной шаг, высота, ширина)

В принципе, это всего лишь 2-я сверточная модель. Потребность в третьем измерении проистекает из того факта, что я хочу включить штраф в сглаживание в свою функцию потерь, которая требует выходных данных от 3 последовательных временных шагов.

ПРИМЕЧАНИЕ: я не хочу сворачивать временные шаги, чтобы узнать корреляции во времени. Для моей функции потери мне нужны только выходы 2d конв в 3 кадра (с 3 разных временных шагов).

Таким образом, я решил использовать слои 3dconv с фильтрами размера 1 в измерении глубины (времени).

У меня такой вопрос: я хочу, чтобы batch_normalization вел себя так же, как и для двумерных сверток: мой вход - 3 двумерных изображения из того же дистрибутива.

Этот поток не решает вопрос, а просто использует пакетную нормализацию, как обычно. Код, который я использую для 2d сверток, следующий: (первоисточник)

def batch_normalization(x, n_out, phase_train, scope):
"""
Batch normalization on convolutional maps.
Ref.: http://stackru.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow
Args:
    x:           Tensor, 4D BHWD input maps
    n_out:       integer, depth of input maps
    phase_train: boolean tf.Variable, true indicates training phase
    scope:       string, variable scope
Return:
    normed:      batch-normalized maps
"""
with tf.variable_scope(scope):
    beta = tf.Variable(tf.constant(0.0, shape=[n_out]),
                                 name='beta', trainable=True)
    gamma = tf.Variable(tf.constant(1.0, shape=[n_out]),
                                  name='gamma', trainable=True)
    batch_mean, batch_var = tf.nn.moments(x, [0,1,2], name='moments')
    ema = tf.train.ExponentialMovingAverage(decay=0.5)

    def mean_var_with_update():
        ema_apply_op = ema.apply([batch_mean, batch_var])
        with tf.control_dependencies([ema_apply_op]):
            return tf.identity(batch_mean), tf.identity(batch_var)

    mean, var = tf.cond(phase_train,
                        mean_var_with_update,
                        lambda: (ema.average(batch_mean), ema.average(batch_var)))
    normed = tf.nn.batch_normalization(x, mean, var, beta, gamma, 1e-3)
return normed

Использование аргумента оси в tf.nn.moments как в batch_mean, batch_var = tf.nn.moments(x, [0,1,2], name='moments') едва описан в документации по тензорному потоку:

для так называемой "глобальной нормализации", используемой с сверточными фильтрами с формой [партия, высота, ширина, глубина], проходные оси =[0, 1, 2].

для простой нормализации партии проходят оси =[0] (только партия).

Я просмотрел исходный код tf.nn.moments и заметил, что указанные оси "сжаты" (строка 626).

Так что я прав, предполагая, что, поскольку меня не волнует разница между 3 временными шагами, я должен просто передать каждое измерение, кроме глубины объекта / канала, в tf.nn.moments? Для 2dconv, BHWC это было [0,1,2], так что тогда для моего '3d' конвоя с T для временных шагов BTHWC это было бы [0,1,2,3].

РЕДАКТИРОВАТЬ0: я только что понял, что я мог бы использовать 3 отдельных сверточных потока с общими весами вместо того, чтобы пойти в conv3d.:/

0 ответов

Другие вопросы по тегам