Ich las the original paper auf BN und die Stapelüberlauf Frage auf How could I use Batch Normalization in TensorFlow?, die ein sehr nützliches Stück Code bietet, um eine Charge Normalisierung Block zu einem Neuronalen Netzwerk einfügen, bietet aber nicht genügend Anleitung, wie man tatsächlich verwenden während des Trainings verwenden, Schlussfolgerung und bei der Bewertung von Modellen.Wie kann man mit der Batch-Normalisierung mit Tensor Flow Rückschlüsse ziehen?
Zum Beispiel möchte ich den Zug Fehler während des Trainings und Test Fehler verfolgen, um sicherzustellen, dass ich nicht übermäßig fit. Es ist klar, dass der Batch-Normalisierungsblock während des Tests ausgeschaltet sein sollte, aber sollte der Batch-Normalisierungsblock auch ausgeschaltet werden, wenn der Fehler im Trainingssatz ausgewertet wird? Meine Hauptfragen sind:
- Während Inferenz und Fehlerauswertung sollte die Batch-Normalisierungsblock offunabhängig des Datensatzes gedreht werden?
- Bedeutet das, dass der Batch-Normalisierungsblock nur während der Trainingsschritt sein sollte dann?
es ganz klar zu machen, ich werde einen Extrakt bereitzustellen (vereinfachter) Code Ich habe nach Batch Normalisierung mit Tensor Fluss laufen wurde mit, was ist mein Verständnis von dem, was ist das Richtige zu tun:
## 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)
und der Code, den ich mit der Batch-Normalisierung Blöcke zu produzieren:
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
Aus reiner Neugier, warum Sie nicht ‚offizielle‘ Batch-Norm Schicht verwenden: https://github.com/tensorflow/tensorflow/blob/b826b79718e3e93148c3545e7aa3f90891744cc0/tensorflow/contrib/layers/python/layers/ layers.py # L100 –
Ich habe noch nicht tief in diese Angelegenheit geblickt, aber soweit ich aus der Dokumentation ersehen kann, benutze ich nur binary Parameter is_training in dieser batch_norm Ebene und setze es nur für die Trainingsphase auf true. –
@MaximHaytovich Ich war mir nicht einmal bewusst, dass existierte, wenn Sie ihre API gehen (https://www.tensorflow.org/versions/r0.9/api_docs/python/nn.html#batch_normalization), dass BN nicht gerade ist erwähnt, wie hast du das überhaupt gefunden? Ich bin schockiert, dass noch niemand darüber gesprochen hat. – Pinocchio