значение флага «обучаемый» и «обучающий» в tf.layers.batch_normalization - PullRequest
0 голосов
/ 07 мая 2018

Какое значение имеет флаг «обучаемый» и «обучающий» в tf.layers.batch_normalization? Чем они отличаются во время тренировок и прогнозов?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Норма партии имеет две фазы:

1. Training:
   -  Normalize layer activations using `moving_avg`, `moving_var`, `beta` and `gamma` 
     (`training`* should be `True`.)
   -  update the `moving_avg` and `moving_var` statistics. 
     (`trainable` should be `True`)
2. Inference:
   -  Normalize layer activations using `beta` and `gamma`.
      (`training` should be `False`)

Пример кода для иллюстрации нескольких случаев:

#random image
img = np.random.randint(0,10,(2,2,4)).astype(np.float32)

# batch norm params initialized
beta = np.ones((4)).astype(np.float32)*1 # all ones 
gamma = np.ones((4)).astype(np.float32)*2 # all twos
moving_mean = np.zeros((4)).astype(np.float32) # all zeros
moving_var = np.ones((4)).astype(np.float32) # all ones

#Placeholders for input image
_input = tf.placeholder(tf.float32, shape=(1,2,2,4), name='input')

#batch Norm
out = tf.layers.batch_normalization(
       _input,
       beta_initializer=tf.constant_initializer(beta),
       gamma_initializer=tf.constant_initializer(gamma),
       moving_mean_initializer=tf.constant_initializer(moving_mean),
       moving_variance_initializer=tf.constant_initializer(moving_var),
       training=False, trainable=False)


update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
init_op = tf.global_variables_initializer()

 ## 2. Run the graph in a session 

 with tf.Session() as sess:

    # init the variables   
    sess.run(init_op)

    for i in range(2):
        ops, o = sess.run([update_ops, out], feed_dict={_input: np.expand_dims(img, 0)})
        print('beta', sess.run('batch_normalization/beta:0'))
        print('gamma', sess.run('batch_normalization/gamma:0'))
        print('moving_avg',sess.run('batch_normalization/moving_mean:0'))
        print('moving_variance',sess.run('batch_normalization/moving_variance:0'))
        print('out', np.round(o))
        print('')

При training=False и trainable=False:

  img = [[[4., 5., 9., 0.]...
  out = [[ 9. 11. 19.  1.]... 
  The activation is scaled/shifted using gamma and beta.

При training=True и trainable=False:

  out = [[ 2.  2.  3. -1.] ...
  The activation is normalized using `moving_avg`, `moving_var`, `gamma` and `beta`. 
  The averages are not updated.

При traning=True и trainable=True:

  The out is same as above, but the `moving_avg` and `moving_var` gets updated to new values.

  moving_avg [0.03249997 0.03499997 0.06499994 0.02749997]
  moving_variance [1.0791667 1.1266665 1.0999999 1.0925]
0 голосов
/ 27 июля 2019

Это довольно сложно.И в TF 2.0 поведение изменилось, см. Это:

https://github.com/tensorflow/tensorflow/blob/095272a4dd259e8acd3bc18e9eb5225e7a4d7476/tensorflow/python/keras/layers/normalization_v2.py#L26

О настройке layer.trainable = False на слое BatchNormalization:

Смысл установки layer.trainable = False состоит в том, чтобы заморозить слой, т. Е. Его внутреннее состояние не изменится во время обучения:
его обучаемые веса не будут обновляться во время fit() или train_on_batch(), а его обновления состоянияне будет работатьОбычно это не обязательно означает, что слой запускается в режиме логического вывода
(который обычно контролируется аргументом training, который может быть передан при вызове слоя).«Замороженное состояние» и «режим вывода»
являются двумя отдельными понятиями.

Однако, в случае слоя BatchNormalization, установка
trainable = False на слое означает, чтослой будет
, а затем будет работать в режиме логического вывода
(это означает, что он будет использовать скользящее среднее и скользящую дисперсию для нормализации текущей партии,
вместо использования среднего значения и дисперсии текущей партии).Это поведение было введено в TensorFlow 2.0, чтобы позволить layer.trainable = False создавать наиболее ожидаемое поведение в случае использования тонкой настройки convnet.Обратите внимание, что:

  • Это происходит только с TensorFlow 2.0.В 1. * установка layer.trainable = False замораживает слой, но не переключает его в режим вывода.
  • Установка trainable на модели, содержащей другие слои, рекурсивно устанавливает значение trainable всех внутренних слоев.
  • Если значение атрибута trainable изменяется после вызова compile() для модели, новое значение не вступает в силу для этой модели, пока не будет вызван compile().
0 голосов
/ 07 мая 2018

training определяет, использовать ли пакетный режим в режиме обучения (который использует статистику из этого мини-пакета) или пакетный метод в режиме вывода (который использует усредненную статистику по данным обучения). trainable контролирует, могут ли переменные, созданные внутри процесса batchnorm, самостоятельно обучаться.

...