Tensorflow: рдмреИрдЪ рдорд╛рдирдХ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдлрд╝рд░ре░ 2016  ┬╖  127рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: tensorflow/tensorflow

рдХрдИ рдЧреИрд░-рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб http://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow?answertab=votes#tab -top рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ DNNs рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмреИрдЪ рдорд╛рдирджрдВрдб рдХреЛ рдЕрдкрдирд╛ рдорд╣рддреНрд╡ рджрд┐рдпрд╛ рдЬрд╛рдПред

contributions welcome docs-bug

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╕рднреА 127 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдЙрд╕ рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рдд рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрд▓рдд рд╣реИред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЗрдВ рд╣рд░ рдЪреАрдЬ рдареАрдХ рд╣реИ рдФрд░ рдиреБрдХрд╕рд╛рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдореБрдЭреЗ рд╢реВрдиреНрдп рд╕рдЯреАрдХрддрд╛ рдорд┐рд▓рддреА рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд░реАрдХреЗ рд╕реЗ рдЬрдм рдореИрдВ is_training = рдЧрд▓рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рд╢реВрдиреНрдп рдПрд╕реАрд╕реА рдорд┐рд▓рддрд╛ рд╣реИред
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЯреНрд░реЗрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ , рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрдгрди - Quora ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ

рдпрд╣рд╛рдБ рднреА, рдореИрдВрдиреЗ is_training = рдЧрд▓рдд рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рдЭрдВрдбреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ tf.cond рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ tf.placeholders рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИред

@ рдкрд╛рд╡рдиреА рдЖрдкрдХреЛ is_training рд▓рд┐рдП рдкрд╛рдпрдерди рдмреВрд▓рд┐рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ tf.cond рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@ppwwyxx рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдореИрдВ tf.cond(placeholder, batch_norm(.., is_training = True), batch_norm(.., is_training = False)) рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдпрд╛ рдХреНрдпрд╛ рдХреЛрдИ рдПрдХ batch_norm(.., is_training=variable) рдФрд░ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдмрд╛рд╣рд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ?

рдУрд╣ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЖрдк batch_norm(.., is_training=tf.cond(placeholder)) рдХрд░ рд░рд╣реЗ рдереЗ, рдЬреЛ рдХрд┐ рдЧрд▓рдд рд╣реИред
рдЖрдкрдХреЗ рд╡рд░реНрддрдорд╛рди рддрд░реАрдХреЗ рдореЗрдВ рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рджреЛ batch_norm op рдПрдХ рд╣реА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рд╡реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдорд╛рдзреНрдп / рд╡рд┐рдЪрд░рдг рдЖрдБрдХрдбрд╝реЗ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП reuse рддрд░реНрдХ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ bn рдкрд░рдд рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдореИрдВ рдЙрд╕реА рджрд╛рдпрд░реЗ рдФрд░ reuse=True рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рдХрднреА-рдХрднреА рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдкрд░рдд рдХреЛ рдПрдХ рдЫреЛрдЯреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗ рдкрд░реАрдХреНрд╖рдг рддрдХ рдХреЗ рдмрджрд▓рд╛рд╡ рдХреЛ рдХреИрд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред

@sguada FYI рдХрд░реЗрдВ

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмреИрдЪ_рдиреЙрд░реНрдо рдХреЛ рдПрдХ рдЕрдЬрдЧрд░ рдмреВрд▓рд┐рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдЯреЗрдиреНрд╕рд░ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@pawni рдЕрдЧрд░ рдЖрдк рдореВрд╡рд┐рдВрдЧ_рдореИрдВрди рдФрд░ рдореВрд╡рд┐рдВрдЧ_рд╡реЗрд░рд┐рдпрди рд╕реЗрдЯ рдЕрдкрдбреЗрдЯреНрд╕_рдХреЛрд▓реЗрдХреНрд╢рди = рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЬрдЧрд╣ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ tf.GetKeys.UPDATE_OPS рдЪрд▓рд╛рдП рдЬрд╛рдПрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдХреЛ 2 рд╣рд╛рдЗрдкрд░ рддрд░реАрдХреЛрдВ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдореЙрдбрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдХреБрдЫ рдорд╢рд╛рд▓ рдХреА рддрд░рд╣ред рдореЙрдбрд▓ рд╕реНрдерд┐рддрд┐ рдмрджрд▓реЗрдВ ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИред

рдХреНрдпрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдПрдирдПрди рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдпрд╣ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдЗрд╕ "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ" рдмреАрдПрди рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ? рдореИрдВ рд╡рд╛рдХрдИ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдВрдЧрд╛ред

рдЦреЗрдж рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпрд╣ рдереЛрдбрд╝рд╛ рджреЛрд╣рд░рд╛рд╡рджрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдмреАрдПрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ: https://www.tensorflow.org/versions/r0.9/api_docs/python/nn.html#batch_news

рдХреНрдпрд╛ рдмреАрдПрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ? рдореИрдВ рдЗрд╕ рдкрд░ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдПрд╕рдУ рдкреБрд░рд╛рдирд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдПрдкреАрдЖрдИ рд╕реЗ рдПрдХ рдЕрд▓рдЧ рд▓рд┐рдВрдХ рдореЗрдВ рдПрдХ рдкрд░рдд рд╣реИ, рдмрд╕ рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ? рдПрд╕рдУ рдХреЗ рдпрд╣рд╛рдВ рдЬрд╛рдиреЗ рдпрд╛ рдкреВрдЫрдиреЗ рдкрд░ рдореИрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реВрдВред

рд╕реНрдкреИрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ:

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

рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЯреЗрдВрд╕реЛрдлрд╝реНрд▓реЛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ рдЬреЛ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдлреАрдб рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:

feed_dict = {x: Xminibatch, y_: Yminibatch, phase_train: True}
sess.run(fetches=[merged,train_step], feed_dict=feed_dict)

рдЪреВрдВрдХрд┐ рдЗрд╕рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рдЕрдЧрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧреА, рддреЛ рдореИрдВ рдПрдХ рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдиреЛрдЯрдмрдВрджреА рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЖрд╕рд╛рди рдФрд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдореИрдВрдиреЗ рдЕрднреА рдЙрд╕ рдХреЛрдб рдХреЛ рдкреЗрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)ред

@pawni @ppwwyxx рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреЛ рд░реА рдпреВрдЬрд╝ рдЯреВ рдЯреНрд░реВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдкрдбрд╝рд╛?

@ brando90 рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

def BatchNorm(inputT, is_training=True, scope=None):
    return tf.cond(isTraining,
                lambda: batch_norm(inputT, is_training=True,
                                   center=False, updates_collections=None, scope=scope),
                lambda: batch_norm(inputT, is_training=False,
                                   updates_collections=None, center=False, scope=scope, reuse = True))

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ # 3265 рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛ред рдПрдХ рд╕рдВрджрд░реНрдн рдпрд╣рд╛рдВ рдбреНрд░реЙрдкрдЖрдЙрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/layers/python/layers/layers.py#L433 -L435

рдЬрдм updates_collections = рдлрд┐рд░ рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЕрдкрдбреЗрдЯ рдЗрди-рдкреНрд▓реЗрд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ tf.cond () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рдпрд╣ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП is_training рдПрдХ Tensor рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдЕрдкрдбреЗрдЯ рдореЗрдВ рджреЗрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдЕрдкрдбреЗрдЯреНрд╕ рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдореИрдВ рдЬрд▓реНрдж рд╣реА рдкрд╣рд▓рд╛ рднрд╛рдЧ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

@ brando90 @pawni рд╡рд╣ рдХреЛрдб рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреАрдЪреЗ рдХреА рддрд░рд╣ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛

def BatchNorm(inputT, is_training=True, scope=None):
    # Note: is_training is tf.placeholder(tf.bool) type
    return tf.cond(is_training,  
                lambda: batch_norm(inputT, is_training=True,  
                                   center=False, updates_collections=None, scope=scope),  
                lambda: batch_norm(inputT, is_training=False,  
                                   updates_collections=None, center=False, scope=scope, reuse = True))  

рдФрд░ рдЬрдм рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдпрд╛ рдкрд░реАрдХреНрд╖рдг рд╕рдордп рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,

# when training 
sess.run([opt, loss], feed_dict={x: bx, y: by, is_training=True})  

# when test 
sess.run([opt, loss], feed_dict={x: bx, y: by, is_training=False})  

рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди # 3265 рдХреА рддрд░рд╣, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ tf.contrib.layers.batch_norm is_training рдЪрд░ tf.plcaeholer ред

рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рд▓рд┐рдП @nmhkn @pawni рдзрдиреНрдпрд╡рд╛рджред рд╡реЗ рдореЗрд░реЗ рдХрдирд╡рд▓реНрд╢рди рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдереЗред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИред рдХреЛрдб рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдХреБрдЫ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдПрдХреНрдпреВрд░реЗрд╕реА, рдкрд░реАрдХреНрд╖рдг рд╕рдЯреАрдХрддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореИрдВ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреЛрдб рдХреЗ рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдореБрдЭреЗ "ValueError: Variable conv1 / Beta рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рд╣реИ, рдЕрд╕реНрд╡реАрдХреГрдд рд╣реИред рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдерд╛ Reuse = True in VarScope рд╕реЗрдЯ рдХрд░рдирд╛?" рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рднрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ... рдЬрдм рдореИрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдХреНрдпрд╛ рдХреЛрдИ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди "рдбрд┐рдл рдмреЗрдЯрдЪреЙрд░реНрдо" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЪрд░ рд╕рд╛рдЭрд╛рдХрд░рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣реЛ рд╕рдХреЗред

рдХрд┐рд╕реА рднреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

25 рдЬреБрд▓рд╛рдИ 2016 рдХреЛ рдЕрджреНрдпрддрди:

@nmhkahn @pawni рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХрдВрдЯреНрд░рд┐рдм рдореЗрдВ рдХреЛрдб рдкрд░ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рдереАред рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╣рдо рдпрд╛ рддреЛ рдЪрд╛рд░ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ (рдмреАрдЯрд╛, рдЧрд╛рдорд╛, рдореВрд╡рд┐рдВрдЧ_рдореАрди рдФрд░ рдореВрд╡рд┐рдВрдЧ_рд╡рд░рд┐рдпрди) рдХреЛ рдЕрдкрдбреЗрдЯ рдпрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрди рдЕрджреНрд╡рд┐рддреАрдп рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкреНрд░рддрд┐ рдкрд░рдд рдПрдХ рдЧреБрдВрдЬрд╛рдЗрд╢ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреА рдереАред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛:

conv1 = tf.nn.relu (рдмреИрдЪ_norm_layer (conv2d_stride2_valid (рдбреЗрдЯрд╛, W_conv1) + b_conv1, train_phase, рдЧреБрдВрдЬрд╛рдЗрд╢ = "conv1_"))

рдЬрд╣рд╛рдБ рдмреИрдЪ_ norm_layer @nmhkahn @pawni рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, conv2d_stride2_valid рдПрдХ рд▓реЗрдпрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдбрд┐рдлреЗрдВрд╕ рд╣реИ, рдФрд░ W_conv1 рдФрд░ bconv1 рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╡реЗрдЯ рдФрд░ рдмрд╛рдпрд╕реЗрд╕ рдХреЛ рдкрдХрдбрд╝реЗ рд╣реБрдП рд╣реИрдВред рдореИрдВ рд╢рд╛рдпрдж рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╢рдмреНрдж рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдиреЗрдЯ рдЕрдм рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЛрдб рдореЗрдВ рд╕рдЯреАрдХрддрд╛ рдХреА рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдиреЗ рдХреЗ рдмрд╛рдж рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рдЯреАрдХрддрд╛ рдХреЗ рдмрд╛рдж рдкрд░реАрдХреНрд╖рдг рд╕рдЯреАрдХрддрд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИред рд░реЗрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрдЯ рдореЗрдВ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рд╕реЗрдЯ рдЖрдБрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реБрдЖ рдЬреИрд╕реЗ рдореИрдВ рдЕрдкрдиреЗ рд╢реБрд░реБрдЖрддреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@nmhkn рдпрд╣ рдкрд╛рд╡рдиреА рдХреЗ рд╕реБрдЭрд╛рд╡ рд╕реЗ рдХреИрд╕реЗ рдЕрд▓рдЧ рд╣реИ?

@ brando90 рдореЗрд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рддреНрд░реБрдЯрд┐ рдереА рдЬреЛ nmhkahn рджреНрд╡рд╛рд░рд╛ рддрдп рдХреА рдЧрдИ рдереА ( isTraining рд╕реЗ is_training ) рдмрджрд▓рдирд╛

@diegoAtAlpine рдореБрдЭреЗ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдорд┐рд▓реАрдВ - рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐ рдпрд╣ рдорд╛рдорд▓рд╛ рдХреНрдпреЛрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, ValueError рдХреЛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ nhhkahn рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ?

@nmhkahn @pawni @ рдЬрдм рдЖрдк рдХрд░рддреЗ рд╣реИрдВ:

sess.run([opt, loss], feed_dict={x: bx, y: by, is_training=True})

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ is_training рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд▓реЛрдЧреЛрдВ рдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ рдХрд┐ рд╡реЗ is_training рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд▓реЗрдЬрд╝рд░ рд╣реЛ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рдерд╛:

def batch_norm_layer(x,train_phase,scope_bn):

    bn_train = batch_norm(x, decay=0.999, center=True, scale=True,
    is_training=True,
    reuse=None, # is this right?
    trainable=True,
    scope=scope_bn)
    bn_inference = batch_norm(x, decay=0.999, center=True, scale=True,
    is_training=False,
    reuse=True, # is this right?
    trainable=True,
    scope=scope_bn)
    z = tf.cond(train_phase, lambda: bn_train, lambda: bn_inference)
    return z

рдХреНрдпрд╛ рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ?

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА tf.contrib.layers.batch_norm рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ is_training рдХреЗ рд▓рд┐рдП рдПрдХ Tensor рдпрд╛ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА TF рдХреЙрдиреНрдЯреНрд░рд┐рдм рдореЗрдВ рдорд░реНрдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдм рдЗрд╕рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ
https://github.com/tensorflow/tensorflow/commit/9da5fc8e6425cabd61fc36f0dd1823a093d5c1d#diff -94bbceffec8a5cdef55f705e99c2b2ed2ed2

рдпрд╣ рд╕рд┐рд░реНрдл рдореБрдЭреЗ рд╣реИ рдпрд╛ рдЗрд╕ рдмреАрдПрди рдкрд░рдд рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдПрдХ рдПрдХрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ?

@ brando90 рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЖрдкрдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рдмреИрдЪрдиреЙрд░реНрдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╣реИ), рд▓реЗрдХрд┐рди рд╡реЗ рдпрд╣рд╛рдБ рдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХреБрдбрди рдмреИрдЯрдЪрдиреЙрд░реНрдо рдСрдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ ред

@nmhkahn рддреНрд╡рд░рд┐рдд рдкреНрд░рд╢реНрдиред рдЬрдм рдЖрдкрдиреЗ рд▓рд┐рдЦрд╛ (рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП):

sess.run([opt, loss], feed_dict={x: bx, y: by, is_training=False})

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, bx рдФрд░ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдЕрднреА рднреА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? (рдпрд╛рдиреА рдЯреНрд░реЗрди рдХреА рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)

@ рдмреНрд░рд╛рдВрдбреЛ 90 рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рдЭрдВрдбреЗ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рднреА рднреНрд░рдорд┐рдд рд╣реВрдВред рдореИрдВрдиреЗ CIFAR рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рдж рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб CIFAR рдореЗрдВ рд╕рдВрд░рдЪрд┐рдд рд╣реИ:

  • рдЕрдиреБрдорд╛рди
  • рд╣рд╛рдирд┐
  • рд░реЗрд▓ рдЧрд╛рдбреА

рдФрд░ рдореИрдВ рдЗрд╕реЗ рдорд▓реНрдЯреА-рдЬреАрдкреАрдпреВ рдлреИрд╢рди (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП) рдореЗрдВ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред
рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ (cifar10_multigpu.py рдХреЗ рд╕рдорд╛рди) рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП (cifar10_eval.py рдХреЗ рд╕рдорд╛рди)ред
рдЗрд╕рд▓рд┐рдП

for ii in xrange(2):  # Num of GPU
  with tf.device('/gpu:%d' % ii):
    with tf.name_scope('device_%d' % ii) as scope:

      data_batch, label_batch = factory.GetShuffleBatch(batch_size)

      unnormalized_logits = factory.MyModel(dataBatch=data_batch, numClasses=numClasses,
                                                 isTraining=True)

      More stuff happening
      tf.get_variable_scope().reuse_variables()

рд╕рдорд╛рд░реЛрд╣ MyModel рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред (рдиреАрдЪреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЕрдзрд┐рдХ рдкрд░рддреЛрдВ рдФрд░ рдиреНрдпреВрд░реЙрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)ред

def MyModel(data_batch, num_classes, feature_dim):

  # Hidden Layer 1
  with tf.variable_scope('hidden1') as scope:
    weights = variable_on_cpu('weights',[feature_dim, 256], tf.truncated_normal_initializer(stddev=0.04))
    biases = variable_on_cpu('biases', [256], tf.constant_initializer(0.001))
    hidden1 = tf.nn.relu(tf.matmul(data_batch, weights) + biases, name=scope.name)

  # Hidden Layer 2
  with tf.variable_scope('hidden2') as scope:
    weights = variable_on_cpu('weights',[256, 256], tf.truncated_normal_initializer(stddev=0.04))
    biases = variable_on_cpu('biases', [256], tf.constant_initializer(0.001))
    hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases, name=scope.name)

  # output, unnormalized softmax
  with tf.variable_scope('softmax_unnorm') as scope:

    weights = variable_on_cpu('weights', [256, num_classes], tf.truncated_normal_initializer(stddev=1/num_classes))
    biases = variable_on_cpu('biases', [num_classes], tf.constant_initializer(0.0))
    softmax_un = tf.add(tf.matmul(hidden2, weights), biases, name=scope.name)

  return softmax_un

рдореИрдВ рдмреИрдЪ рдирд╛рдорд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдЬрдм рдореИрдВрдиреЗ рдХрд┐рдпрд╛:

def MyModel(data_batch, num_classes, feature_dim, isTraining):

  with tf.variable_scope('bnormalization') as scope:
    norm_data_batch = tcl.batch_norm(inputs=dataBatch, epsilon=0.0001, is_training=isTraining, 
                                      reuse=True, scope=scope)

  # Hidden Layer 1
  with tf.variable_scope('hidden1') as scope:
    weights = variable_on_cpu('weights',[feature_dim, 256], tf.truncated_normal_initializer(stddev=0.04))
    biases = variable_on_cpu('biases', [256], tf.constant_initializer(0.001))
    hidden1 = tf.nn.relu(tf.matmul(data_batch, weights) + biases, name=scope.name)

рдореБрдЭреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:
рд╡реИрд░рд┐рдПрдмрд▓ bnormalization / рдмреАрдЯрд╛ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ, рдЕрд╕реНрд╡реАрдХреГрддред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреБрди: рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ = рдХреЛрдИ рднреА рд╡рд░рд╕реНрдХреЛрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИ?

рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдореИрдВ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЬреЛ рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рдЙрд╕рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП = рдХреЛрдИ рдирд╣реАрдВред рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рд╕рд╣реА рд▓рдЧрд╛ рд╣реИ? рдпрджрд┐ рдпрд╣ рд╕рдЪ рд╣реИ, рддреЛ рдЬрдм рд╕реЗ рдореИрдВ рджреЛ GPUS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпрд╛ рдореБрдЭреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП = рдкрд╣рд▓реЗ GPU рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ = рджреВрд╕рд░реЗ рдореЗрдВ рд╕рдЪ? рдпрд╛ рдЬрдм рд╕реЗ рдореИрдВ tf.get_variable_scope ()ред Reuse_variables () рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдпрд╣ рд╕реНрд╡рдпрдВ рдХрд╛ рдЦреНрдпрд╛рд▓ рд░рдЦрддрд╛ рд╣реИ?

рдЕрдВрдд рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЪрд░рдг рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ is_training = рдЧрд▓рдд рдФрд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП = рд╕рд╣реА?

рдХреЛрдИ рднреА рдорджрдж рдмрд╣реБрдд рд╣реА рд╕рд░рд╛рд╣рдиреАрдп рд╣реЛрдЧреАред

рдЕрдм tf.contrib.layers.batch_norm рдЯреЗрдВрд╕рд░, рд╡реИрд░рд┐рдПрдмрд▓ рдпрд╛ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЛ рдЖрдЗрд╕рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ

https://github.com/tensorflow/tensorflow/commit/9da5fc8e6425cabd61fc36f0dd1823a093d5c1d#diff -94bbceffec8a5cdef55f705e99c2b2ed2ed2

рдХреНрдпрд╛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ рдХрд┐ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдореЗрд░реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрджрддрд░ рдмрдирд╛рддрд╛ рд╣реИ? рдореИрдВрдиреЗ MNIST рд╢реБрд░реБрдЖрддреА рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдкрд░ рдЖрдзрд╛рд░рд┐рдд 2 рд╕реНрддрд░рд┐рдд NN рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдмреАрдПрди рдореМрдЬреВрдж рд╣реЛрдиреЗ рдкрд░ рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рдЦрд░рд╛рдм рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ: рдмреАрдПрди рдХреЗ рд╕рд╛рде (рдПрдХ рдкреИрдорд╛рдиреЗ рдкрд░ рдФрд░ рдХреЗрдВрджреНрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдФрд░ рджреВрд╕рд░рд╛ рдирд╣реАрдВ) рд╕рдЯреАрдХрддрд╛ 0.8423, 0.8221 рдФрд░ рдмреАрдПрди рд╕рдЯреАрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╣реИред .9477ред

рдореЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╣рд╛рдВ рдореМрдЬреВрдж рд╣реИ https://github.com/brando90/tensor_flow_experiments/blob/master/tf_tutorials/beginner_tutorial_MNIST_BN.py

рдХрд┐рд╕реА рдиреЗ рднреА рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ рдпрд╛ рдмреАрдПрди рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

Tf.contrib.layers.batch_norm рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЕрдм

рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╛ рддреЛ рдЖрдк update_collections рдкрд╛рд╕

рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП tf.contrib.layers рдпрд╛ tf.contrib.slim рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

slim = tf.contrib.slim

def build_NN_two_hidden_layers(x, is_training):
 batch_norm_params = {'is_training': is_training, 'decay': 0.9, 'updates_collections': None}
 with slim.arg_scope([slim.fully_connected], 
    activation_fn=tf.nn.relu,
    weigths_initializer=tf.contrib.layers.xavier_initializer(),
    biases_initializer=tf.constant_initializer(0.1),
    normalizer_fn=slim.batch_norm,
    normalizer_params=batch_norm_params):
   net = slim.fully_connected(x, 50, scope='A1')
   net = slim.fully_connected(net, 49, scope='A2')
   y = slim.fully_connected(net, 10, activation_fn=tf.nn.softmax, normalizer_fn=None, scope='A3')
 return y


@sguada рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдореИрдВ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реВрдВ (tf.cond рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рдФрд░ рдЕрдм рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдЯреАрдХрддрд╛ ~ 95 рддрдХ рдлрд┐рд░ рд╕реЗ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ_рдХреЛрд▓реЗрдХреНрд╢рди рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА? рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рд╕рдордЭрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЗрддрдиреА рдмрдбрд╝реА рд╕рдЯреАрдХрддрд╛ рдХреЛ рдЕрдВрддрд░ рдХреНрдпреЛрдВ рджрд┐рдпрд╛ рдЧрдпрд╛? рдпрд╣ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ (рдХреНрдпрд╛ рдпрд╣ рдХреЛрдИ рднреА рдЗрд╕рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдпрд╣ рдЗрддрдирд╛ рд╣реА рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ?)ред рдзрдиреНрдпрд╡рд╛рдж! :)

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдерд╛ рдФрд░ рдореБрдЭреЗ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдореИрдВрдиреЗ is_training рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рддреЛ рдЙрд╕рдиреЗ рдХрд╣рд╛

TypeError: Using a tf.Tensor as a Python bool is not allowed. Use рдЕрдЧрд░ t рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реИ: instead of рдЕрдЧрд░ to test if a tensor is defined, and use the logical TensorFlow ops to test the value of a tensor. :

рдФрд░ batch_norm рдХреЛрдб рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдзрдиреНрдпрд╡рд╛рдж! :)

@ brando90
рдХреЛрдб рдХрд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣рд╛рдВ L227-256 рд╣реИ ред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд╣рд╛рдБ рдПрдХ with ops.control_dependencies рдмрдпрд╛рди рд╣реИ рдЬреЛ рдЕрдкрдбреЗрдЯ рдХреЛ рдмрд▓ рджреЗрддрд╛ рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдмреЙрдХреНрд╕ рдХреЗ рдареАрдХ рдмрд╛рд╣рд░" рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреЛрдИ рдирд╣реАрдВред

1122 рд╕реЗ рдКрдкрд░ рдХреА рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ tf.get_variable_scope ()ред Reuse_variables () рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдмреИрдЪ_norm рдХрд╛ рддрд░реНрдХ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ variable_op_scope рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИ (рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдкрдврд╝реЗрдВ)

Tf.placeholder рдХреЗ рд╕рд╛рде рдмреИрдЪ_рдиреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ

x = tf.placeholder(tf.float32, [None, 784])
is_training = tf.placeholder(tf.bool, [], name='is_training')
y = build_NN_two_hidden_layers(x, is_training)

# For training
sess.run(y, {is_training: True, x: train_data})

# For eval
sess.run(y, {is_training: False, x: eval_data})

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдХреЗ рдмрд╛рдж moving_mean рдФрд░ moving_variance рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рдереЗ, рдЬрдм updates_collections рдХреЛрдИ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЕрдкрдбреЗрдЯ рдХреЛ рдЧрдгрдирд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬрдм рдХрд┐рд╕реА рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХрдИ рдмреИрдЪ_рдиреЙрд░реНрдо рд▓реЗрдпрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рднреА рдЕрдкрдбреЗрдЯ рдСрдкреНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдпрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

y = build_model_with_batch_norm(x, is_training)
update_ops = tf.group(tf.get_collection(tf.GraphKeys.UPDATE_OPS))

sess.run([y, update_ops])

рдХреНрдпрд╛ рдмреИрдЪ рдорд╛рдирджрдВрдб рдореЗрдВ рддреЗрдЬреА рдХреЗ рд╕рд╛рде рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ?

рдореИрдВ рдСрдЯреЛ-рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ (рд╕рдорддрд▓) MNIST (рдФрд░ relu рдЗрдХрд╛рдЗрдпреЛрдВ) рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде 2 рд╕реНрддрд░рд┐рдд рдШрдиреЗ рдПрдирдПрди рдХреЗ рд╕рд╛рде рдмреИрдЪ рдорд╛рдирджрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ NaN рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд░рд╣реАред рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдмреАрдПрди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрднреА рд╕рдВрднрд╡ рд╣реИ? рдЧрдбрд╝рдмрдбрд╝ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реА рд╢рд┐рдХреНрд╖рд╛ рдХреА рд╕реНрдерд╛рдкрдирд╛, рджрд░ рдЖрджрд┐ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдмреАрдПрди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд░рдЧрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП)

@sguada рдореИрдВ batch_norm рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдзреНрд╡рдЬ updates_collections рд╡рд┐рд╖рдп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБред рдЕрдЧрд░ рдореБрдЭреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛ рдХрд┐ рдЭрдВрдбрд╛ None рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ updates_collections=tf.GraphKeys.UPDATE_OPS рджреЗрдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рдореБрдЭреЗ рд╕рднреА рдмреИрдЪ_рдиреЙрд░реНрдо рдЕрдкрдбреЗрдЯ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрдк update_ops = tf.group(tf.get_collection(tf.GraphKeys.UPDATE_OPS)) _

рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбрд▓ рд╣реИрдВ рдЬреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреИрдЪ_рдирд░реНрдо рдкрд░рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд╣реА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ?:

#model 1
y1 = build_model_with_batch_norm(x, is_training)
update_ops1 = tf.group(tf.get_collection(tf.GraphKeys.UPDATE_OPS))
sess.run([y1, update_ops1])
#model 2
y2 = build_model_with_batch_norm(x, is_training)
update_ops2 = tf.group(tf.get_collection(tf.GraphKeys.UPDATE_OPS))
sess.run([y2, update_ops2])

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ? рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдмрд╕ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЧреНрд░рд╣-рдХреБрдВрдЬрд┐рдпреЛрдВ рдореЗрдВ рд░рдЦреЗрдВ:

# While building your 1st model...
tf.contrib.layers.batch_norm(..., updates_collection="updates-model1")

# same for 2nd model with key "updates-model2"
#model 1
y1 = build_model_with_batch_norm(x, is_training)
update_ops1 = tf.group(tf.get_collection("updates-model1"))
sess.run([y1, update_ops1])
#model 2
y2 = build_model_with_batch_norm(x, is_training)
update_ops2 = tf.group(tf.get_collection("updates-model1"))
sess.run([y2, update_ops2])

рдлрд┐рд░ рднреА, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реАрдо рдЖрдЙрдЯ-рдбреЗрдЯреЗрдб рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
if update_ops:
    updates = tf.group(update_ops)
    total_loss = control_flow_ops.with_dependencies([updates], total_loss)

рдкрд░рдВрддреБ:

  • _tf.group () _ рдХрд┐рд╕реА рд╕реВрдЪреА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ _tf.tuple () _ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛
  • рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ _control_flow_ops.with_d dependencies () _ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдореИрдВрдиреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рд┐рд░реНрдл tf.with_d dependecies () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ Tensorflow 0.10 рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореБрдЭреЗ рдпрд╣ рдпрд╣рд╛рдБ рдорд┐рд▓рд╛: _tf.python.control_flow_ops.with_d dependencies () _

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рддрд░рд╣:

from tensorflow.python import control_flow_ops

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
if update_ops:
    updates = tf.tuple(update_ops)
    total_loss = control_flow_ops.with_dependencies(updates, total_loss)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ 2:

рдЕрдкрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдХреБрдЫ рд░рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП _tf.GraphKeys.UPDATE_OPS_ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд _updates_collections = none_ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХреЛрдИ рднреА рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддрд╛ ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреИрдЪ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде (рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореЗрд░рд╛ _tf.get_collection (tf.GraphKeys.UPDATE_OPS) _ 140 рдЕрдкрдбреЗрдЯ-рдСрдкреНрд╕ рджреЗрддрд╛ рд╣реИ, рдпреЗ рд╕рднреА рдХреЗрд╡рд▓ рдмреАрдПрди-рдСрдкреНрд╕ рд╣реИрдВ)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЕрдЧрд░ рдореЗрд░реЗ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬреА рд╕реЗ 1.5x рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдмреАрдкреА-рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдХреА рдЧрдгрдирд╛ рд╕реАрдкреАрдпреВ рдкрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдм рддрдХ рдЬреАрдкреАрдпреВ рдирд╣реАрдВред

рдХреНрдпрд╛ рдЖрдк рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ? рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ :)

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЗ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реБрдП, рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдмреИрдЪ рдорд╛рдирджрдВрдб GPU рдЙрдкрдпреЛрдЧ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд▓рдЧ рд╣реИ? рдХрд┐рд╕реА рдХреЛ рднреА рдЗрд╕ рдмреИрдЪ рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде GPUs рд╕реЗ рд▓рд╛рдн рдХрд╛ рдЕрдиреБрднрд╡ рд╣реБрдЖ рд╣реИ?

рдЖрдк рдЕрдкрдиреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
https://github.com/tensorflow/tensorflow/blob/4addf4b5806cd731949c6582a83f5824599cd1ef/tensorflow/python/ops/batch_norm_benchmark.py

рд╕реНрдкреИрдо рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд▓реЗрдЦрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдмреАрдПрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ (рд╢рд╛рдпрдж рдХрд╣реАрдВ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?)ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░рддрд┐ рдлреАрдЪрд░ (рд╕рдХреНрд░рд┐рдпрдг рдХреЗ рдмрдЬрд╛рдп) рдкреНрд░рддрд┐ рд╕рдорд╛рди рдкреИрд░рд╛рдореАрдЯрд░ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?

(рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ?)

рд╕реНрд▓рд┐рдо рдмреИрдЪ_рдиреЙрд░реНрдо рд░реИрдкрд░ рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЗ рдЕрдВрддрд┐рдо рдЖрдпрд╛рдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИред рддреЛ рдЕрдЧрд░ рдпрд╣ рдПрдХ 2 рдбреА рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдкрд░рдд рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдмреИрдЪ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдкреНрд░рддрд┐-рд╕рдХреНрд░рд┐рдпрдг рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ 4D рдЯреЗрдВрд╕рд░ рд╣реИ рдЬреЛ рдПрдХ рдХрдирд╡рд▓реНрд╢рди рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рддреАрди рдкрд╣рд▓реЗ рдЖрдпрд╛рдореЛрдВ (рдмреИрдЪ, рдЪреМрдбрд╝рд╛рдИ, рдЧрд╣рд░рд╛рдИ) рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддрд┐-рд╕реБрд╡рд┐рдзрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░реЗрдЧрд╛ред @sguada рд╢рд╛рдпрдж рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реЛ рд░рд╣рд╛ рд╣реИред

@nmhkn рдЖрдкрдХреЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдХреНрдпрд╛ рдореИрдВ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ reuse None is_training=True None рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпрд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдкреИрд░рд╛рдореАрдЯрд░ gamma рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдСрдлрд╝рд╕реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ beta рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдореВрд▓ рдкреЗрдкрд░ рдореЗрдВ, beta рдФрд░ gamma "рдореВрд▓ рдореЙрдбрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реАрдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ"ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдлрд┐рд░ рд╕рднреА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдгреЛрдВ рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

tf.cond(is_training, lambda: batch_norm(inputT, is_training=True, updates_collections=None, scope=scope), lambda: batch_norm(inputT, is_training=False, updates_collections=None, scope=scope, reuse = True))

рдореИрдВ рдЙрд╕ рдХрд╛рдо рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ TF_ рдЯреАрдо рдиреЗ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рддрд╛рдХрд┐ рдмреИрдЪ_рдиреЙрд░реНрдо рдЙрдкрд▓рдмреНрдз рдФрд░ рдкреНрд░рднрд╛рд╡реА рд╣реЛ рд╕рдХреЗред рдореЗрд░реА рдЦреЛрдЬ рд╕реЗ, рдпрд╣ рдзрд╛рдЧрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИред рдпрд╣рд╛рдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЙрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдмреИрдЪ_рдиреЙрд░реНрдо рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдорд╛рдирдХ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд╕рдореНрдорддрд┐ рдХреА рд╕рд▓рд╛рд╣ рд▓реЗрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдЯреАрдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдореВрд▓реНрдп рд╣реЛрдЧрд╛ред

рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдореЗрд░рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ рдХрд┐ рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ рд▓рд╛рдпрд╛ рдЧрдпрд╛:

is_training_ph = tf.placeholder(tf.bool)
...
with tf.variable_scope('bn_test_layer') as vs:
    layer_output = tf.cond(is_training_ph,
        lambda: tf.contrib.layers.batch_norm(layer_input, is_training=True, center=True, scale=True, activation_fn=tf.nn.relu, updates_collections=None, scope=vs),
        lambda: tf.contrib.layers.batch_norm(layer_input, is_training=False, center=True, scale=True, activation_fn=tf.nn.relu, updates_collections=None, scope=vs, reuse=True))

рдлрд┐рд░ рдореИрдВрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП True_phraining_ph рдХреЛ рд╕рд╣реА рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореЙрдбрд▓ рдареАрдХ-рдард╛рдХ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБрдд рд╣реА рднрдпрд╛рдирдХ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЕрдЧрд░ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП is_training_ph = True рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХ рд╕реНрдХреЛрдк рдЗрд╢реНрдпреВ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдЙрдЪрд┐рдд рдореМрдЬреВрджрд╛ рд╡реИрд░рд┐рдПрдмрд▓ рдирд╣реАрдВ рдвреВрдВрдв рдкрд╛ рд░рд╣рд╛ рд╣реИред

@ davek44 рдореИрдВ рдЙрд╕реА рдХреЛрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдореИрдВрдиреЗ рдПрдХ рд╣реА рдЪреАрдЬ рджреЗрдЦреА рд╣реИ: рдЬрдм рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди is_training=True рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдФрд░ / рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рдХреЗ рд▓рд┐рдП is_training=False рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдореЙрдбрд▓ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдХрд╛рдЧрдЬ рдХреА рддрд░рд╣ рдЧрд╛рдбрд╝рд┐рдпреЛрдВ (рдореЙрдбрд▓ рддреЗрдЬреА рд╕реЗ рдзрд░реНрдорд╛рдиреНрддрд░рд┐рдд рдФрд░ рдореИрдВ рдПрдХ рдмрдбрд╝реА рд╕реАрдЦрдиреЗ рдХреА рджрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рднрдпрд╛рдирдХ рд╣реИред рдЕрдЧрд░ рдореИрдВ рд╣рд░ рд╕рдордп is_training=True рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЙрдбрд▓ рдмреИрдЪ рдорд╛рдирджрдВрдб рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЙрд╕реА рддрд░рд╣ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдЯреЗрдиреНрд╕рд░рдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░рдг рдХрд╛ рдирд┐рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдЖрдк рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ?

tf.contrib.layers.batch_norm рдЯреЗрдВрд╕рд░ рдХреЛ is_training рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

is_training_ph = tf.placeholder(tf.bool)

outputs = tf.contrib.layers.batch_norm(layer_input, is_training=is_training_ph, center=True, scale=True, activation_fn=tf.nn.relu, updates_collections=None, scope='batch_norm'),

рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрд╕реА рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВред

рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдмрд┐рдирд╛ рдЬрд╛рдирдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдореЗрд░рд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдХреБрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореВрд╡рд┐рдВрдЧ_рдореИрдВрди рдФрд░ рдореВрд╡рд┐рдВрдЧ_рдСрд╡рд░ рдЕрднреА рддрдХ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВред

рдЬрдм рдЖрдк рдЕрдкрдиреЗ рдмреИрдЪ рдХреЛ рдЫреЛрдЯрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдХрдо рд╣реЛрддрд╛ рд╣реИ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдмреИрдЪ_рд╕рд╛рдЗрдЬрд╝ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрд╕реА рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВред

рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ tf.slim batchnorm рдХреЗ рд╕рд╛рде рдпрд╛ tf.cond рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА рдФрд░ рдЗрдирдкреБрдЯ is_training рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВред
рдкреВрд░реНрд╡ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреА рдЬрд╛рдВрдЪ рдХреА рдЧрдИ, рддреЛ рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЧрддрд┐рдорд╛рди рдФрд░ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдЪрд░рдг рдореЗрдВ рд╕рднреА рд╢реВрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪрд▓ рд░рд╣рд╛ рдорддрд▓рдм рдФрд░ рднрд┐рдиреНрдирддрд╛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд (рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде) рджрд┐рдЦрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд╕рдордп рдореЗрдВ is_training = рдЧрд▓рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдкреНрд░рджрд░реНрд╢рди рднреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рд╣реИред Is_training = True рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╣ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдмреИрдЪ рдХреЗ рдЕрдВрджрд░ рдХреЗрд╡рд▓ рдЪрд▓рддреА рдореАрди рдФрд░ рд╡рд┐рдЪрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

@nmduc @ davek44 рдореИрдВрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди tf.contrib.layers.batch_norm рдореЗрдВ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдореВрд╡рд┐рдВрдЧ рдФрд░ рдореВрд╡рд┐рдВрдЧ рд╡рд┐рдЪрд░рдг рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХреЛрдб рд▓рд┐рдЦреЗред рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ decay рдХрд╛ рдореВрд▓реНрдп рдмрд╣реБрдд рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ (рд╡реЗ рдЪрд▓рддреА рдФрд╕рдд рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрд╛рддреАрдп рдХреНрд╖рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдФрд░ decay 1.0 рдХреЗ рд╕рд╛рде decay=.999 ), 0. рдХреЗ рдХрд░реАрдм рдПрдХ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдорддрд▓рдм рдмреВрдБрджреЗрдВ рдЪрд▓рддреА рдореИрдВ рдареАрдХ рдЙрд╕реА рдХреЛрдб рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╕реЗ 2 рдкрд░реАрдХреНрд╖рдг рд░рди рдХрд┐рдпрд╛ decay рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ tf.contrib.layers.batch_norm , рдФрд░ рдореЗрд░реА рдорд╛рдиреНрдпрддрд╛ / рдкрд░реАрдХреНрд╖рдг рд╕рддреНрдпрддрд╛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд▓рдЧ рд░рд╣рд╛ рдерд╛ред

рдкрд░реАрдХреНрд╖рдг рд░рди decay=0.9 рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ
screen shot 2016-11-16 at 1 51 51 pm

decay=0.999 ( decay=0.999 рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо tf.contrib.layers.batch_norm рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рд╣реИ)
screen shot 2016-11-16 at 2 03 58 pm

(рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдмрдбрд╝реЗ рдХреНрд╖рдп рдореВрд▓реНрдп рдХреЛ рд╕рддреНрдпрд╛рдкрди рд╕рдЯреАрдХрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА)

рд╣рд╛рдБ, рдпрд╣ рддрдп рд╣реИред рдЕрдкрдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг @zhongyuk рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреНрд╖рдп = 0.9 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ 0.99 рдореЗрд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдорд╢рд╛рд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдп рд╣реИ; https://github.com/torch/nn/blob/master/BatchNormalization.lua рдореЗрдВ рдЧрддрд┐ рдкреИрд░рд╛рдореАрдЯрд░

@zhongyuk рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдм рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИред @sguada рдХреЛ рд╣рдореЗрдВ 1.0 рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд╕рд╣реА рддрд░реАрдХреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдореЗрдВ, рдХреНрдпрд╛ рдЗрдЪреНрдЫреБрдХ рдкрд╛рд░реНрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореБрдЭреЗ рдПрдХ рдкреАрдЖрд░ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рддрдереНрдп рдХреЛ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЦрд░рд╛рдм рдирд┐рдХрд╛рд╕реА рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рдиреЗ рдкрд░ decay рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ? рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрднреА рднреА рдЙрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдореЛрдбрд╝рдирд╛ рдирд╣реАрдВ рдкрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рддрд░рд┐рдд рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рдПрдХ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ 0.9 рдпрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЫреЛрдЯреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдпрд╛ рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рдкреНрд░рднрд╛рд╡ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХреЗред
рд╣рдорд╛рд░реА рд╡рд┐рддрд░рд┐рдд рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ @vincentvanhoucke рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рд▓рд╛рдЦреЛрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдареАрдХ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣рд╛рдВ рдЬреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реИрдХрдбрд╝реЛрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдХрд░рддрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреНрд╖рдп = 0.999 рдореЗрдВ 1000 рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж 0.36 рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ 10000 рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж 0.000045 рдФрд░ 50000 рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж 0.0 рд░рд╣ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╕ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЫреЛрдЯреЗ рдмреИрдЪ рдЖрдХрд╛рд░реЛрдВ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ 200 рдХреЗ рдмрдЬрд╛рдп 10 рд╕реЗ рдЫреЛрдЯреЗ рдХреБрдЫ рднреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕рдЯреАрдХрддрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг / рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдореЛрдб рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП tf.placeholder рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкрд░рдд рдмреЗрд╣рддрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЕрднрд┐рд╕рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдореЙрдбрд▓ рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдХреНрдпрд╛ рдХреЛрдИ рднреА рдЗрд╕ рдмреИрдЪ рдорд╛рдирдХ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫреЛрдЯреЗ рдпрд╛ рдПрдХрд▓ рдбреЗрдЯрд╛ рдирдореВрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреЗ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдореИрдВ рдпрд╣ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ is_training рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдЕрдЪреНрдЫрд╛ рд╣реИ = рдЫреЛрдЯреЗ рдмреИрдЪреЛрдВ рдХреЗ рд╕рд╛рде рдЧрд▓рдд рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмреИрдЪ_рд╕рд╛рдЗрдЬ = 1 рдХреЗ рд╕рд╛рде, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмреИрдЪ рд╕реЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕реАрдЦрд╛ рд╣реБрдЖ рдЖрдБрдХрдбрд╝рд╛ рд╣реИред рдмрд╕ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдБрдХрдбрд╝реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд╖рдп = 0.999 рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдП рд╣реИрдВ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо 50k рдЕрдкрдбреЗрдЯ рдХрд╛ рдЕрд░реНрде рд╣реИред

рдЯреАрдПрдл рдбреЗрд╡рд▓рдкрд░ рдХреА рдкреБрд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рде рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ decay рд╕реЗрдЯрд┐рдВрдЧреНрд╕ (рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдмреИрдЪ_рд╕рд╛рдЗрдЬрд╝ = 1) рдХреЗ рд╕рд╛рде рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рдЕрднрд┐рд╕рд░рдг рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реВрдВред decay=0.99 , рдЖрдВрдХрдбрд╝реЗ рд╕реАрдЦрдиреЗ (рдЕрдкрдбреЗрдЯ) рдХреЗ 550 ~ 600 рдЪрд░рдгреЛрдВ рдХреЗ рдмрд╛рдж (рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ <0.001) рдЬреБрдЯрддреЗ рд╣реИрдВред decay=0.9 , рдЖрдВрдХрдбрд╝реЗ рд╕реАрдЦрдиреЗ (рдЕрдкрдбреЗрдЯ) / рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ 100 рдЪрд░рдгреЛрдВ рдХреЗ рднреАрддрд░ (biase <0.001) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

@sguada рдзрдиреНрдпрд╡рд╛рдж, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЖрдЙрдЯрдкреБрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреИрдЪ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреА рд╕рдЯреАрдХрддрд╛ рдкрд░ рдмрдбрд╝реЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреА рдореЗрд░реА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рдереЛрдбрд╝реЗ рдмрджрд▓рд╛рд╡ рд╕реЗ рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ)ред рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ 128 рдЖрдпрд╛рдореА рдЖрдЙрдЯрдкреБрдЯ рдЯреЗрдВрд╕рд░ рдореЗрдВ рд╕рднреА рдореВрд▓реНрдп рдРрд╕реЗ рдмрдврд╝ рдЬрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрд▓ рд╡реЗрдХреНрдЯрд░ рд▓рдВрдмрд╛рдИ рдмреИрдЪ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдкреНрд░рддрд┐ рдореВрд▓реНрдп рдпрд╣ рдПрдХ рдЕрдВрддрд░ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрд╡реНрдпрдХреНрдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝рддрд╛ рд╣реИред

@zhongyuk рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ decay=0.9 рд╕рд╛рде рд▓рдЧрднрдЧ 5k рдЕрдкрдбреЗрдЯ рдЪрд▓рд╛рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрдбрд╝реЗ рдмреИрдЪ рдЖрдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рднреА рдерд╛, рддреЛ рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╣реЛрдЧрд╛? рдореИрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдЕрдЧрд░ рдпрд╣ рдЕрднрд┐рд╕рд┐рдВрдЪрд┐рдд рдирд╣реАрдВ рдерд╛, рд╣реИ рдирд╛?

рдореИрдВ рдХреБрдЫ рдФрд░ рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдкрд░ рдкреБрди: рдкреЗрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдм рддрдХ рддреНрд╡рд░рд┐рдд рдлрд╝реАрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@dominikandreas рдпрджрд┐ рдЖрдкрдХрд╛ рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдЕрднрд┐рд╕рд░рдг рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрдереЛрдЪрд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рд▓реЗрдХрд┐рди рдЦрд░рд╛рдм рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗрд╡рд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдмреИрдЪ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд░реАрдХреНрд╖рдг рд╕рдордп рдХреЗ рджреМрд░рд╛рди, рдпрд╣ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдмреИрдЪреЛрдВ рдХреЗ рдореВрд╡рд┐рдВрдЧ рдФрд╕рдд рдЖрдБрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ рдорд┐рд▓рд╛ рдФрд░ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐, рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЕрдм рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ :-) рдЖрдкрдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рд╣рд╛рдп @zhongyuk , рдЖрдк рдХреИрд╕реЗ рдЪрд▓рддреА рдФрд╕рдд рдФрд░ рд╡рд┐рдЪрд░рдг рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрддреЗ рдереЗ?
рдзрдиреНрдпрд╡рд╛рдж!

@rogertrullo рдЖрдо рддреМрд░ рдкрд░ рдореИрдВ рдЪрд▓рддреА рдореАрди рдФрд░ рд╡рд┐рдЪрд░рдг рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП TensorBoard рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рдкрд░ рдирдЬрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рджреМрд░рд╛рди tf.get_variable("moving_mean") рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрдВрдХрдбрд╝реЗ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред

рдирдорд╕реНрддреЗ,
рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдЪреНрдЫреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ рд▓реЗрдХрд┐рди рдмреИрдЪ_рдиреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рддреНрдпрд╛рдкрди / рдкрд░реАрдХреНрд╖рдг рдЦрд░рд╛рдм рд╣реИред
рдореИрдВ рдЗрд╕ рддрд░рд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
conv_normed1 = tf.contrib.layers.batch_norm (conv1 + block1_layer3_1_biases, updates_collections = рдХреЛрдИ рдирд╣реАрдВ, рдкреИрдорд╛рдирд╛ = рд╕рддреНрдп, рдХреНрд╖рдп = рдмреИрдЪ_рдиреЙрд░реНрдорд▓_рд╕реЗ, рдХреЗрдВрджреНрд░ = рд╕рддреНрдп, is_training = is_training)
рдХреНрд╖рдп рдорд╛рди 0.9 рд╣реИ
рдХреНрдпрд╛ рдореБрдЭреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?
рдореИрдВ рдХрд┐рд╕реА рднреА рдорджрдж рдХреЗ рд▓рд┐рдП рдЦреБрд╢реА рд╣реЛрдЧреАред

рдореИрдВ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╡рд░реНрдгрд┐рдд (рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ tf.bool; рдФрд░ ops.GraphKeys.UPDATE_OPS рдХреЗ рд╕рд╛рде) рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЬрдм рдмрдЪрдд рдФрд░ рдЙрдкрдпреЛрдЧ рдмрд╣рд╛рд▓:
рд╕реЗрд╡рд░ = tf.train.Saver ()
рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВ,

рд▓реЗрдХрд┐рди рдЬрдм рдмрдЪрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
рд╕реЗрд╡рд░ = tf.train.Saver (tf.trainable_variables () + [global_step))
рддрд╛рдХрд┐ рдореИрдВ рд╕реНрдЯреЛрд░реЗрдЬ рд╕реНрдкреЗрд╕ (рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЖрджрд┐ рдХреЛ рд╕реЗрд╡ рдХрд░рдХреЗ) рдХреЛ рдмрдЪрд╛ рд╕рдХреВрдВ
рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реИ:
"uninitialized рдорд╛рди unpool4 / convc / bn / move_mean"

рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореВрд╡рд┐рдВрдЧ_рдореИрдВрди (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд╡рд┐рдВрдЧ_рд╡рд░рд┐рдпрди) рдХрд┐рд╕реА рднреА рд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рд╣реИрдВ (рдХрдИ рдкрд░рддреЛрдВ рдореЗрдВ рдиреЗрд╕реНрдЯреЗрдб) тАЛтАЛ- рдЙрдиреНрд╣реЗрдВ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реИ? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпреЗ рдЯреНрд░реЗрди рдпреЛрдЧреНрдп рдЪрд░ рд╣реИрдВ, рдХреНрдпреЛрдВ рдЗрдиреНрд╣реЗрдВ trainable_variables рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ?

@mshunshin рдореВрд╡рд┐рдВрдЧ рдорд╛рдзреНрдп рдФрд░ рд╡рд┐рдЪрд░рдг, рдЯреНрд░реЗрди рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЪрд░ рдирд╣реАрдВ рд╣реИрдВ: рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЛрдИ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдирд╣реАрдВ рдЖ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдорд┐рдиреАрдмреИрдЪ рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдВрдХрдбрд╝реЗ рдЬрдорд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЙрдиреНрд╣реЗрдВ рдмрдЪрд╛рдиреЗ / рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк tf.global_variables () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рддреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛:
def batch_norm_wrapper(x, phase, decay, scope, reuse): with tf.variable_scope(scope, reuse=reuse): normed = tf.contrib.layers.batch_norm(x, center=True, scale=True, decay=decay, is_training=phase, scope='bn',updates_collections=None, reuse=reuse) return normed
рд╕реНрдХреИрдкреНрд╕ рдФрд░ рд░реАрдпреВрдЬрд╝ рдХрд╛ рдкреВрд░рд╛ рдЙрдкрдпреЛрдЧ рдореЗрд░реА рд░рд╛рдп рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред Tf.global_variables () рдХреЗ рд╕рд╛рде рд╕реЗрд╡ рдлрд╛рдЗрд▓реЗрдВ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯреНрд╕ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ; рдЕрдВрдд рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:

рд╕реЗрд╡рд░ = tf.train.Saver ([x рдХреЗ рд▓рд┐рдП x рдореЗрдВ tf.global_variables () рдпрджрд┐ 'рдПрдбрдо' x.name рдореЗрдВ рдирд╣реАрдВ рд╣реИ))

рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рд╕рддреНрд░ рдкреНрд░рдмрдВрдзрдХ init рдЙрдиреНрд╣реЗрдВ рдареАрдХ рд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

sess.run (tf.variables_initializer ([x рдХреЗ рд▓рд┐рдП x рдореЗрдВ tf.global_variables () рдЕрдЧрд░ 'Adam' рдореЗрдВ x.name])

(Tf.train.AdamOptimizer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)

рдЖрдк tf.model_variables () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдореЙрдбрд▓ рдХреЗ рдЪрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдореВрд╡рд┐рдВрдЧ_рдореИрдВ

@sguada рдЖрдкрдХреЛ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕реНрд▓рд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред batch_norm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред

рдореИрдВ slim.batch_norm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЦрд░рд╛рдм рд╕рддреНрдпрд╛рдкрди / рдкрд░реАрдХреНрд╖рдг рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ reuse рдпрд╛ scope рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмреИрдЪ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рдХрдИ рдореБрджреНрджреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдкреВрд░реНрдг рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд▓рдЧрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдХрд╣рддреЗ рд╣реИрдВ, рдореЗрд░реЗ mnist_bn рдХреЛрдб рдореЗрдВ, рдореИрдВрдиреЗ tf.GraphKeys.UPDATE_OPS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдФрд░ is_training рдХреЛ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ред рдпрджрд┐ рдореИрдВ {is_training: False} рдлрд╝реАрдб рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрднреА рднреА рдЦрд░рд╛рдм рд╣реИред

рдпрджрд┐ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░реА рдФрд░ рдкреВрд░реНрдг (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреНрд░рд╢рд┐рдХреНрд╖рдг, рд╕рддреНрдпрд╛рдкрди, рдкрд░реАрдХреНрд╖рдг рд╕рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ) рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рд╣реИ рддреЛ рдореИрдВ рдЗрд╕рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдВрдЧрд╛ред

рдЖрдкрдХрд╛ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рд╣реА рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдирдорд╕реНрддреЗ,
рдЖрдкрдХреЛ рд╣рд░ рдмрд╛рд░ рдмреИрдЪ рдорд╛рдирджрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдВрдЬрд╛рдЗрд╢ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг / рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг (рдЬрдм рдЯреНрд░реЗрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг FALSE рдЬрдм рдЯреНрд░реЗрди) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреБрди: рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@ishaybee рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓ рдЧрдИ рд╣реИ = = рдпрд╣ рдЪрд▓рддреА рдардВрдб рдХреА рд╡рдЬрд╣ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ рдкрд░реНрдпрд╛рдкреНрдд рдХрджрдо рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдиреБрдорд╛рдирд┐рдд рдЧрддрд┐рдорд╛рди / рд╡рд┐рдЪрд░рдг рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдпрд╣ рдирд┐рдХрд▓рддрд╛ рд╣реИ: рдореЙрдбрд▓ рдорд┐рдиреА-рдмреИрдЪреЛрдВ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ (рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдиреБрдХрд╕рд╛рди рдЬрд▓реНрджреА рд╕реЗ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЕрдирд┐рдпрдорд┐рдд рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреБрдорд╛рдирд┐рдд рдЬрдирд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдорддрд▓рдм / рд╡рд┐рдЪрд░рдг рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ)ред

рдЬрдм рдореИрдВрдиреЗ рдореЙрдбрд▓ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛, рддреЛ рд╕рддреНрдпрд╛рдкрди рд╕рдЯреАрдХрддрд╛ рднреА рд╕реБрдВрджрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЯреНрд░реЗрди рдСрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП slim.learning.create_train_op рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ ред Tf рджреЗрд╢реА tf.train.GradientDescentOptimizer(0.1).minimize(loss) рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред

рддреЛ рдЬрд╡рд╛рдм рд╣реИ, рдореИрдВ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд╛ рд╕рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЗрд╕рдХреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рд╕рдордЭрд╛ рд╣реИред

================
рдЗрд╕рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдФрд░ рдХреНрдпрд╛:

  1. рдпрд╣рд╛рдБ рдПрдХ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ MNIST рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ BN рд▓реЗрдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
  2. рдПрдХ рдЫреЛрдЯреЗ рдХреНрд╖рдп рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд╡рд╛рд░реНрдо-рдЕрдк рдЪрд░рдг рдореЗрдВ рддреЗрдЬреА рд▓рд╛рдПрдЧрд╛ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд╖рдп 0.999 рд╣реИ, рдПрдордПрдирдЖрдИрдПрд╕рдЯреА рдЬреИрд╕реЗ рдЫреЛрдЯреЗ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдк 0.99 рдпрд╛ 0.95 рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдереЛрдбрд╝реЗ рд╕рдордп рдореЗрдВ рдЧрд░реНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

@soloice , рдиреЛрдЯрд┐рд╕, рдХреИрд╕реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рдмреИрдЪ рдХреЗ рд▓рд┐рдП рдкрд░рдд рдХреЗ рдЕрдВрджрд░ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ_рдиреЙрд░реНрдо:

рдмреИрдЪ_рдиреЙрд░реНрдо_рдкрд░рдореНрд╕ = {'is_training': is_training, 'decay': 0.9, 'updates_collections': рдХреЛрдИ рдирд╣реАрдВ}

updates_collections рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП рдорд╛рдзреНрдп рдЕрдкрдбреЗрдЯ BatchNorm рдХреЗ рдЕрдВрджрд░ рдЬрдЧрд╣ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ tf.GraphKeys.UPDATE_OPS рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рдкрд╛рд╕ рдХреА рдкрд░рдд (рдЬреИрд╕реЗ conv2d) рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рд░рдирд┐рдВрдЧ рдорд╛рдзреНрдп рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП BatchNorm рд▓реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛред рдЗрд╕рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдкрд░ рдЪрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред

рдпрд╛ рдЖрдк рд╕реНрд╡рдпрдВ рдХреЛ рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ UPDATE_OPS рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ

    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    if update_ops:
        updates = tf.group(*update_ops)
        cross_entropy = control_flow_ops.with_dependencies([updates], cross_entropy)

рдЕрдкрдбреЗрдЯ - рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЖрдк UPDATE_OPS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

"рдХреЛрд▓реНрдб рд╕реНрдЯрд╛рд░реНрдЯ" рдХреЗ рд░реВрдк рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдШрдЯрддреЗ рд╣реБрдП рдмреИрдЪрдиреЙрд░реНрдо рд░рдирд┐рдВрдЧ рдХрд╛ рдФрд╕рдд рдХреНрд╖рдп (рдЗрдирдкреБрдЯ рдкрд░рдо) рдбрд┐рдлрд╝реЙрд▓реНрдЯ 0.999 рд╕реЗ 0.95 рддрдХ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@pavelbulanov рдпрд╣ рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╣реИ! рдореИрдВ decay рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдореВрд▓реНрдп рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдБ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИред

================
рдЕрдкрдбреЗрдЯ: рдПрдХ рдЫреЛрдЯреЗ рдХреНрд╖рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдХрд╣рддреЗ рд╣реИрдВ, 0.9 рдпрд╛ 0.95) рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореИрдВ decay 0.9 рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╕рддреНрдпрд╛рдкрди рд╣рд╛рдирд┐ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдиреАрдЪреЗ рдЬрд╛рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЫреЛрдЯреЗ рдХреНрд╖рдп рдХрд╛ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдкреНрд░рднрд╛рд╡реА рд╕реАрдорд╛ рдЫреЛрдЯреА рд╣реИ: рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рд╣рд╛рд▓рд┐рдпрд╛ рдирдореВрдиреЛрдВ рдХрд╛ рдкреНрд░рднреБрддреНрд╡ рд╣реИ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдЬрдирд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдзреНрдп / рд╡рд┐рдЪрд░рдг рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд╣реИред рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд (рдЫреЛрдЯреЗ рдХреНрд╖рдп) рдФрд░ рдПрдХ рд▓рдВрдмреА рдкреНрд░рднрд╛рд╡реА рд╕реАрдорд╛ (рдмрдбрд╝реЗ рдХреНрд╖рдп) рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдирдорд╕реНрддреЗ,
рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреА рдорджрдж рд╕реЗ рдПрдХ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкрд░рдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕рддреНрдпрд╛рдкрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ 70% рддреНрд░реБрдЯрд┐ рд╣реИ ... рдореЗрд░реЗ рдкрд╛рд╕ рдЧреИрд░-рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдХрдо рдХреНрд╖рдп рд╣реИ ...

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

def BatchNorm(inputT, is_training=False, scope=None):
  return tf.cond(
    is_training,
    lambda: tf.contrib.layers.batch_norm(inputT, is_training=True,  reuse=None, decay=0.999, epsilon=1e-5, center=True, scale=True, updates_collections=None, scope=scope),
    lambda: tf.contrib.layers.batch_norm(inputT, is_training=False, reuse=True, decay=0.900, epsilon=1e-5, center=True, scale=True, updates_collections=None, scope=scope)
    )

рдкрд╣рд▓реЗ рд╣реА, рдЖрдкрдХрд╛ рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

@Alexivia рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкрд░рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмреАрдПрди рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЕрд▓рдЧ-рдЕрд▓рдЧ is_training рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде)ред

рдЖрдкрдХреА рд╕рд▓рд╛рд╣ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @soloiceред
рдореИрдВрдиреЗ рдЕрдм рдХреЗрд╡рд▓ is_training рдФрд░ reuse рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛:

lambda: tf.contrib.layers.batch_norm(inputT, is_training=True,  reuse=None, decay=0.9, epsilon=1e-5, center=True, scale=True, updates_collections=None, scope=scope),
lambda: tf.contrib.layers.batch_norm(inputT, is_training=False, reuse=True, decay=0.9, epsilon=1e-5, center=True, scale=True, updates_collections=None, scope=scope)

рдЕрднреА рднреА рдЕрдЪреНрдЫреА рдорд╛рдиреНрдпрддрд╛ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓реЗ ...> 70% ...

рдирдорд╕реНрддреЗ,
рдХреГрдкрдпрд╛ рдореЗрд░рд╛ рд░реИрдкрд░ рдКрдкрд░ рджреЗрдЦреЗрдВред
рдЖрдкрдХреЛ "tf.variable_scope (рд╕реНрдХреЛрдк, рд░реАрдпреВрдЬ = рдкреБрдирдГ рдЙрдкрдпреЛрдЧ) рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:" рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред

рд╣рд╛рдп @ рд░рд┐рд╢рд╛рдп ,
рдореИрдВрдиреЗ рдЖрдкрдХреА рд╕рд▓рд╛рд╣ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛, рдЕрдм рдореЗрд░рд╛ рдХреЛрдб рд╣реИ:

def BatchNorm(inputT, is_training=False, reuse=True, scope=None):
  with tf.variable_scope(scope, reuse=reuse):
    return tf.contrib.layers.batch_norm(inputT, is_training=is_training, reuse=reuse, scope=scope, updates_collections=None, decay=0.9, center=True, scale=True)

рдФрд░ рдореИрдВ feed_dict рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ is_training рдФрд░ reuse рдлрд╝реАрдб рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ ValueError("The reuse parameter must be True or False or None.") рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ

рдПрдХ рдЕрдЬрдЧрд░ рдЪрд░ (рдореЙрдбрд▓ рдХреЗ рдЗрдирдкреБрдЯ) рдФрд░ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЛ рдЦрд┐рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ ... рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдЕрдЧрд░ рдореИрдВ batch_norm рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдорд╛рди рдХреЛ рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ TensorBoard рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ рдЧреНрд░рд╛рдл рд╕реЗ рдЬреБрдбрд╝рд╛ ... (рд╕рдВрд▓рдЧреНрди рдЪрд┐рддреНрд░ рджреЗрдЦреЗрдВ)
screen shot 2017-04-03 at 19 54 54

рдореЗрд░рд╛ рдХреЛрдб рдЕрдм рдЗрд╕ рддрд░рд╣ рд╣реИ:
рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЖрд╡рд░рдг

def BatchNorm(inputT, is_training=False, reuse=None, scope=None):
  with tf.variable_scope(scope):
    return tf.contrib.layers.batch_norm(inputT, is_training=is_training, reuse=reuse, scope=scope, updates_collections=None, decay=0.9, center=True, scale=True)

рдореЙрдбрд▓ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛

def model(data, train=False, is_training=False, reuse=None):
  # 1st conv layer
  with tf.name_scope('conv1') as scope:
    conv = tf.nn.conv2d(
    <...>
    norm = BatchNorm(pool, is_training=is_training, reuse=reuse, scope=scope)

рдкреНрд░рд╢рд┐рдХреНрд╖рдг

feed_dict = {train_data_node: batch_data,
      train_labels_node: batch_labels,
      is_training: True,
      reuse: None}
  # Run the optimizer to update weights.
  sess.run(optimizer, feed_dict=feed_dict)

рдорд╛рдиреНрдпрдХрд░рдг

batch_predictions = sess.run(eval_prediction, feed_dict={eval_data: data[-EVAL_BATCH_SIZE:, ...], is_training: False, reuse: True})

рд╣рд╛рд▓рд╛рдБрдХрд┐ is_traning рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдПрдХ рдмреВрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рди рддреЛ рдХреЛрдИ рдЯреЗрдВрд╕рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рди рд╣реА рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдпрд╣ рдкреИрдЯрд░реНрди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

def model(data, is_training=False, reuse=None, scope='my_model'):
  # Define a variable scope to contain all the variables of your model
  with tf.variable_scope(scope, 'model', data, reuse=reuse):
    # 1 layer
    net = tf.contrib.layers.conv2d(data, ....)
    ....
    net = tf.contrib.layers.batch_norm(net, is_training)
   return net

train_outputs = model(train_data, is_training=True)
eval_outputs = model(eval_data, is_training=False, reuse=True)

eval_predictions = sess.run(eval_outputs, feed_dict={eval_data: data[-EVAL_BATCH_SIZE:, ...]})

рдЬрдм рддрдХ рдЖрдкрдХреЛ рдореЙрдбрд▓ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ is_training рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЪрд╛рд▓ рдореЙрдбрд▓ рдХреЛ рджреЛ рдмрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд░ рдХреЛ рджреВрд╕рд░реА рдмрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ред

рд╢реБрдХреНрд░рд┐рдпрд╛ @sguada ! рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛!

рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдкреАрдЖрдИ 1.0 рдкреНрд░рд▓реЗрдЦрди рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдСрдкреНрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдирдпрд╛ tf рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрдиреЗ рдХреЗ рдирд╛рддреЗ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдореЗрд░реА рдкрд░реАрдХреНрд╖рд╛ рдХреА рддреНрд░реБрдЯрд┐ рдкрд╛рдЧрд▓ рдереА рдФрд░ рддрдм рддрдХ рдореБрдЭреЗ рдЕрдкрдиреЗ рдЧреНрд░рд╛рдл рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ рдЬрдм рддрдХ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рдерд╛ рдХрд┐ рдмреИрдЪ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╕рдорд╕реНрдпрд╛ рд╣реИред рддрдм рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдордп рдмрд┐рддрд╛рдирд╛ рдкрдбрд╝рд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд╖рдгреЛрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЪрд░ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреНрд░рд╛рдм рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред 1.0 рдХреЗ рдмрд╛рдж рд╕реЗ update_collections рдХреЛ рдХреЛрдИ рднреА рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдХреЛрдИ рд╕рдВрдХреЗрддрдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдореБрджреНрджрд╛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдСрдк рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╡рд╛рд╣ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@danrsc рдмрд┐рд▓реНрдХреБрд▓ред рдмреАрдПрди рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рднреНрд░рд╛рдордХ рд╣реИред рдореИрдВрдиреЗ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдпрд╛ рдкреВрд░реНрдг рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд╣реАрдВ рдорд┐рд▓реА = =

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдБред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреАрдПрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкрд░рдд рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкреНрд░рд▓реЗрдЦрди рдореБрджреНрджреЛрдВ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдирд╛ред

@sguada рдЖрдкрдХреЛ

рдмрд╕ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рдЧрдП рдФрд░ 3 рджрд┐рдиреЛрдВ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджрд┐рдпрд╛ ... рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдбреЙрдХреНрд╕ рдЬрд▓реНрдж рд╣реА рддрдп рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдкреАрдЖрдИ рдбреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЙрджрд╛рд╣рд░рдг рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@sguada рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ "tf.contrib.layers.batch_norm рдЯреЗрдирд░ рдХреЛ is_training рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ"ред
рд╣рд╛рд╡реЗрд░, рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рд╣реИ
рдпрджрд┐ is_training рдХрд╛ рдХреЛрдИ рд╕реНрдерд┐рд░ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Tensor ,
# рдПрдХ Variable рдпрд╛ Placeholder рддреЛ is_training_value рдХреЛрдИ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░
# needs_moments рд╕рдЪ рд╣реЛрдЧрд╛ред
рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдиреАрд╕_рдореЙрдореЗрдВрдЯреНрд╕ рдЯреЗрд╕реНрдЯ рдХреЗ рдЪрд░рдг рдореЗрдВ рднреА рд╕рд╣реА рд╣реЛрдВрдЧреЗ?
рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ is_training Variable рдпрд╛ Placeholder , рддреЛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреНрд╖рдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдл рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рдд рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИред
рдлрд┐рд░ рд░рдирд┐рдВрдЧ рдЯрд╛рдЗрдо рдореЗрдВ True рдпрд╛ False рдмреИрдЪ moments рдпрд╛ moving_mean рдФрд░ moving_variance ред

рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЖрдк False рдХрд╛ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ moments рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

@ рд╕реБрдЧреНрдЧрд╛ @ рдмреНрд░рд╛рдВрдбреЛ 90

def batch_norm_layer(self, x,train_phase, scope_bn):
        bn_train = batch_norm(x, decay=0.9, center=False, scale=True,
        updates_collections=None,
        is_training=True,
        reuse=None,
        variables_collections= [UPDATE_OPS_COLLECTION],
        trainable=True,
        scope=scope_bn)
        bn_inference = batch_norm(x, decay=0.9, center=False, scale=True,
        updates_collections=None,
        is_training=False,
        reuse=True,
        variables_collections= [UPDATE_OPS_COLLECTION],
        trainable=True,
        scope=scope_bn)
        z = tf.cond(train_phase, lambda: bn_train, lambda: bn_inference)
        return z

рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмреИрдЪреЗрдиреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЪрд▓ рдЪрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ @sguada рдЬреИрд╕реЗ рджреЛ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдореЙрдбрд▓ рдЬрд╣рд╛рдВ is_training = рдЧрд▓рдд рдмрд╕ рдХреНрд░реИрд╢ рд╣реЛрддрд╛ рд╣реИред

W tensorflow/core/framework/op_kernel.cc:993] Not found: Key fully_connected_5/weights not found in checkpoint
W tensorflow/core/framework/op_kernel.cc:993] Not found: Key fully_connected_6/weights not found in checkpoint
W tensorflow/core/framework/op_kernel.cc:993] Not found: Key fully_connected_7/biases not found in checkpoint
W tensorflow/core/framework/op_kernel.cc:993] Not found: Key fully_connected_6/biases not found in checkpoint
W tensorflow/core/framework/op_kernel.cc:993] Not found: Key fully_connected_7/weights not found in checkpoint
W tensorflow/core/framework/op_kernel.cc:993] Not found: Key history_embeddings_1 not found in checkpoint
W tensorflow/core/framework/op_kernel.cc:993] Not found: Key global_step_1 not found in checkpoint

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдПрдХ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝реЗ рдЬрд╛рд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдмреИрдЪ рдорд╛рдирджрдВрдб рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реАрдПрдирдПрди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд░реЗрдВред рдмреЗрдХрд╛рд░ рд╣реИ рдХрд┐ рдореИрдВ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЪреАрдЬреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред

рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдмреИрдЪ_рдиреЙрд░реНрдо рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдореЙрдбрд▓ рдХреЛ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ zillion рд╕рд╛рд▓ рд▓рдЧрддреЗ рд╣реИрдВред рдЯреАрдПрдл 2.0 рдХреЗ рдлрд┐рд░ рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреАред

@MisayaZ рдЖрдкрдХреЛ рджреЛ рдмреИрдЪ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЖрдк рдЬреЛ рднреА рдЯреНрд░реЗрди_рдкреЗрдЬрд╝ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕реЗ рд▓реЗрдпрд░ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдпрд╣ рдорд╛рдирдХрд░ рдХрд┐ рдпрд╣ tf.bool рд╣реИ) рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк UPDATE_OPS_COLLECTION рд╡реИрд░рд┐рдПрдмрд▓_рдХрд▓реЗрдХреНрд╢рди рдкрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдХрд▓реЗрдХреНрд╢рди рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

z = batch_norm(x, decay=0.9, center=False, scale=True, updates_collections=None, 
                             is_training=train_phase, scope=scope_bn)

@OktayGardener рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдЖрдк рдХрд┐рд╕ рдореЙрдбрд▓ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░ рдЖрдкрдХреЗ рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдореЗрдВ рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЧрдП рд╣реИрдВред

рдмреИрдЪ_рдиреЙрд░реНрдо рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ_рдХреЛрдиреЗрдХреНрдЯреЗрдб рдкрд░рддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

slim = tf.contrib.slim
def model(data, is_training=False, reuse=None, scope='my_model'):
  # Define a variable scope to contain all the variables of your model
  with tf.variable_scope(scope, 'model', data, reuse=reuse):
    # Configure arguments of fully_connected layers
    with slim.arg_scope([slim.fully_connected],
                        activation_fn=tf.nn.relu,
                        normalizer_fn=slim.batch_nom):
      # Configure arguments of batch_norm layers
      with slim.arg_scope([slim.batch_norm],
                          decay=0.9,  # Adjust decay to the number of iterations
                          update_collections=None, # Make sure updates happen automatically
                          is_training=is_training, # Switch behavior from training to non-training):
        net = slim.fully_connected(data, 100, scope='fc1')
        net = slim.fully_connected(net, 200, scope='fc2')
        ....
        # Don't use activation_fn nor batch_norm in the last layer        
        net = slim.fully_connected(net, 10, activation_fn=None, normalizer_fn=None, scope='fc10')
       return net

@sguada рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдмрд╛рдерд░рдо рдХреЗ рд╕рд╛рде рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ

z = batch_norm(x, decay=0.9, center=False, scale=True, updates_collections=None, 
                             is_training=train_phase, scope=scope_bn)

рдЧрддрд┐ рдзреАрдореА рд╣реИ, рдореИрдВ рдЧрдгрдирд╛ рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] ================================ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдЯрд╛рдЗрдо рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЯреЙрдк === ===========================
I рдЯреЗрдВрд╕реЛрдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдпреВрдЬрд╝ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] [рдиреЛрдб рдкреНрд░рдХрд╛рд░] [рдкреНрд░рд╛рд░рдВрдн] [рдкрд╣рд▓рд╛] [рдПрд╡реАрдЬреА рдПрдордПрд╕] [%] [рд╕реАрдПрдлрдбреА%] [рдореЗрдо рдХреЗрдмреА] [рдирд╛рдо]
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░.рд╕реАрд╕реА: 392] рдХрдиреНрд╡реЛрдХреЗрд╢рди 106.164 51.354 51.004 23.145% 23.145% 692.224 conv8 / Conv2D
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░.рд╕реАрд╕реА: 392] рдХрдиреНрд╡реЛрдХреЗрд╢рди 85.187 19.115 19.283 19.583 8.750% 31.896% 692.224 conv7 / Conv2D
I рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] рд╕реНрдХреНрд╡реЙрдпрд░рдбрд┐рдлрд╛рдпрд░ 11.967 15.105 14.331 6.503% 38.399% 11075.584 conv1 / рдмреИрдЪ_рдиреЙрд░реНрдо / рдХреНрд╖рдг / рдкрд░реНрдпрд╛рдкреНрдд_рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯреНрд░реЗрд╢рди
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] рдореБрд▓ 11.970 14.162 13.495 6.124% 44.523% 11075.584 conv1 / рдмреИрдЪ_рдиреЙрд░реНрдо / рдмреЙрдЯрдореЙрд░реНрдо / mul_1
I рдЯреЗрдВрд╕реЛрдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] рдХрдиреНрд╡реЛрдХреЗрд╢рди 3.948 8.170 7.986 3.624% 48.146% 11075.584 conv1 / Conv2D
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] рдЙрдк 11.960 10.176 7.943 3.604% 51.751% 11075.584 conv1 / рдмреИрдЪ_рдиреЙрд░реНрдо / рдХреНрд╖рдг / рдкрд░реНрдпрд╛рдкреНрдд_рд╕реНрдЯреИрдЯ / рдЙрдк
I рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдпреВрдЬрд╝ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░.рд╕реАрд╕реА: 392] рд╕реНрдХреНрд╡реЙрдпрд░рдбрд┐рдлрд╛рдпрд░реЗрдВрд╕ 45.570 5.908 7.177 3.257% 55.007% 5537.792 conv2 / рдмреИрдЪ_рдиреЙрд░реНрдо / рдХреНрд╖рдг / рдкрд░реНрдпрд╛рдкреНрдд_рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯреНрд░реЗрд╢рди / рд╕реНрдХреНрд╡реЗрд░рдбрд┐рдлрд╛рдЗрди
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] рдореВрд▓ 45.574 7.755 6.902 3.132% 58.140% 5537.792 conv2 / batch_norm / batchnorm / mul_1
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] рдХрдиреНрд╡реЛрдХреЗрд╢рди 40.692 5.408 4.845 2.199% 60.338% 5537.792 conv2 / Conv2D
рдореИрдВ рдЯреЗрдВрд╕рд░рдлрд╝реНрд▓реЛ / рдХреЛрд░ / рдЙрдкрдпреЛрдЧ / рд╕реНрдЯреЗрдЯ_рд╕рдорд░рд╛рдЗрдЬрд╝рд░ .cc: 392] рдЙрдк 45.563 6.067 4.784 2.171% 62.509% 5537.792 con

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдХреБрдЫ рдСрдкреНрд╕ рдХреНрдпреЛрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ conv1 / рдмреИрдЪ_рдиреЙрд░реНрдо / рдХреНрд╖рдг / рдкрд░реНрдпрд╛рдкреНрдд_рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯрд┐рдХреНрд╕ / рд╕реНрдХреНрд╡реЗрд░рдбрд┐рдлрд╛рдпрд░ред

рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЙрд╕ рдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВ рдХреБрдЫ рдСрдкреНрд╕ рдкрд▓ рдХреЗ рддрд╣рдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ?

рдирдорд╕реНрддреЗ,

рдЙрдкрд░реЛрдХреНрдд batch_norm рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ contrib.layers , рдореБрдЭреЗ nan рд╕рддреНрдпрд╛рдкрди рдЧреНрд░рд╛рдл рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ рдЬрдмрдХрд┐ рдЯреНрд░реЗрди рдХрд╛ рдЧреНрд░рд╛рдл рдореВрд▓ рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ?

рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

def batchnormlayer(inputs, numout, train_model):
    with tf.variable_scope("batch_norm") as scope_bn:
        epsilon = 1e-3
        return tf.contrib.layers.batch_norm(inputs, decay=0.9, updates_collections=None,
                                            scale=True, scope=scope_bn,
                                            is_training=train_model, epsilon=epsilon,
                                            fused=True, reuse=scope_bn.reuse)

рдзрдиреНрдпрд╡рд╛рдж

рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ рдмреИрдЪ_рдиреЙрд░реНрдо рдХреА 16 рдкрд░рддреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ 4 рдкрд░рддреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдЯреЗрдВрд╕рд░рдлреНрд▓реЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдорд╛рд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореЗрд░реА рддреНрд░реБрдЯрд┐ рдХреБрдЫ рдпреБрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдпрд╛рдиреА рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ рдЕрдВрддрд┐рдо рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рдореИрдВ рдпрд╣ рднреА рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрджрд┐ рдореИрдВ рдмреИрдЪ_рдиреЙрд░реНрдо рдирд┐рдХрд╛рд▓рддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рджреВрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЫрд╛рдпрд╛ рдЪрд░ рд╕реЗ рдмрд╣рд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдХреНрд╕рдкреЛрдиреЗрдВрд╢рд┐рдпрд▓ рдореЙрд╡рд┐рдВрдЧреНрд╕рдПрд╡рд░реЗрдЬ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЪрд▓рддреА рдФрд╕рдд рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЕрдЧрд░ рдореИрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЪрд░ рдХрд╛ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдЬреЛ рднреА рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдФрд░ рди рд╣реА рдЪрд▓рддреА рдФрд╕рддред рдХреНрдпрд╛ рдореИрдВ рдЗрд╕рдХреА рд╕рд╣реА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдХреНрдпрд╛ рдпрд╣ рдЕрднреАрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЫрд╛рдпрд╛ рдЪрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрд╣рд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП ...

рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкрдХрдбрд╝рд╛, рдореЗрд░реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╡рд┐рдЪрд░рдг рдХреБрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рджрд╕рд┐рдпреЛрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ: Model/clip_logits/batch_norm/moving_variance:0 tf.model_variables() рдореМрдЬреВрдж рд╣реИ

Moving variance (shape = (101,)) = 
[ 214.70379639   95.36338043    0.57885742  189.49542236  102.72473145
  137.14886475  286.57333374  111.06427002  154.98750305  167.75219727
  207.83955383  211.14007568  158.23495483  171.61665344  116.81361389
  115.77380371   43.59399796  137.75064087  181.75245667  161.37339783
  215.21934509   92.88521576  191.23846436  336.3946228   259.85919189
  299.47039795  186.23222351  165.19311523  262.82446289  170.11567688
  233.56843567  209.35050964  115.96807861  154.34109497  295.5770874
  123.6055603   295.76187134  296.88583374  240.88217163  247.32983398
   87.15661621  217.69897461  133.00698853   -4.80375671  344.77462769
  291.50601196  117.77174377  265.83712769  207.90093994  194.186203
  220.21418762  178.03738403  115.27571869  196.62184143  228.8089447
  191.53205872  331.36807251  151.55435181  197.2951355   179.67504883
  181.09727478   90.09922791  173.30133057  102.6836853   160.9434967
  236.59512329  168.05305481  403.36340332   41.14326096  185.93409729
  130.57434082  266.31509399  101.44387817  163.88059998  290.25015259
  244.52597046  229.86647034  158.14352417  202.68774414  187.78227234
  248.78218079  126.0978241   171.41891479  274.40740967  119.84254456
  202.53045654  200.20608521  214.04730225  111.53284454  222.03184509
  244.81187439  172.23052979  187.09806824  194.62802124  255.26345825
  293.63598633  307.91036987  210.86982727  308.88919067  144.94792175
  229.69013977]

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдпрд╛рдо рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдирдХрд╛рд░рд╛рддреНрдордХ рд╡рд┐рдЪрд░рдг рд╣реИред рдпрд╣ рд╕рдВрднрд╡ рд╣реА рдХреИрд╕реЗ рд╣реИ ?
рдкреБрдирд╢реНрдЪ рдмреИрдЪ рдХреА рдорд╛рдирдХ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рдЕрдВрддрд┐рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝реА рдкрд░рдд рдХреЗ рдмрд╛рдж рдФрд░ рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

@ raghavgoyal14 рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ

@abred : рд╣рд╛рдВ, рдореИрдВрдиреЗ fused=True , рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

@sguada рд╣рд╛рдп, sguada, рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рджрд╕рд╡реЗрдВ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ contrib.layers.batch_norm рдХреА рдкрд░рд┐рднрд╛рд╖рд╛:
def рдмреИрдЪ_рдиреЙрд░реНрдо (рдЗрдирдкреБрдЯреНрд╕)
рдХреНрд╖рдп = 0.999,
рдХреЗрдВрджреНрд░ = рд╕рдЪ,
рдкреИрдорд╛рдиреЗ рдЭреВрдареА =,
рдПрдкреНрд╕рд┐рд▓реЙрди = 0.001,
activation_fn = рдХреЛрдИ рдирд╣реАрдВ,
param_initializers = рдХреЛрдИ рдирд╣реАрдВ,
param_regularizers = рдХреЛрдИ рдирд╣реАрдВ,
updates_collections = ops.GraphKeys.UPDATE_OPS,
is_training = рд╕рдЪ,
рдкреБрди: рдЙрдкрдпреЛрдЧ = рдХреЛрдИ рдирд╣реАрдВ,
variables_collections = рдХреЛрдИ рдирд╣реАрдВ,
outputs_collections = рдХреЛрдИ рдирд╣реАрдВ,
trainable = рд╕рдЪ,
batch_weights = рдХреЛрдИ рдирд╣реАрдВ,
рдореЗрдВ рдЬреБрдбрд╝реЗ = рдЭреВрдареА,
data_format = DATA_FORMAT_NHWC,
zero_debias_moving_mean = рдЭреВрдареА,
рдЧреБрдВрдЬрд╛рдЗрд╢ = рдХреЛрдИ рдирд╣реАрдВ,
renorm рдЭреВрдареА =,
renorm_clipping = рдХреЛрдИ рдирд╣реАрдВ,
renorm_decay = 0.99):
рдкреИрдорд╛рдирд╛: рдпрджрд┐ рд╕рд╣реА рд╣реИ, рддреЛ рдЧрд╛рдорд╛ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░реЗрдВред рдпрджрд┐ рдЧрд▓рдд рд╣реИ, рдЧрд╛рдорд╛ рд╣реИ
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЬрдм рдЕрдЧрд▓реА рдкрд░рдд рд░реИрдЦрд┐рдХ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП nn.relu), рддреЛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рдмрд╛рдж рд╕реЗ рд╡рд┐рдХрд▓рд╛рдВрдЧ рдЕрдЧрд▓реА рдкрд░рдд рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рдореИрдВ tf.contrib.layers.batch_norm (рдЗрдирдкреБрдЯ, рд╕реНрдХреЗрд▓ = рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ "рд╕реНрдХреЗрд▓ = рдЧрд▓рдд" рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди "y = рдЧрд╛рдорд╛ * x + рдмреАрдЯрд╛" рдореЗрдВ рдЧрд╛рдорд╛ рд╢реВрдиреНрдп рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

рдЬрдм рдкреИрдорд╛рдиреЗ = рдЧрд▓рдд, рдЧрд╛рдорд╛ рдПрдХ рд╕реНрдерд┐рд░ 1 рд╣реИред

@ppwwyxx рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ Tens.flow рдореЗрдВ tf.contrib.layers.batch_norm (рдЗрдирдкреБрдЯ, рд╕реНрдХреЗрд▓ = рдЧрд▓рдд) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдм рдореИрдВ Tensorflow рдХреЗ Caffe рдХреЛ Caffe рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреИрдлрд╝реЗ рдореЗрдВ рдмреИрдЪрдореЛрд░рд▓реЗрдпрд░ рдФрд░ рд╕реНрдХреЗрд▓рд▓реЗрдпрд░ рдХреЗ рдкреИрд░рд╛рдо рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ?
рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред

@ рдорд┐рд╕реНрдЬрд╝реИрдЬрд╝ I рдореЗрдВ "is_training" рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рдмреИрдЪрдиреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдерд╛ред рдореИрдВ рдЯреНрд░реЗрд╕ рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕рдордп рдкрд░ рднреА рдХреНрд╖рдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛:

    # If `is_training` doesn't have a constant value, because it is a `Tensor`,
    # a `Variable` or `Placeholder` then is_training_value will be None and
    # `needs_moments` will be true.
    is_training_value = utils.constant_value(is_training)
    need_moments = is_training_value is None or is_training_value
    if need_moments:
        # here it defines the moments

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм "is_training" рдПрдХ рдЪрд░ рдпрд╛ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╣реИ, рддреЛ рдХреНрд╖рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдирдХреА рдЧрдгрдирд╛ рднреА рдХрд░рддрд╛ рд╣реИ, рддрдм рднреА рдЬрдм рдЖрдк рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЛ "рдЧрд▓рдд" рдкрд░ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд╕рдордп-рд╕рдордп рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдирд┐рд░рдВрддрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЯреНрд░реЗрди рдмрдирд╛рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рдЕрдм рдХреНрд╖рдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдордп рдореЗрдВред

@ tano297 рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЕрдм рднреА рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ 'is_training' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕реЗ рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВ рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдореВрд╡рд┐рдВрдЧ рдорд╛рдзреНрдп рдФрд░ рдореВрд╡рд┐рдВрдЧ рд╡рд┐рдЪрд░рдг рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдиреБрдорд╛рди рдХрд╛ рд╕рдордп рд▓рдВрдмрд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдирдкреБрдЯ рдХреЗ рдорд╛рдзреНрдп рдФрд░ рд╡рд┐рдЪрд░рдг рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдореВрд╡рд┐рдВрдЧ рдорд╛рдзреНрдп рдФрд░ рдореВрд╡рд┐рдВрдЧ рд╡рд┐рдЪрд░рдг рдХреЛ рдЕрджреНрдпрддрди рдХрд░реЗрдЧрд╛ред рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдЯреНрд░реЗрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рд╡рд┐рднрд┐рдиреНрди рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред

@ tano297 @MisayaZ
рд▓реЗрдХрд┐рди "smart_cond" рдореЗрдВ рдирд╣реАрдВ рд╣реИ

is_training_value = utils.constant_value(is_training)
need_updates = is_training_value is None or is_training_value
if need_updates:
  ...
  outputs = utils.smart_cond(is_training, _force_updates, no_updates)

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЕрдкрдбреЗрдЯ рдХреЗрд╡рд▓ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдФрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ рдпрджрд┐ is_training True рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ?

@abred рд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓реЗрдХрд┐рди рдЖрдк рд▓рд╛рдЗрди 391 рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдпрд╣ _fused_batch_norm () рдХреЗ рднреАрддрд░ рдЪрд▓рддреА рдФрд╕рдд рдХрд╛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИ:

    # If `is_training` doesn't have a constant value, because it is a `Tensor`,
    # a `Variable` or `Placeholder` then is_training_value will be None and
    # `need_updates` will be true.
    is_training_value = utils.constant_value(is_training)
    need_updates = is_training_value is None or is_training_value
    if need_updates:
        ...
        outputs = utils.smart_cond(is_training, _force_updates, no_updates)
        ...

рдореИрдВ рдмреИрдЪ 75 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ

    # If `is_training` doesn't have a constant value, because it is a `Tensor`,
    # a `Variable` or `Placeholder` then is_training_value will be None and
    # `needs_moments` will be true.
    is_training_value = utils.constant_value(is_training)
    need_moments = is_training_value is None or is_training_value
    if need_moments:
        ...
        mean, variance = utils.smart_cond(is_training,
                                          _force_updates,
                                          moving_vars_fn) 
        ...

рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯ рд╕реНрдерд┐рддрд┐ (рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореЗрд░рд╛ рд╕рдВрдмрдВрдз рд╣реИ) рдореВрд╡рд┐рдВрдЧ рдПрд╡рд░реЗрдЬ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдпрд╛ рди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд╖рдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдЕрднреА рднреА рдХреА рдЬрд╛рддреА рд╣реИред

@ tano297 рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рд╣реИрдВ, рдореИрдВ рдЧрд▓рдд рдЬрдЧрд╣ рдкрд░ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА:
рд▓рд╛рдЗрди 755-770 рдХреНрд╖рдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ _force_updates рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ is_training True рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдирд╣реАрдВ рд╣реИрдВ?
рдФрд░ рдЗрд╕ рддрд░рд╣

mean, variance = utils.smart_cond(is_training, _force_updates, moving_vars_fn) 

рд▓рд╛рдЗрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП 804:

mean, variance = moving_mean, moving_variance

рдпрджрд┐ is_training рдлрд╛рд▓реНрд╕ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЧреНрд░рд╛рдл рдХреЗ "рдХреНрд╖рдг" -рдкрд╛рд░реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ рдмрдВрдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП

рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд▓рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ :)

@ tano297 @abred рддреБрдо рд╕рд╣реА рд╣реЛред рдЬрдм рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмреИрдЯрдЪреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдЪрд▓рди рдФрд░ рдЪрд▓рди рднрд┐рдиреНрдирддрд╛ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ:

def batch_norm_layer(self, x,train_phase, scope_bn):
        bn_train = batch_norm(x, decay=0.9, center=False, scale=True,
        updates_collections=None,
        is_training=True,
        reuse=None,
        variables_collections= [UPDATE_OPS_COLLECTION],
        trainable=True,
        scope=scope_bn)
        bn_inference = batch_norm(x, decay=0.9, center=False, scale=True,
        updates_collections=None,
        is_training=False,
        reuse=True,
        variables_collections= [UPDATE_OPS_COLLECTION],
        trainable=True,
        scope=scope_bn)
        z = tf.cond(train_phase, lambda: bn_train, lambda: bn_inference)
        return z

рдпрджрд┐ рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

z = batch_norm(x, decay=0.9, center=False, scale=True, updates_collections=None, 
                         is_training=train_phase, scope=scope_bn)

рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЧрддрд┐рдорд╛рди рдФрд░ рдЧрддрд┐рдорд╛рди рд╡рд┐рдЪрд░рдг рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЧрддрд┐ рдмрд╣реБрдд рдзреАрдореА рд╣реИред

рд╣рд╛рдп @zhongyuk ,

рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рднреА рдорд┐рд▓рд╛ рдХрд┐ рдореИрдВ is_training рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ = рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдЕрдиреБрдорд╛рди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди is_training = рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдЦрд░рд╛рдм рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ (is_training (рдЯреНрд░реВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдорд▓реЗ рд╕реЗ рднреА рдмрджрддрд░)ред рдЖрдкрдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдЧрд░ рдореИрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдордЭреВрдВ, рддреЛ рдмреАрдПрди рдореЗрдВ рдХреЗрд╡рд▓ рдХреНрд╖рдп = 0.9 рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдВ рд╕рд╣реА рд╣реВ?

BTW, рдХреНрдпрд╛ рдореБрдЭреЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рдХреНрд╖рдп = 0.9 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛? рдпрд╛ рдЪреМрдХреА рд╕реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ (рдпрд╛рдиреА, рдЬрдм рдХреНрд╖рдп = 0.999 рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд) рднреА рдареАрдХ рд╣реИ?

рдзрдиреНрдпрд╡рд╛рдж!

@nmduc @ davek44

рдирдорд╕реНрддреЗ, рдореИрдВ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рднреА рдорд┐рд▓рд╛, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВ = рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдЕрдиреБрдорд╛рди рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди is_training = рдЧрд▓рдд рд╣реЛрдиреЗ рдкрд░ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддреЗ рд╣реИрдВ (in_training = True рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЗрд╕ рд╕реЗ рднреА рдмрджрддрд░)ред рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рд╣реИ? рдзрдиреНрдпрд╡рд╛рдж!

@tyshiwo рдореИрдВ рд╕рд┐рд░реНрдл рдмреИрдЪ_рдиреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдХреНрд╖рдп = 0.9 рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдЕрдм рддрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдЗрди рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж рдЙрд▓рдЭрди рдореЗрдВ рдерд╛ рдХрд┐ рдХреИрд╕реЗ рдмреИрдЪ рдиреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдареАрдХ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП: рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИред рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВ рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВред

batch_norm = tf.contrib.layers.batch_norm(conv, center=True, scale=True, reuse=phase_train_py, scope='bn', is_training=is_training)

рдЬрд╣рд╛рдВ рдЪрд░рдг_рдЯреНрд░реЗрди_рдкреА рдПрдХ рдкрд╛рдпрдерди рдмреВрд▓рд┐рдпрди рдЪрд░ рд╣реИ рдФрд░ is_training рдПрдХ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╣реИ рдЬреЛ рдмреВрд▓рд┐рдпрди рдЪрд░ рд▓реЗ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ tf.cond рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ, рдЕрдиреНрдпрдерд╛ рдХреНрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмреВрд▓рд┐рдпрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ tf.cond рд╕рддреНрдп рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП batch_norm рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ред рдЗрд╕рд▓рд┐рдП, рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдмреВрд▓рд┐рдпрди рдЪрд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЬреЛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ: phase_train_py рдЭреВрдареА рдЯреНрд░реЗрдирд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп is_training True рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ред рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдкрд░реАрддред рдЪреВрдБрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ sess.run рд╕рд╛рде рдЯреЗрдирд░реНрд╕ рдпрд╛ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░реНрд╕ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирдмреВрдЭрдХрд░ phase_train_py рдмрджрд▓ рджрд┐рдпрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

if condition: phase_train_py = False sess.run(to_run_list, feed_dict={phase_train: True}) else: phase_train_py = True sess.run(to_run_list, feed_dict={phase_train: False})

++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++
рдЖрдк рдЗрд╕ рдХреА рдЬрд░реВрд░рдд рдХреА рдЬрд░реВрд░рдд рд╣реИ
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ TF v1.3 рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рджреМрд░рд╛рди is_training=False рдХреЗ рд╕рд╛рде рдЖрдзрд┐рдХрд╛рд░рд┐рдХ tf.contrib.layers.batch_norm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рджреМрд░рд╛рди is_training=True рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рдЦрддрд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рд╣реИ рдареАрдХ):
1. decay , рдШрд╛рддреАрдп рдореВрд╡рд┐рдВрдЧ рдПрд╡рд░реЗрдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдореЗрдВ рдЕрд▓реНрдлрд╛ рдлрд┐рд▓реНрдЯрд░ рд╣реИ, рдЕрднрд┐рд╕рд░рдг рдХрд╛ рд╕рдордп рдЯреНрд░реЗрди рдХреЗ рд▓рдЧрднрдЧ 1 / (1-рдХреНрд╖рдп) рдЪрд░рдгреЛрдВ рдХрд╛ рд╣реИред рдХреНрд╖рдп = 0.999 рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрднрд┐рд╕рд░рдг рдХреЗ рд▓рд┐рдП 1 / 0.001 = 1000 рдЪрд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ рдЕрдкрдиреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрджрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рдХреНрд╖рдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред

  1. рдЯреНрд░реЗрди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
  2. рдпрджрд┐ рдЖрдк train_op рдкрд░ рдЕрдкрдбреЗрдЯ рдСрдк рдХреА рдирд┐рдпрдВрддреНрд░рдг рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ updates_collections=None рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  3. reuse рдЙрдЪрд┐рдд рдореВрд▓реНрдп рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмреИрдЪ_рдиреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рджреЛ рд░реЗрдЦрд╛рдВрдХрди рдмрдирд╛рдирд╛ рд╣реИ, рдПрдХ рдЯреНрд░реЗрди рдХреЗ рд▓рд┐рдП рдФрд░ рджреВрд╕рд░рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП, рдХреНрд░рдорд╢рдГ is_training=True рдФрд░ is_training=False ред рдЗрд╕ рддрд░рд╣, рдЖрдкрдХреЛ рдЯреНрд░реЗрди рдФрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдмреАрдЪ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмреЗрд╡рдХреВрдл рддрд░реАрдХрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЧреНрд░рд╛рдл рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдПрдХ рдЪрд▓рддреА рдФрд╕рдд рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛! рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ (рд╡реЗрдм тАЛтАЛрдкрд░ рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдФрд░ рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд)

def bn_layer(x, scope, is_training, epsilon=0.001, decay=0.99, reuse=None):
    """
    Performs a batch normalization layer

    Args:
        x: input tensor
        scope: scope name
        is_training: python boolean value
        epsilon: the variance epsilon - a small float number to avoid dividing by 0
        decay: the moving average decay

    Returns:
        The ops of a batch normalization layer
    """
    with tf.variable_scope(scope, reuse=reuse):
        shape = x.get_shape().as_list()
        # gamma: a trainable scale factor
        gamma = tf.get_variable("gamma", shape[-1], initializer=tf.constant_initializer(1.0), trainable=True)
        # beta: a trainable shift value
        beta = tf.get_variable("beta", shape[-1], initializer=tf.constant_initializer(0.0), trainable=True)
        moving_avg = tf.get_variable("moving_avg", shape[-1], initializer=tf.constant_initializer(0.0), trainable=False)
        moving_var = tf.get_variable("moving_var", shape[-1], initializer=tf.constant_initializer(1.0), trainable=False)
        if is_training:
            # tf.nn.moments == Calculate the mean and the variance of the tensor x
            avg, var = tf.nn.moments(x, np.arange(len(shape)-1), keep_dims=True)
            avg=tf.reshape(avg, [avg.shape.as_list()[-1]])
            var=tf.reshape(var, [var.shape.as_list()[-1]])
            #update_moving_avg = moving_averages.assign_moving_average(moving_avg, avg, decay)
            update_moving_avg=tf.assign(moving_avg, moving_avg*decay+avg*(1-decay))
            #update_moving_var = moving_averages.assign_moving_average(moving_var, var, decay)
            update_moving_var=tf.assign(moving_var, moving_var*decay+var*(1-decay))
            control_inputs = [update_moving_avg, update_moving_var]
        else:
            avg = moving_avg
            var = moving_var
            control_inputs = []
        with tf.control_dependencies(control_inputs):
            output = tf.nn.batch_normalization(x, avg, var, offset=beta, scale=gamma, variance_epsilon=epsilon)

    return output


def bn_layer_top(x, scope, is_training, epsilon=0.001, decay=0.99):
    """
    Returns a batch normalization layer that automatically switch between train and test phases based on the 
    tensor is_training

    Args:
        x: input tensor
        scope: scope name
        is_training: boolean tensor or variable
        epsilon: epsilon parameter - see batch_norm_layer
        decay: epsilon parameter - see batch_norm_layer

    Returns:
        The correct batch normalization layer based on the value of is_training
    """
    #assert isinstance(is_training, (ops.Tensor, variables.Variable)) and is_training.dtype == tf.bool

    return tf.cond(
        is_training,
        lambda: bn_layer(x=x, scope=scope, epsilon=epsilon, decay=decay, is_training=True, reuse=None),
        lambda: bn_layer(x=x, scope=scope, epsilon=epsilon, decay=decay, is_training=False, reuse=True),
    )

рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдмрд╕ bn_layer_top рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, is_training рдкреИрд░рд╛рдореАрдЯрд░ tf.placeholder
ред рддрдм рдЖрдк feed_dict рд╕рд╛рде, рдЯреНрд░реЗрдирд░ рдХреЗ рджреМрд░рд╛рди рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЛ True рдФрд░ рдЯреНрд░реЗрди рдХреЗ рджреМрд░рд╛рди рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдореБрджрд╛рдп рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЬрдм рдЖрдк slim.batch_norm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "tf.train.GradientDecentOptimizer (lr) .minimize (рд╣рд╛рдирд┐) рдпрд╛ рдЕрдиреНрдп рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЗ рдмрдЬрд╛рдп" slim.learning.create_train_op "рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

@vincentvanhoucke рдЖрдкрдиреЗ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдПрдХ рдФрд░ рдкреЛрд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ:

рд╕реНрд▓рд┐рдо рдмреИрдЪ_рдиреЙрд░реНрдо рд░реИрдкрд░ рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рдХреЗ рдЕрдВрддрд┐рдо рдЖрдпрд╛рдо рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИред рддреЛ рдЕрдЧрд░ рдпрд╣ рдПрдХ 2 рдбреА рдЗрдирдкреБрдЯ рдЯреЗрдВрд╕рд░ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдкрд░рдд рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдмреИрдЪ рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдкреНрд░рддрд┐-рд╕рдХреНрд░рд┐рдпрдг рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдПрдХ 4D рдЯреЗрдВрд╕рд░ рд╣реИ рдЬреЛ рдПрдХ рдХрдирд╡рд▓реНрд╢рди рд╕реЗ рдЖ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рддреАрди рдкрд╣рд▓реЗ рдЖрдпрд╛рдореЛрдВ (рдмреИрдЪ, рдЪреМрдбрд╝рд╛рдИ, рдЧрд╣рд░рд╛рдИ) рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкреНрд░рддрд┐-рд╕реБрд╡рд┐рдзрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░реЗрдЧрд╛ред @sguada рд╢рд╛рдпрдж рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╣реЛ рд░рд╣рд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк "рд╕реНрд▓рд┐рдо рдмреИрдЪ_рдиреЙрд░реНрдо рд░реИрдкрд░" рдлрд╝рдВрдХреНрд╢рди tf.contrib.layers.batch_norm рдорддрд▓рдм рд░рдЦрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдореИрдВ рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдкрд╛рда рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдмреИрдЪ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЛ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдХрд╛рдЧрдЬ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ ... FC-Layer рдФрд░ Conv2D-Layer рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдПред рдлрд┐рд▓рд╣рд╛рд▓ рдХреЗрд╡рд▓ рдкрд╛рда рд╣реИ "рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ conv2d рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдПрдХ normalizer рдлрд╝рдВрдХреНрд╢рдиред", рдЬрд╣рд╛рдВ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЕрдХреНрд╖ рд╡рд┐рд╖рдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

@ZahlGraf рдореИрдВ рдЦреБрд╢реА рд╕реЗ рдПрдХ рдкреАрдЖрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЗрд╕ рдкрд░ рд╣реИрдВ рдХрд┐ рдореБрдЭреЗ рдЕрдм рдЗрд╕ рдмрд╛рдд рдХреА рдЕрдЪреНрдЫреА рд╕рдордЭ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдирдП рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реЗрдВрдЧреЗред

@vincentvanhoucke
рдореИрдВрдиреЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рдмрдирд╛рдпрд╛, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЖрдкрдХреЗ рдХрдерди рдХреЗ рдЖрдзрд╛рд░ рдкрд░:
https://github.com/tensorflow/tensorflow/pull/15653

рдХреГрдкрдпрд╛ рдПрд╕реЗрд╕реА рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдмрд╛рд╣рд░реА рдпреЛрдЧрджрд╛рди рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, contributions welcome рд▓реЗрдмрд▓ рдирд┐рдХрд╛рд▓реЗрдВред рдзрдиреНрдпрд╡рд╛рджред

рдХреГрдкрдпрд╛ рдПрд╕реЗрд╕реА рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдмрд╛рд╣рд░реА рдпреЛрдЧрджрд╛рди рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, contributions welcome рд▓реЗрдмрд▓ рдирд┐рдХрд╛рд▓реЗрдВред рдзрдиреНрдпрд╡рд╛рджред

рдмреИрдЪ рдорд╛рдирдХ рдкрд░рдд рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдореВрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдж рд╕реЗ рдЗрд╕ рдмрдЧ рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рд╛рде рд╣рд╛рд▓ рд╣реА рдХреЗ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдкрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреАрдЖрд░ рд╣реИрдВ
рдпрджрд┐ рдЖрдк рдмреИрдЪ_рдиреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдпрд╛ рддреЛ StackOverflow рдкрд░ рдПрдХ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦреЛрд▓реЗрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

fobus42 picture fobus42  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jacobma-create picture jacobma-create  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

RahulKulhari picture RahulKulhari  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

myme5261314 picture myme5261314  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

waleedka picture waleedka  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ