Я читал the original paper на BN и вопрос переполнения стека на How could I use Batch Normalization in TensorFlow?, который обеспечивает очень полезный фрагмент кода для вставки блока нормализации в нейронную сеть, но не дает достаточного указания относительно того, как на самом деле использовать его во время обучения, вывода и при оценке моделей.Как сделать вывод с периодической нормализацией с помощью тензорного потока?
Например, я хотел бы отслеживать ошибку поезда во время тренировки и ошибки теста, чтобы убедиться, что я не переоборудован. Ясно, что блок нормализации партии должен быть отключен во время теста, но при оценке ошибки в обучающем наборе, если блок нормализации партии также отключен? Мои основные вопросы:
- Во время вывода и оценок ошибок, следует нормализация блок партии быть превращены отнезависимо набора данных?
- Означает ли это, что блок нормализации партии должен только быть включенным в течение этап обучения?
Чтобы сделать это очень ясно, я буду предоставлять выписку (упрощенного) код, который я использую для запуска пакетной нормализации с потоком Tensor в соответствии с тем, что мое понимание того, что является правильным, что нужно сделать:
## TRAIN
if phase_train is not None:
#DO BN
feed_dict_train = {x:X_train, y_:Y_train, phase_train: False}
feed_dict_cv = {x:X_cv, y_:Y_cv, phase_train: False}
feed_dict_test = {x:X_test, y_:Y_test, phase_train: False}
else:
#Don't do BN
feed_dict_train = {x:X_train, y_:Y_train}
feed_dict_cv = {x:X_cv, y_:Y_cv}
feed_dict_test = {x:X_test, y_:Y_test}
def get_batch_feed(X, Y, M, phase_train):
mini_batch_indices = np.random.randint(M,size=M)
Xminibatch = X[mini_batch_indices,:] # (M x D^(0))
Yminibatch = Y[mini_batch_indices,:] # (M x D^(L))
if phase_train is not None:
#DO BN
feed_dict = {x: Xminibatch, y_: Yminibatch, phase_train: True}
else:
#Don't do BN
feed_dict = {x: Xminibatch, y_: Yminibatch}
return feed_dict
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
for iter_step in xrange(steps):
feed_dict_batch = get_batch_feed(X_train, Y_train, M, phase_train)
# Collect model statistics
if iter_step%report_error_freq == 0:
train_error = sess.run(fetches=l2_loss, feed_dict=feed_dict_train)
cv_error = sess.run(fetches=l2_loss, feed_dict=feed_dict_cv)
test_error = sess.run(fetches=l2_loss, feed_dict=feed_dict_test)
do_stuff_with_errors(train_error, cv_error, test_error)
# Run Train Step
sess.run(fetches=train_step, feed_dict=feed_dict_batch)
и код, я использую для создания пакетной нормализации блоков:
def standard_batch_norm(l, x, n_out, phase_train, scope='BN'):
"""
Batch normalization on feedforward maps.
Args:
x: Vector
n_out: integer, depth of input maps
phase_train: boolean tf.Varialbe, true indicates training phase
scope: string, variable scope
Return:
normed: batch-normalized maps
"""
with tf.variable_scope(scope+l):
#beta = tf.Variable(tf.constant(0.0, shape=[n_out], dtype=tf.float64), name='beta', trainable=True, dtype=tf.float64)
#gamma = tf.Variable(tf.constant(1.0, shape=[n_out],dtype=tf.float64), name='gamma', trainable=True, dtype=tf.float64)
init_beta = tf.constant(0.0, shape=[n_out], dtype=tf.float64)
init_gamma = tf.constant(1.0, shape=[n_out],dtype=tf.float64)
beta = tf.get_variable(name='beta'+l, dtype=tf.float64, initializer=init_beta, regularizer=None, trainable=True)
gamma = tf.get_variable(name='gamma'+l, dtype=tf.float64, initializer=init_gamma, regularizer=None, trainable=True)
batch_mean, batch_var = tf.nn.moments(x, [0], 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
Из чистого любопытства, почему вы не используете «официальный» пакетную норму слоя: https://github.com/tensorflow/tensorflow/blob/b826b79718e3e93148c3545e7aa3f90891744cc0/tensorflow/contrib/layers/python/layers/ layers.py # L100 –
Я еще не изучил этот вопрос до сих пор, но, насколько я вижу из документации, вы просто используете двоичный параметр is_training в этом слое batch_norm и устанавливаете его в true только для фазы обучения. –
@MaximHaytovich Я даже не знал, что существует, если вы заходите в свой API (https://www.tensorflow.org/versions/r0.9/api_docs/python/nn.html#batch_normalization), что BN даже не как вы это нашли? Я шокирован, что никто ничего не говорил об этом раньше. – Pinocchio