Дата публикации Jun 26, 2018
Этот революционный метод введен Сергеем Иоффе, Кристианом Сегеди вбумага,и это цитируется 4994 раза на данный момент. Согласно статье нормализация партии уменьшает смещение внутренней ковариации, т. Е. Делает обучение слоев в сети более независимым друг от друга. Цель уровня пакетной нормы состоит в том, чтобы внести вклад в слой активации, единицу Гаусса, чтобы нейрон не насыщался в случае сигмовидной и желтоватой. Это помогает в быстрой конвергенции сети, позволяет вам быть осторожным при инициализации веса, работает как регуляризация вместо отсева и других методов регуляризации. Теперь я не буду обсуждать большую часть теоретических деталей, но больше о реализации. Я проведу вас через реализацию пакетной нормы в TensorFlow и его математике.
Во время обучения -
Теперь предположим, что между слоем свертки и активацией используется слой пакетной нормы, тогдаИксявляется выходом слоя свертки, иYявляется выводом уровня пакетной нормы и вводом в уровень активации, который может быть ReLU, сигмоидом и т. д. Уровень пакетной нормы запоминает параметрγа такжеβ, а такжеYзависит от их значений. Следовательно, показано, что лучшее представлениеИксучится с помощьюγа такжеβ, Пожалуйста, обратите внимание на две другие статистическиеЕ [х]а такжеВар [х], население означает и дисперсия. Они оцениваются по скользящему среднему и движущейся дисперсии во время тренировки.
Во время вывода -
Проход вперед через пакетный слой норм при выводе отличается от обучения. На умозаключении вместо пакетного значения (μ) и дисперсия (σ2) мы используем среднее значение населения (Е [х]) и дисперсия (Вар [х]) вычислятьх ^, Предположим, что вы даете партию размера один во время логического вывода и нормализуетесь, используя среднюю партию и дисперсию партии, в этом случаех ^ = 0какμ = хтогдау = β, который показывает, что вывод слоя(Y)будет одинаковым для любого входа(Икс)что неправильно. Следовательно, чтобы нормализовать во время вывода, мы используем среднее значение и дисперсию населения, которые мы вычисляли во время обучения, используя скользящее среднее и дисперсию. В следующем разделе мы рассмотрим реализацию Batch Norm в TensorFlow.
import tensorflow as tfa = tf.placeholder(tf.float32, shape=[1,3])
b = tf.placeholder(tf.float32, shape=[1,3])
c = tf.Variable(tf.zeros([1, 3]), dtype=tf.float32)
def train(a,b):
c = tf.add(c,a)
e = some_train_op(a,b)
return eoutput = train(a,b)
loss = tf.log(output)sess = tf.Session()
saver = tf.train.Saver()
sess.run(tf.global_variables_initializer())for itr in range(1000):
ls = sess.run(loss, {a:x, b:y})saver.save(sess, some_path)#Note that this code is for reference only.
Теперь в этом мы запускаемпотерятензор в каждой итерации, для каждой итерациипоездфункция будет вызвана.спеременная для суммирования значениядля всей итерации. Итак, когда мы сохраняем модель, мы ожидаем переменнуюсбыть равным суммированию всех значений, переданных заполнителюв каждой итерации.
Давайте подробно разберем, зависимости в графике этой модели. Когда мы бежимпотерятензор,выходбудет вычислено тогдавыходпозвонюпоездот какой стоимостиебудет необходимо, которое будет рассчитываться с использованиема такжеб, Во всех этих вычисленияхсне будет оцениваться как значениепотерятензор не зависит отс, Решение добавитьскак зависимость до вычисленияе, Следовательно, решение
def train(a,b):
c = tf.add(c,a)
with tf.control_dependencies([c]):
e = some_train_op(a,b)
return e
При обучении сети мы вызываем опцию оптимизатора, которая выполняет все вычисления и обновляет все веса, но операция оптимизатора никогда не зависит от вычисления скользящего среднего или дисперсии. Следовательно, скользящее среднее и дисперсия никогда не получают обновлений и остаются на их первоначальном значении.
Решение: TensorFlow предоставляет три основные функции для нормализации партии
tf.nn.batch_normalization() - Never use this for training, it just compute the y = gamma*x^hat + beta where x^hat = (x-mean)/std_dev.
It doesn't account for keeping moving mean and variance. tf.layers.batch_normalization() - This function can be used for your model. Note: Always add batch norm dependency when using this, either on optimizer op or any other op which you sure that will execute when optimizer op is run. ex:-update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops):
self.solver = tf.train.AdamOptimizer(learning_rate=1e-04)
.minimize(self.loss)Here tf.GraphKeys.UPDATE_OPS is the collections which have moving mean and variance op. tf.contrib.layers.batch_norm() - This function is in contrib module of TensorFlow. This function gives two ways to add dependencies as follows:
1.It has 'update' parameter, set update=None while calling the function and dependency will be added inside the function itself and you don't have to anything else.
Note:This is believed to be slow in comparison to the next method.2. Let the update parameter have it's default value which is "tf.GraphKeys.UPDATE_OPS". Now here also you have to manually add dependency as above with tf.layers.batch_normalization().
Следовательно, вы можете использовать либоtf.layers.batch_normalization () или tf.contrib.layers.batch_norm ()с правильной обработкой зависимостей обновления.
is_training
а такжеtraining
в tf.contrib.layers.batch_norm () и tf.nn.batch_normalization () соответственно. Когда его значениеTrue
, используется среднее значение & дисперсия партии, а среднее значение и дисперсия обновляются для оценки среднего значения и дисперсии популяции. НаFalse
, средняя численность населения и дисперсия используется. Следовательно, вы должны использовать заполнительtrain_phase
за это. Итак, решение выглядит следующим образомdef Bn(x, is_train):
return tf.contrib.layers.batch_norm(x, decay= 0.99,
is_training=is_train,center= True, scale=True,
reuse= False)train_phase = tf.placeholder(tf.bool, name="is_training")
data = tf.placeholder(tf.float32, shape=[None,240,240,3], name="Image") bn_layer = Bn(data, train_phase)loss = some_loss_op()solver = tf.train.AdamOptimizer().minimize(loss)# Training iteration
sess.run(solver, {data: input_data, train_phase:True})#Validation iteration
sess.run(loss, {data: input_data, train_phase:False})
reuse=False
в вышеупомянутых функциях пакетной нормы, которые позволят вам иметь независимые параметры пакетной нормы для обеих ваших сетей, в которых вы хотите поделиться весами.этоСообщение блогатакже есть исчерпывающий список других причин отказа вашей сети.
Спасибо всем за чтение этого блога, я надеюсь, что он спасет вашу борьбу с пакетной нормой и тренировочными сетями. Я приветствую все ваши комментарии и дайте мне знать, если хотите что-то добавить или считаете, что контент вводит в заблуждение. Вы можете связаться со мной по [email protected] для ваших запросов.
© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map