Tensorflow: 䜿いやすいバッチノルムレむダヌ。

䜜成日 2016幎02月16日  Â·  127コメント  Â·  ゜ヌス: tensorflow/tensorflow

倚くの非専門家は、次のコヌドhttp://stackoverflow.com/questions/33949786/how-could-i-use-batch-normalization-in-tensorflow?answertab=votes#tab-topを䜿甚しおいたす。

DNNのトレヌニングにおける重芁性を考えるず、公匏のバッチノルムレむダヌがあるず䟿利です。

contributions welcome docs-bug

最も参考になるコメント

党おのコメント127件

私はそのいく぀かの郚分に取り組んでいたす。

このレむダヌに䜕か問題があるず思いたす。 トレヌニングではすべおがOKで、損倱は非垞に少なくなりたす。 しかし、テストでは粟床がれロになりたす。
ちなみに、is_training = Falseを䜿甚した堎合のテストでは、accがれロになりたす。
バッチ正芏化は、トレヌニング時ずテスト時にように、トレヌニングフェヌズずテストフェヌズで異なる動䜜をするこずを知っお--Quora 。 この実装は䞍明確だず思いたす

ここでも同じですが、is_training = Falseで予期しない動䜜が発生したした。 このフラグを倉曎する正しい方法は䜕ですか tf.placeholdersを単独で䜿甚しないため、珟圚tf.condを䜿甚しおいたす。

@pawni is_trainingはPythonブヌル倀を䜿甚する必芁がありたす。 tf.condにするこずはできたせん。

@ppwwyyxxよく私は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))をやっおいるず思いたしたが、これは正しくありたせん。
あなたの珟圚の方法にも問題があるかもしれたせん。 䜜成した2぀のbatch_norm opが同じスコヌプを共有しおいるこずを再確認する必芁がありたす。そうしないず、基瀎ずなる平均/分散統蚈が共有されたせん。

これを行うには、 reuse匕数が圹立぀堎合がありたすが、独自のバヌゞョンのbnレむダヌを䜿甚しおいるためわかりたせん。

同じスコヌプずreuse=Trueたす。 時々動䜜するようですが、よくわかりたせん。 トレヌニングからテストぞの倉曎を最適に凊理する方法を簡単に説明したレむダヌをドキュメントに远加できれば玠晎らしいず思いたす。

@sguada FYI

珟圚、batch_normにはpythonブヌル倀が必芁ですが、Tensorを枡すオプションの远加に取り組んでいたす。

@pawnimoving_meanずmoving_varianceの曎新に぀いお心配したくない堎合はupdates_collections = Noneを蚭定しお、それらが適切に曎新されおいるこずを確認しおください。そうでない堎合は、トレヌニング䞭にtf.GraphKeys.UPDATE_OPSに远加されたupdate_opsが実行されおいるこずを確認する必芁がありたす。

テン゜ルフロヌには、トヌチのように、モデルの状態を倉曎する2぀のハむパヌメ゜ッドが必芁だず思いたす。 モデルの状態を倉曎したす。 ずおも簡単だず思いたす。

この「公匏」BNレむダヌを䜿甚する適切な方法を瀺す非垞に単玔なNNの小さなスクリプトはありたすか 本圓にありがたいです。

これが少し繰り返される堎合は申し蚳ありたせんが、APIは別のむンタヌフェヌスでBNに぀いお話しおいるようです https 

それはBNを䜿甚する公匏の方法ではありたせんか 私はそれを䜿甚する方法に぀いお混乱しおいお、SOが叀くなっおいるようで、APIずは異なるリンクにレむダヌがありたすが、これをどのように正確に行うのですか SOに行くのか、ここで尋ねるのかわかりたせん。

スパムに぀いおは申し蚳ありたせんが、次のようなものを䜿甚するだけで䜕が問題になりたすか。

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 @ppwwyyxxスコヌプの問題を解決するために、再利甚をtrueに䜿甚する必芁があるかどうかを刀断したしたか

@ 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 

update_collections = Noneの堎合、曎新はむンプレヌスで行われ、tf.condを䜿甚しお、is_trainingをTensorにする方が簡単です。これは、曎新が遅れおupdate_opsが埌で実行される堎合です。
私はすぐに最初の郚分を取埗しようずしたす。

@ 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ずしお取埗するず玠晎らしいでしょう。

@ nmhkahn @ pawniコヌドスニペットをありがずう。 これらは、畳み蟌みネットワヌクにバッチ正芏化を远加するのに非垞に圹立ちたした。 トレヌニングは非垞にうたく機胜しおいるようです。 テストはそうではありたせん。 コヌドトレヌニングの粟床の䞀郚のバヌゞョンでは、テストの粟床よりもはるかに高いため、バッチ正芏化パラメヌタヌを共有しおいない可胜性がありたす。 他のバヌゞョンのコヌドでは、「ValueError倉数conv1 / betaはすでに存圚し、蚱可されおいたせん。VarScopeでreuse = Trueを蚭定する぀もりでしたか」ずいうメッセヌゞが衚瀺されたす。 これは、パラメヌタを再孊習しようずしおいるこずを瀺しおいるようです...再利甚しようずしたずき。

倉数の共有が正しく行われるように、トレヌニングおよびテスト䞭に「defBatchNorm」関数を呌び出す方法の䟋を誰かが提䟛できたすか。

助けおくれおありがずう。

2016幎7月25日曎新

@ nmhkahn @ pawniコメントありがずうございたす。 contribのコヌドを詳しく調べた埌、私は自分の問題が䜕であるかを理解したした。 トレヌニングずテスト䞭に、4぀の倉数ベヌタ、ガンマ、移動平均、移動平均を曎新たたは再利甚したす。 それらをナニヌクにするために、レむダヌごずにスコヌプを蚭定する必芁がありたした。 私はこのようにしたした

conv1 = tf.nn.relubatch_norm_layerconv2d_stride2_validdata、W_conv1+ b_conv1、train_phase、scope = "conv1"

ここで、batch_norm_layerは@nmhkahn @pawniの䟋に䌌おおり、conv2d_stride2_validは畳み蟌み局を定矩するための単なる定矩であり、W_conv1ずb_conv1は重みずバむアスを保持する倉数です。 バッチ正芏化を䜿甚しおいるため、バむアス項を削陀できる可胜性がありたす。

ネットは今うたく機胜しおいたす。 トレヌニングモヌドずテストモヌドで粟床をプロットした埌、トレヌニング粟床の埌にテスト粟床が䞊昇し始めるこずに気付きたした。 振り返っおみるず、テスト甚のデヌタセット統蚈を収集しおいるので、それは理にかなっおいたす。 しかし、最初のテストで䜕か間違ったこずをしおいるように芋えたした。 コメントをいただき、コミュニティでバッチ正芏化を利甚できるようにしおいただきありがずうございたす。

@nmhkahn pawniの提案ずどう違うのですか

@ brando90 nmhkahnによっお修正されたバヌゞョンで小さな゚ラヌが発生したした isTrainingをis_training 

@diegoAtAlpine私は同じ問題を芋぀けたした-しかし、なぜこれが

@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

それは正しくありたせんか

is_trainingのテン゜ルたたはプレヌスホルダヌを枡すこずができるようにtf.contrib.layers.batch_normを既に拡匵したした。 間もなくTFcontribに統合されたす。

で利甚可胜になりたした
https://github.com/tensorflow/tensorflow/commit/9da5fc8e6425cabd61fc36f0dcc1823a093d5c1d#diff -94bbcef0ec8a5cdef55f705e99c2b2ed

それは私だけですか、それずもこのBNレむダヌを远加するず、単䞀の゚ポックのトレヌニングが著しく遅くなりたすか

@ brando90それは私にずっおもトレヌニングを遅くしたすが、いく぀かの統蚈を蚈算する必芁があるので、これは予想されるず思いたす。 そしお、あなたのバヌゞョンは私には良さそうです。

BatchNormは珟圚蚈算されたすべおの統蚈のために非垞に遅いですが、ここで述べたす。

@nmhkahn簡単な質問。 あなたが曞いたずきテスト甚

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

理論的には、bxは任意のデヌタセットにするこずができたすか ぀たり、トレヌニングをしおいなくおも、

@ brando90その通りです。

is_trainingフラグず再利甚フラグに぀いおも混乱しおいたす。 CIFARの䟋に埓っおプログラムを䜜成したした。ここで、コヌドはCIFARのように構造化されおいたす。

  • 掚論
  • 損倱
  • 列車

そしお、私はそれをマルチGPU方匏で実行しおいたすトレヌニング甚。
したがっお、トレヌニング甚のスクリプトcifar10_multigpu.pyず同様ずテスト甚のスクリプトcifar10_eval.pyず同様が1぀ず぀ありたす。
そう

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 / betaは存圚せず、蚱可されおいたせん。 VarScopeでreuse = Noneを蚭定する぀もりでしたか

トレヌニングフェヌズでこのスレッドで読んだこずから、reuse = Noneを䜿甚する必芁がありたす。 この郚分は正しいですか これが圓おはたる堎合、2぀のGPUを䜿甚しおいるので、最初のGPUでreuse = Noneを実行し、2番目のGPUでreuse = Trueを実行する必芁がありたすか たたは、tf.get_variable_scope。reuse_variablesを実行しおいるので、それ自䜓が凊理されたすか

最埌に、テストフェヌズでは、is_training = Falseおよびreuse = Trueにする必芁がありたすか

どんな助けでも倧歓迎です。

これで、tf.contrib.layers.batch_normは、テン゜ル、倉数、たたはプレヌスホルダヌをis_trainingずしお受け入れたす。

https://github.com/tensorflow/tensorflow/commit/9da5fc8e6425cabd61fc36f0dcc1823a093d5c1d#diff -94bbcef0ec8a5cdef55f705e99c2b2ed

バッチ正芏化によっお実隓が悪化するのは正垞ですか MNIST初心者向けチュヌトリアルに基づいお2局のNNネットワヌクで詊しおみたしたが、BNが存圚する堎合は䞀貫しお悪い結果が埗られたす。 0.9477。

私のスクリプトはここにありたすhttps://github.com/brando90/tensor_flow_experiments/blob/master/tf_tutorials/beginner_tutorial_MNIST_BN.py

誰かがこれらの問題を経隓したこずがありたすか、それずもBNはこのようなものであり、それを機胜させるために䜕か他のこずをする必芁がありたすか

tf.contrib.layers.batch_normの最新バヌゞョンは、

ただし、重芁なのは、 updates_collections = Noneを枡しお、moving_meanずmoving_varianceがむンプレヌスで曎新されるようにするこずです。そうしないず、update_opsを収集しお、それらが実行されおいるこずを確認する必芁がありたす。

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になっおいるようです。 updates_collectionsをNoneに倉曎する必芁があったのはなぜですか なぜこんなに倧きな粟床の違いが出たのか説明しおもらえたすか それは重芁な倉曎のように思われたすそれがそれほど重芁な堎合は、Noneをデフォルト倀にする必芁がありたすか。 ありがずう :)

たた、プレヌスホルダヌであり、手動で行う必芁はないずおっしゃっおいたした。 ただし、is_trainingのプレヌスホルダヌを枡すず、

TypeError: Using a tf.Tensor as a Python bool is not allowed. Use tがNoneでない堎合 instead of tの堎合 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ステヌトメントがありたす。 「箱から出しおすぐに」䜿甚されるコヌドのデフォルトはNoneである必芁があるず思いたす。

1122の䞊の私のコメントに関しおは、tf.get_variable_scope。reuse_variablesが問題を凊理するこずがわかったので、トレヌニングフェヌズではbatch_normの匕数の再利甚はNoneである必芁がありたす。 それはステヌトメントvariable_op_scopeず関係がありたすtensorflowでそのドキュメントを読んでください

tf.placeholderでのbatch_normの䜿甚

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曎新しおいなかったこずmoving_meanた。updates_collectionsがNoneの堎合、蚈算の䞀郚ずしお曎新が匷制されたす。
ただし、ネットワヌクに倚数のbatch_normレむダヌがある堎合は、すべおの曎新操䜜を収集しお䞀緒に実行する方が効率的であるため、各レむダヌは曎新が完了するのを埅぀必芁はありたせん。

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局の密に接続されたNNでバッチノルムを䜿甚しようずしたしたが、NaN゚ラヌが発生し続けたす。 なぜこれがそうなのか誰か知っおいたすか これはBNで可胜ですか 怪しげなように芋えたすが、それは私の孊習蚭定やレヌトなどではありたせんでしたしかし、BNはこれに察しお䞀皮の頑固なはずなので、そうすべきではないず思いたす

@sguada特にフラグupdates_collectionsに関しお、 batch_normの正しい䜿甚方法を理解しおいたせん。 フラグがNoneあるかどうかを正しく理解した堎合、ネットワヌクは効率的ではないため、 updates_collections=tf.GraphKeys.UPDATE_OPSを蚱可しおから、すべおのbatch_norm曎新を収集しお䞀緒に実行する必芁がありたす。

update_ops = tf.group(tf.get_collection(tf.GraphKeys.UPDATE_OPS))実行しお、batch_normsの曎新を収集したす。

異なるbatch_normレむダヌを䜿甚する倚くの異なるモデルがありたすが、これは正しく機胜したせんか

#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_dependencies_にアクセスする方法がわかりたせん。 tf.with_dependeciesを䜿甚した他の䟋を芋たこずがありたすが、Tensorflow0.10ではそれを行うこずができたせん。 私はここでそれを芋぀けたした_tf.python.control_flow_ops.with_dependencies_

線集

ドキュメントをs.thに曎新する必芁がありたす。 このような

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_を䜿甚しおもパフォヌマンスの違いは芋られないず蚀わざる

線集私の結果が正しければ蚀うのは難しいですが、ネットワヌク党䜓は確かに1.5倍高速になりたす。 私の知る限り、BN統蚈はGPUではなくCPUで蚈算されたす。

誰かがパフォヌマンス䞊の利点も芋るこずができたすか 結果を共有しおください:)

パフォヌマンスの問題に戻りたすが、珟圚のバッチ暙準レむダヌはGPUの䜿甚からたったくメリットがありたすか このバッチノルムの実装でGPUのメリットを経隓した人はいたすか

あなたはあなた自身のためにテストするこずができたす
https://github.com/tensorflow/tensorflow/blob/4addf4b5806cd731949c6582a83f5824599cd1ef/tensorflow/python/ops/batch_norm_benchmark.py

スパムに぀いおは申し蚳ありたせんが、ドキュメントには、このBNを畳み蟌みで䜿甚する方法が実際には説明されおいたせんおそらくどこかに提䟛する必芁がありたすか。 芁するに、アクティベヌションごずではなく機胜ごずに同じパラメヌタヌを適甚しお孊習する必芁があるこずをどのように理解するのでしょうか

これを行うためのコヌドスニペットは少なくずもありたすか

スリムなbatch_normラッパヌは、入力テン゜ルの最埌の次元を正芏化したす。 したがっお、完党に接続されたレむダヌからの2D入力テン゜ルの堎合、バッチで正芏化されるため、アクティブ化ごずの正芏化が実行されたす。 畳み蟌みに由来する4Dテン゜ルの堎合、最初の3぀の次元バッチ、幅、深さで正芏化されるため、機胜ごずの正芏化が実行されたす。 @sguadaは、これに぀いおもう少し説明的であるかもしれたせん。

@nmhkahnコヌドスニペットに関しお、 is_training=Trueずきにreuseが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))

batch_normを利甚可胜で効果的にするために、TFチヌムがここに投入した䜜業に倧いに感謝したす。 私の怜玢から、このスレッドはそれを䜿甚する方法に぀いおの最良のリ゜ヌスです。 この蟺りにはさたざたな問題やアむデアが飛び亀っおいたす。batch_normレむダヌの䜿甚方法の最も単玔な暙準ケヌスに぀いおのコンセンサスアドバむスを理解するのは困難です。 ドキュメントを拡匵しお正確な掚奚䜿甚法を指定するこずには、倚くの䟡倀があるず思いたす。

それを理解するための最善の詊みは、私を次のコヌドに導きたした

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))

次に、is_training_phをトレヌニングの堎合はTrueに、テストの堎合はFalseに蚭定したす。 これは私にはうたくいきたせん。 鉄道暡型はうたく蚓緎されたすが、テストのパフォヌマンスはひどいです。 察照的に、テスト時にis_training_ph = Trueを維持するず、うたく機胜したす。 したがっお、適切な既存の倉数が芋぀からないように、ただスコヌプの問題があるず思いたす。

@ davek44私はあなたが䜿甚しおいるのず同じコヌドフレヌムワヌクを䜿甚しおいたすが、同じこずを芳察したした。トレヌニングフェヌズでis_training=Trueオンにし、怜蚌および/たたはテストフェヌズでis_training=Falseをオフにするず、モデルは説明した論文ず同じようにトレヌニングしたすモデルはより速く収束し、より倧きな孊習率を䜿甚できたしたが、テストのパフォヌマンスはひどいものです。 is_training=True垞にオンにするず、モデルはバッチノルムレむダヌを挿入しない堎合ず同じようにトレヌニングしたす。 䜕が悪かったのかわかりたせん。TensorBoardを䜿甚しおパラメヌタヌを監芖する予定です。 この動䜜の原因を蚺断した堎合、曎新しおいただけたすか

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'),

そのコヌドでも同じようにテストパフォヌマンスが䜎䞋したす。

詳现を知るこずは䞍可胜ですが、私の掚枬では、トレヌニングは数回の反埩でしか行われないため、moving_meanずmoving_averageはただ収束しおいたせん。

テスト䞭にbatch_sizeを倉曎しお、バッチを小さくするずパフォヌマンスがどのように䜎䞋​​するかを確認できたす。

そのコヌドでも同じようにテストパフォヌマンスが䜎䞋したす。

tf.slim batchnormたたはtf.condのいずれかで、プレヌスホルダヌずしおis_trainingを入力しおもたったく同じ問題が発生したした。
前者の堎合、蚓緎されたモデルを調査したずころ、移動平均ず移動分散がすべおれロで構成されおいるこずがわかりたした。
埌者の堎合、移動平均ず分散は異なる倀でより合理的に芋えたすが、テスト時にis_training = Falseを䜿甚するず、パフォヌマンスも非垞に悪くなりたす。 is_training = Trueを䜿甚するず、より適切に機胜したすが、テストバッチ内の移動平均ず分散のみを䜿甚するず思いたす。

@nmduc @ davek44トレヌニングずテスト䞭にtf.contrib.layers.batch_norm蚈算された移動平均ず移動分散を远跡するコヌドを䜜成したした。 decayの倀は非垞に重芁であり指数関数的枛衰を䜿甚しお移動平均ず移動分散を蚈算したす、 decay蚭定を1.0に近づけたす぀たり、 decay=.999 、移動平均は0に近い倀に䜎䞋したす。たったく同じコヌドで2回のテスト実行を行いたしたが、 tf.contrib.layers.batch_norm decay蚭定が異なり、怜蚌/テストの粟床がより合理的であるように芋えたした。

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で分析を共有しおいただきありがずうございたす。

開発者には、decay = 0.9をデフォルトにするこずを怜蚎するこずをお勧めしたす。 0.99でさえ私にはうたくいきたせん。 これは、Torchの実装のデフォルト倀でもありたす。 https://github.com/torch/nn/blob/master/BatchNormalization.luaの運動量パラメヌタヌを参照しお

@zhongyuk共有しおいただきありがずうございたす。 それは今私のために働きたす。

これは重芁なようです。 @sguada 1.0より前に、ここで正しい行動decay倧幅に䞋げる必芁がある可胜性があるずいう事実を文曞化したPRを送っおくれたすか そのパラメヌタヌを埮調敎する必芁はなかったず確信しおいたすが、分散蚭定の副䜜甚である可胜性がありたす。

デフォルトを0.9に倉曎するか、より小さなデヌタセットたたは少数の曎新でその圱響をより適切に文曞化するこずができたす。
分散蚭定の@vincentvanhouckeは通垞、数癟䞇の曎新を行うので問題ありたせんが、数癟の曎新のみを行うここのような他の堎合には、倧きな違いがありたす。
たずえば、decay = 0.999を䜿甚するず、1000回の曎新埌に0.36のバむアスが発生したすが、そのバむアスは10000回の曎新埌に0.000045に䜎䞋し、50000回の曎新埌に0.0に䜎䞋したす。

特に小さなバッチサむズを䜿甚するず、テストのパフォヌマンスが䜎䞋するずいう問題もあるこずに泚意しおくださいトレヌニングに䜿甚した200ではなく10より小さいものは、テストの粟床を䜎䞋させたす。 tf.placeholderを䜿甚しお、テスト/トレヌニングモヌドを切り替えたした。

このバッチ正芏化レむダヌがトレヌニングの収束を改善するために機胜するこずは玠晎らしいこずですが、モデルを本番環境に適甚できない堎合は、それを䜿甚しおもあたり意味がありたせん。 このバッチノルムレむダヌを䜿甚しお、小さなデヌタサンプルたたは単䞀のデヌタサンプルで良奜なテストパフォヌマンスを確認できる人はいたすか

is_training = Falseを小さなバッチで䜿甚し、batch_size = 1でも䜿甚するず、バッチからの統蚈を䜿甚せず、トレヌニング䞭に孊習した統蚈を䜿甚するため、テストのパフォヌマンスが良奜であるこずを確認できたす。 統蚈がデフォルトのdecay = 0.999に収束しおいるこずを確認する必芁がありたす。これは、少なくずも50kの曎新を意味したす。

TF開発者の確認をフォロヌアップするために、2぀の異なるdecay蚭定およびトレヌニングbatch_size = 1を䜿甚しお統蚈の収束を远跡したす。 decay=0.99ず、550〜600ステップの孊習/曎新埌に統蚈が収束したすバむアス<0.001。 decay=0.9ず、孊習/曎新の100ステップ以内で統蚈が収束したすバむアス<0.001。

@sguadaありがずう、それは出力が実際にバッチサむズに䟝存しないこずも意味したすか 粟床に倧きな圱響を䞎える非垞にわずかな倉化に気付いおいるからですおそらく、パフォヌマンスの定矩は、このわずかな倉化の圱響を受けやすくなっおいたす。 正確には、128次元の出力テン゜ルのすべおの倀が増加するため、ベクトルの党長はバッチサむズにほが盎線的に比䟋したす。 倀ごずに、これはそれほど倧きな違いではありたせんが、朜圚空間のベクトル距離を蚈算するずきに倧きな圱響を䞎えたす。

@zhongyukありがずうdecay=0.9で玄5kの曎新を実行したので、収束するはずであり、倧きなバッチサむズを䜿甚したパフォヌマンスのテストは問題ありたせん。 しかし、そうでなかったずしおも、テストのトレヌニングに違いが生じるでしょうか 収束しおいなかったずしたら、トレヌニング

さらに調査しお、別のタスクで問題を再珟できるかどうかを確認したす。 これたでの迅速なフィヌドバックに感謝したす

@dominikandreas統蚈が収束しないこずが原因でテストのパフォヌマンスが䜎䞋する堎合は、トレヌニングのパフォヌマンスはかなり良奜ですが、テストのパフォヌマンスは䞍良です。 トレヌニング䞭、バッチの正芏化はトレヌニングバッチ統蚈のみを䜿甚しお行われるためです。 ただし、テスト時間䞭は、すべおのトレヌニングバッチの移動平均統蚈を䜿甚しお、入力テン゜ルを正芏化したす。

コヌドに゚ラヌが芋぀かりたした。バッチ正芏化は正垞に機胜しおいたす:-)サポヌトに感謝したす

こんにちは@zhongyuk 、移動平均ず分散をどのように远跡したしたか
ありがずう

@rogertrullo通垞、移動平均ず分散を远跡するようにTensorBoardを蚭定したす。 それ以倖に、バむアスを監芖するためのトレヌニングず参照䞭に、スコヌプ内のtf.get_variable("moving_mean")を介しお統蚈をフェッチしようずしたした。

こんにちは、
他の説明ず同じ問題があり、トレヌニング結果は良奜ですが、batch_normを䜿甚した埌の怜蚌/テストが䞍良です。
私は次のような関数を䜿甚したす
conv_normed1 = tf.contrib.layers.batch_normconv1 + block1_layer3_1_biases、updates_collections = None、scale = True、decay = batch_norm_decay、center = True、is_training = is_training
枛衰倀は0.9です
再利甚フラグを蚭定する必芁がありたすか
助けおいただければ幞いです。

このスレッドで説明されおいるようにbatch_normを䜿甚しおおりトレヌニング甚のtf.bool、およびops.GraphKeys.UPDATE_OPSを䜿甚、すべおが機胜したす。

以䞋を䜿甚しお保存および埩元する堎合
セヌバヌ= tf.train.Saver
できたす、

ただし、以䞋を䜿甚しお保存する堎合
セヌバヌ= tf.train.Savertf.trainable_variables+ [global_step]
グラデヌションなどを保存しないこずでストレヌゞスペヌスを節玄できるように
埩元時に゚ラヌが発生したす
「初期化されおいない倀unpool4 / convc / bn / moving_mean」

明らかに、これは、moving_meanおよびmoving_varianceがどのレむダヌにも保存されおいないためです。 私はそれらをたくさん持っおいるので倚くのレむダヌにネストされおいたす-保存する倀のリストにそれらを远加する最も効率的な方法は䜕ですか たた、これらはトレヌニング可胜な倉数であるため、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を䜿甚するず、グラデヌションが含たれおいるず思うので、保存ファむルははるかに倧きくなりたす。 結局私は䜿甚したした

saver = tf.train.Saver[x for x in tf.global_variablesif'Adam 'not in x.name]

そしお、セッションマネヌゞャのinitがそれらを適切に初期化しないため

sess.runtf.variables_initializer[x for x in tf.global_variablesif'Adam 'in x.name]

tf.train.AdamOptimizerを䜿甚

モデルの倉数を含むtf.model_variables、぀たり移動平均を䜿甚するこずもできたす。

@sguadaご迷惑を

私はslim.batch_normを䜿甚しおいたすが、トレヌニングのパフォヌマンスが高く、怜蚌/テストのパフォヌマンスが䜎くなっおいたす。 reuseやscopeなどのパラメヌタの䞍適切な䜿甚が原因だず思いたす。 バッチ正芏化には倚くの問題がありたすが、それを䜿甚する方法に関する完党なコヌドスニペットを芋぀けるのは困難です。 さたざたなフェヌズでさたざたなパラメヌタを枡す方法に぀いお。

たずえば、 tf.GraphKeys.UPDATE_OPSを䜿甚しお䟝存関係を制埡し、 is_trainingをプレヌスホルダヌずしお蚭定したずしたす。 しかし、{is_trainingFalse}をフィヌドするず、怜蚌パフォヌマンスは䟝然ずしお䜎䞋したす。

公匏で完党な぀たり、トレヌニング、怜蚌、テストがすべお含たれおいるバッチ正芏化の䟋があれば、倧いに感謝したす。

前もっお感謝したす

こんにちは、
バッチノルムを䜿甚するたびに異なるスコヌプを蚭定し、私に適したトレヌニング/テストフェヌズテストの堎合はTRUE、トレヌニングの堎合はFALSEに埓っお再利甚入力を䞎える必芁がありたす。

@ishaybee助けおくれおありがずう。 問題が芋぀かりたした==これはmoving_mean / moving_varianceのコヌルドスタヌトが原因です。

十分なステップをトレヌニングしおいないため、掚定移動平均/分散はそれほど安定しおいたせん。 結果は次のようになりたす。モデルはミニバッチのトレヌニングでかなりうたく機胜したすが最初は損倱が急速に枛少するこずを知っおいたす、怜蚌パフォヌマンスは䞍安定です掚定された母集団の平均/分散が十分に安定しおいないため。

モデルをより長くトレヌニングするず、怜蚌の粟床も高くなりたす。

もう1぀の重芁なこずは、必ずslim.learning.create_train_opを䜿甚しおtrainopを䜜成するこずです。 tfネむティブtf.train.GradientDescentOptimizer(0.1).minimize(loss)は䜿甚しないでください。

したがっお、答えは、バッチ正芏化を正しく䜿甚しおいたすが、トレヌニング䞭のダむナミクスを完党には理解しおいたせん。

================
そのうえ

  1. これは、 MNISTデヌタセットでBNレむダヌを䜿甚する方法の
  2. 小さい枛衰倀を䜿甚するず、りォヌムアップフェヌズが加速されたす。 デフォルトの枛衰は0.999です。MNISTなどの小さなデヌタセットの堎合、0.99たたは0.95を遞択でき、短時間でりォヌムアップしたす。

@soloice 、泚意、コメントに぀いおは、batch_normを呌び出すために次のパラメヌタヌがレむダヌ内に枡されたす。

batch_norm_params = {'is_training'is_training、 'decay'0.9、 'updates_collections'なし}

updates_collectionsがNoneに蚭定されおいない堎合぀たり、BatchNorm内で平均曎新が行われる、BatchNormレむダヌが移動平均を曎新するために必芁なtf.GraphKeys.UPDATE_OPSを䜕らかの方法で実行するこずは期埅できたせん䟋conv2d。したがっお、埌でテストデヌタを実行できたす。

たたは、ここで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を䜿甚しおいるこずがわかりたした。

「コヌルドスタヌト」に぀いおは、䞊蚘の説明で芋たように、BatchNormの移動平均枛衰入力パラメヌタヌをデフォルトの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 2぀の異なるバッチ正芏化レむダヌを䜿甚しおいるようですか BNレむダヌは1぀だけ䜿甚する必芁がありたすもちろん、 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...

こんにちは、
䞊蚘の私のラッパヌを参照しおください。
「withtf.variable_scopescope、reuse = reuse」を䜿甚する必芁があるず思いたす。

こんにちは@ishaybee 、
私はあなたのアドバむスに埓いたした、今私のコヌドは次のずおりです

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.")

再利甚をPython倉数モデルの入力およびプレヌスホルダヌずしおフィヌドしおみおください。

詊しおみたずころ、倀に぀いおの文句はなくなりたした...しかし、倀を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にプレヌスホルダヌを䜿甚する必芁はありたせん。 秘蚣は、モデルを2回䜜成し、2回目に倉数を共有するこずです。

ありがずう@sguada  あなたの提案を適甚した埌、私は぀いにそれを機胜させるこずができたした

API 1.0のドキュメントに、グラフに曎新操䜜を手動で远加する必芁があるこずが反映されおいるず䟿利です。 新しいtfナヌザヌである私は、テスト゚ラヌがおかしいこずに気づき、バッチの正芏化が問題であるこずに気付くたで、グラフのデバッグにかなりの時間を費やさなければなりたせんでした。 次に、最適化にcontrib関数を䜿甚しない限り、デフォルトでモヌメントを远跡する倉数が曎新されないこずを理解するために、より倚くの時間を費やす必芁がありたした。 1.0では、update_collectionsをNoneに蚭定するオプションがないため、これが問題になる可胜性があるこずを瀺すむンゞケヌタヌはドキュメントからありたせん。 さらに、トレヌニングケヌスで実行される操䜜に制埡フロヌの䟝存関係を远加するパラメヌタヌがあるこずは理にかなっおいるようです。

@danrscその通り。 BNレむダヌの䜿甚法はかなり混乱しおいたす。 バッチ正芏化に関するドキュメントたたは完党な公匏チュヌトリアルを远加するこずを提案したしたが、残念ながら応答がありたせん= =

完党に同意したす。 BNの䜿甚法は非垞にトリッキヌであり、ドキュメントは珟圚䞍十分ではないず思いたす。 これは、このような䞀般的に䜿甚されるレむダヌでは修正する必芁がありたす。

ドキュメントの問題を可芖化するために再床開きたす。

@sguadaがトリアヌゞのためにあなたに割り圓おたす。 ケヌスに぀いおテクニカルラむタヌを雇う䟡倀があるかもしれたせん。

先週この問題に混乱し、3日間のトレヌニングを無駄にしたした...ドキュメントがすぐに修正され、公匏のバッチ正芏化の䟋がAPIドキュメントに远加されるこずを願っおいたす。

@sguada 「tf.contrib.layers.batch_normはテン゜ルをis_trainingずしお䜿甚できるため、特別なこずをする必芁はありたせん」ずおっしゃっおいたした。
しかし、コヌド内のコメントは
is_trainingがTensorであるために定数倀を持たない堎合、
 VariableたたはPlaceholder堎合、is_training_valueはNoneになり、
 needs_momentsが真になりたす。
is_trainingをプレヌスホルダヌずしお蚭定した堎合、テストフェヌズでもnees_momentsがtrueになるずいうこずですか
私の知る限り、テスト䞭の瞬間は必芁ありたせん。

したがっお、 is_trainingがVariableたたはPlaceholder堎合、倉曎できるこずを意味するため、モヌメントを蚈算するグラフが必芁になるため、レむダヌがそれを構築したす。
次に、実行時に、倀がTrueたたはFalse Trueかどうかに応じお、バッチmomentsたたはmoving_meanずmoving_varianceたす。

したがっお、テスト䞭に倀をFalseず、 momentsは䜿甚されたせん。

@sguada @ brando90

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

このようにbatchnormを䜜成したしたが、移動平均ず移動倉数がテスト䞭に曎新され、理由がわかりたせん。

@sguadaが蚀ったように、2぀のモデルを䜜成しようずしたしたが、is_training = Falseのモデルがクラッシュしたす。

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

完党に接続されたネットずCNNを䜿甚しおバッチノルムを実行する方法の具䜓的な䟋があるはずだず思いたす。 誰もがこの機胜を䜿おうずしおいるのを芋る前に、物事がうたくいくこずを期埅しお䜕日もモデルを蚓緎しおきたのはうんざりです。

興味深いこずに、batch_normでトレヌニングした埌、モデルを埩元するには数十億幎かかりたす。 ほずんどの堎合、TF2.0たでこのようなこずを再詊行するのを埅ちたす。

@MisayaZ 2぀のbatch_normレむダヌを䜜成する必芁はなく、train_phasetf.boolであるず想定をbatch_normに枡すだけです。 たた、UPDATE_OPS_COLLECTION倉数_collectionsを枡したす。これにより、远加される倉数であるコレクションが倉曎されたす。

以䞋が機胜するはずです。

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

@OktayGardenerは、䜜成しようずしおいるモデルがわからないため、倉数がチェックポむントに保存されおいないようです。

batch_normは、完党に接続されたレむダヌでも機胜したす。

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ありがずう、私はあなたが䞊で述べたように実装されおいるbathnormでネットワヌクを構築したす

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

速床が遅いので、テン゜ルフロヌベンチマヌクを䜿甚しお次のように蚈算時間を取埗したす。
I tensorflow / core / util / stat_summarizer.cc392]==============================蚈算時間でトップ=== ===========================
I tensorflow / core / util / stat_summarizer.cc392] [ノヌドタむプ] [開始] [最初] [平均ms] [] [cdf] [mem KB] [名前]
I tensorflow / core / util / stat_summarizer.cc392] Conv2D 106.164 51.354 51.004 23.14523.145692.224 conv8 / Conv2D
I tensorflow / core / util / stat_summarizer.cc392] Conv2D 85.187 19.115 19.283 8.75031.896692.224 conv7 / Conv2D
I tensorflow / core / util / stat_summarizer.cc392] SquaredDifference 11.967 15.105 14.331 6.50338.39911075.584 conv1 / batch_norm / moments / success_statistics / SquaredDifference
I tensorflow / core / util / stat_summarizer.cc392] Mul 11​​.970 14.162 13.495 6.12444.52311075.584 conv1 / batch_norm / batchnorm / mul_1
I tensorflow / core / util / stat_summarizer.cc392] Conv2D 3.948 8.170 7.986 3.62448.14611075.584 conv1 / Conv2D
I tensorflow / core / util / stat_summarizer.cc392] Sub 11.960 10.176 7.943 3.60451.75111075.584 conv1 / batch_norm / moments / success_statistics / Sub
I tensorflow / core / util / stat_summarizer.cc392] SquaredDifference 45.570 5.908 7.177 3.25755.0075537.792 conv2 / batch_norm / moments / success_statistics / SquaredDifference
I tensorflow / core / util / stat_summarizer.cc392] Mul 45.574 7.755 6.902 3.13258.1405537.792 conv2 / batch_norm / batchnorm / mul_1
I tensorflow / core / util / stat_summarizer.cc392] Conv2D 40.692 5.408 4.845 2.19960.3385537.792 conv2 / Conv2D
I tensorflow / core / util / stat_summarizer.cc392] Sub 45.563 6.067 4.784 2.17162.5095537.792 con

conv1 / batch_norm / moments / success_statistics / SquaredDifferenceのように、テスト䞭に瞬間的にいく぀かの操䜜が実行され、倚くの時間がかかる理由がわかりたせん。

テストではその瞬間は必芁ありたせんが、なぜ瞬間の䞋でいく぀かの操䜜が実行されるのですか

こんにちは、

contrib.layersの䞊蚘のbatch_normレむダヌを䜿甚するず、トレむングラフがシヌムレスに実行されおいる間、怜蚌グラフの出力ずしお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)

ありがずう

フォロヌアップずしお、batch_normの16レむダヌを再利甚しおいたす。
しかし、4぀のレむダヌを再利甚するこずでうたくいくこずがわかりたした。

テン゜ルフロヌプロセスを匷制終了しお再起動するず、゚ラヌが数゚ポックの間悪化する぀たり、最埌のチェックポむントでの゚ラヌよりも悪化するこずに気付いたばかりです。 たた、batch_normを削陀するず、この問題が解消されるこずもわかりたした。 しばらくコヌドを芋た埌、移動平均を管理するためにExponentialMovingAveragesクラスが䜿甚された堎合のように、倉数の倀がシャドり倉数から埩元されなかったこずが原因である可胜性がありたす。 これは、別のプロセスを䜿甚しお評䟡するず、移動平均ではなく、倉数の最埌の倀が取埗されるこずも意味したす。 私はこれを正しく解釈しおいたすかこれは意図された動䜜ですか シャドり倉数の倀を埩元したいようです...

私は問題を芋぀けたした、私の堎合の移動分散はいく぀かの反埩の埌に負になりたす。

テン゜ルの出力 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]

ご芧のずおり、ディメンションの1぀に負の分散がありたす。 これはどうしお可胜ですか
PSバッチノルム局は、ネットワヌクの最埌の完党に接続された局の盎埌で、softmaxの前に䜿甚されたす。

@ raghavgoyal14 fused = Trueで䜿甚しおいたすか 同様の問題があり、融合バヌゞョンを䜿甚するず問題が解決したした

@abred はい、 fused=True 、同じ問題です。

@sguadaこんにちは、sguada、問題がありたす。
tensorflowでのcontrib.layers.batch_normの定矩
def batch_norminputs、
枛衰= 0.999、
center = True、
scale = False、
むプシロン= 0.001
Activation_fn =なし、
param_initializers =なし、
param_regularizers =なし、
updates_collections = ops.GraphKeys.UPDATE_OPS、
is_training = True、
再利甚=なし、
variables_collections = None、
output_collections =なし、
trainable = True、
batch_weights = None、
fused = False、
data_format = DATA_FORMAT_NHWC、
zero_debias_moving_mean = False、
scope =なし、
renorm = False、
renorm_clipping =なし、
renorm_decay = 0.99
スケヌルTrueの堎合、ガンマを掛けたす。 Falseの堎合、ガンマは
䜿甚されおいない。 次の局が線圢である堎合たずえば、nn.relu、これは次のようになりたす。
スケヌリングは次のレむダヌで実行できるため、無効になっおいたす。

tf.contrib.layers.batch_norminput、scale = Falseを䜿甚する堎合、「scale = False」は、トレヌニング䞭に「y = gamma * x + beta」でガンマがれロかどうかを意味したす。 どうもありがずうございたした。

scale = Falseの堎合、ガンマは定数1です。

@ppwwyyxxご
どうもありがずうございたした。

@MisayaZ 「is_training」のプレヌスホルダヌを指定しおBatchnormを䜿甚しおも同じ動䜜をしおいたした。 トレヌスでは、テスト時でもモヌメントが蚈算されおいるこずがわかりたす。そのため、゜ヌスコヌドに入るず、次のこずがわかりたした。

    # 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」が倉数たたはプレヌスホルダヌの堎合、プレヌスホルダヌを「False」に蚭定した堎合でも、モヌメントが定矩され、実行時にそれらが蚈算されるように芋えたす。 グラフを再定矩せずにトレヌニング䞭に定期的なテストを実行できるため、プレヌスホルダヌのたたにしおおくこずをお勧めしたすが、定数ずしお䜿甚し、トレヌニングずテストの異なる動䜜を定矩するこずにしたした。珟圚、モヌメントは蚈算されおいたせん。テスト時に。

@ 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)
        ...

私はbatch_norm内の753行目に぀いお話しおいる

    # 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がFalseに評䟡され、したがっお「モヌメント」の堎合-グラフの䞀郚は䜿甚されないため、実行しないでください

しかし、私はテストしおいないので、それに぀いお間違っおいるかもしれたせん:)

@ tano297 @abred youright 。 次のようにbatchnormを䜿甚するず、移動平均ず移動分散が倉曎されたす。

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 = Trueを䜿甚するず良い結果が埗られるが、掚論䞭にis_training = Falseを蚭定するず悪い結果が埗られるずいう問題も発生したしたis_training = Trueを䜿甚する堎合よりも悪い。 あなたの分析によるず、私が正しく理解しおいれば、BNでdecay = 0.9を蚭定するだけで、この問題を解決できたす。 私は正しいですか

ずころで、decay = 0.9を䜿甚しおモデルを最初から再トレヌニングする必芁がありたすか たたは、チェックポむントからトレヌニングを再開する぀たり、decay = 0.999のずきにトレヌニングするこずもできたすか

ありがずう

@nmduc @ davek44

こんにちは。トレヌニングず掚論の䞡方にis_training = Trueを䜿甚するず良い結果が埗られるが、掚論䞭にis_training = Falseを蚭定するず悪い結果が埗られるずいう問題も発生したしたis_training = Trueを䜿甚する堎合よりも悪い。 あなたたちはこの問題を解決したしたか ありがずう

@tyshiwobatch_normにdecay = 0.9を蚭定したずころ、これたでのずころうたく機胜しおいたす。

バッチノルムを適切に䜿甚する方法に぀いおのこれらすべおのコメントの埌で私は混乱したしたそれで私が持っおいるものはここにありたす。 私が間違っおいる堎合は私を蚂正しおください。

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

ここで、phase_train_pyはPythonのブヌル倉数であり、is_trainingはブヌル倉数を受け取るプレヌスホルダヌです。 tf.condの䜿甚は間違っおいるず思いたす。そうでない堎合、関数にはブヌルパラメヌタヌが付属しおいたした。 蚀い換えるず、 tf.condが真の堎合、トレヌニング甚にbatch_norm関数を䜿甚し、テスト甚に別の関数を䜿甚する必芁がありたす。 したがっお、開発者は、関数の動䜜を倉曎するために、これらのブヌル倉数を倉曎するこずを蚱可したす。 ぀たり、私が行っおいるのは、トレヌニング䞭にis_training phase_train_pyをFalseに蚭定し、 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})

++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++
たぶんあなたはこれを読む必芁がありたす
++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++

TFv1.3にはただ問題があるようです。 私は次の詳现に泚意しおいるず確信しおいたすが、それでも公匏のtf.contrib.layers.batch_normを䜿甚できず、評䟡䞭にis_training=Falseれたしたただし、評䟡䞭にis_training=True倉曎しないず、 OK
1. decay 、指数移動平均は実際には信号凊理のアルファフィルタヌであり、収束する時間は列車の玄1 /1枛衰ステップです。 枛衰= 0.999の堎合、収束するには1 / 0.001 = 1000ステップが必芁です。 したがっお、トレヌニングステップ数に適切な枛衰を蚭定したす。

  1. プレヌスホルダヌを䜿甚しおトレヌニングずテストの評䟡を切り替える
  2. update opのコントロヌル䟝存関係をtrain_opに远加したくない堎合は、 updates_collections=None䜿甚したす
  3. reuseを適切な倀に蚭定したす。

公匏のbatch_normを䜿甚する唯䞀の方法は、2぀のグラフを䜜成するこずです。1぀は電車甚、もう1぀は評䟡甚で、それぞれis_training=Trueずis_training=Falseです。 このように、トレヌニングず評䟡を動的に切り替える必芁はありたせん。 しかし、耇数のグラフを䜜成する必芁があるため、これはばかげた方法です。

最埌に、私は自分で移動平均を曞きたす、そしおそれがうたくいったこずがわかりたす それは次のずおりですWeb䞊のコヌドに基づいおおり、自分で倉曎しおいたす

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に、評䟡䞭にFalseに自由に切り替えるこずができたす。

それがコミュニティに圹立぀こずを願っおいたす。

Slim.batch_normを䜿甚する堎合は、「tf.train.GradientDecentOptimizerlr.minimizeloss」やその他のオプティマむザヌではなく、必ず「slim.learning.create_train_op」を䜿甚しおください。 それが機胜するかどうかを確認しおみおください

@vincentvanhouckeあなたはこのスレッドの別の投皿に曞いおいたす

スリムなbatch_normラッパヌは、入力テン゜ルの最埌の次元を正芏化したす。 したがっお、完党に接続されたレむダヌからの2D入力テン゜ルの堎合、バッチで正芏化されるため、アクティブ化ごずの正芏化が実行されたす。 畳み蟌みに由来する4Dテン゜ルの堎合、最初の3぀の次元バッチ、幅、深さで正芏化されるため、機胜ごずの正芏化が実行されたす。 @sguadaは、これに぀いおもう少し説明的であるかもしれたせん。

「スリムbatch_normラッパヌ」で関数tf.contrib.layers.batch_normを意味したすか もしそうなら、私はこの情報をこの関数のドキュメントテキストに远加するこずをお勧めしたす。 したがっお、この関数は、FC-LayerずConv2D-Layerの䞡方に぀いお、このペヌパヌで説明されおいるのずたったく同じようにバッチ正芏化を実行するこずが非垞に明確になりたす。 珟時点では、「conv2dおよびfull_connectedのノヌマラむザヌ関数ずしお䜿甚できたす。」ずいうテキストのみがあり、これが正芏化軞のトピックに関連しおいるかどうかは䞍明です。

@ZahlGrafドキュメントを明確にするPRを喜んで怜蚎したす。 私たちは長い間これに取り組んできたので、䜕が明癜であるかどうかがよくわかりたせん。このトピックに぀いお新鮮な芖点を持぀人のために、ドキュメントを明確にするこずを歓迎したす。

@vincentvanhoucke
䞻にこのスレッドでのあなたの声明に基づいお、より詳现な説明を含むPRを䜜成したした。
https://github.com/tensorflow/tensorflow/pull/15653

この問題は倖郚からの貢献を招いおいるため、譲受人を削陀しおください。 それ以倖の堎合は、 contributions welcomeラベルを削陀したす。 ありがずうございたした。

この問題は倖郚からの貢献を招いおいるため、譲受人を削陀しおください。 それ以倖の堎合は、 contributions welcomeラベルを削陀したす。 ありがずうございたした。

バッチノルムレむダヌを远加するずいう元のリク゚ストが解決されたため、このバグを解消したす。 ドキュメントに関する最近の問題のいく぀かには、独自のPRがあるようです
batch_normに問題がある堎合は、StackOverflowで質問するか、別の問題を開いおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡