1. ホーム
  2. tensorflow

Tensorflowシリーズ:tf.contrib.layers.batch_norm

2022-02-11 06:50:49
tf.contrib.layers.batch_norm(
    inputs,
    decay=0.999,
    center=True,
    scale=False,
    epsilon=0.001,
    activation_fn=None,
    param_initializers=None,
    param_regularizers=None,
    updates_collections=tf.GraphKeys.UPDATE_OPS,
    is_training=True,
    reuse=None,
    variables_collections=None,
    outputs_collections=None,
    trainable=True,
    batch_weights=None,
    fused=None,
    data_format=DATA_FORMAT_NHWC,
    zero_debias_moving_mean=False,
    scope=None,
    renorm=False,
    renorm_clipping=None,
    renorm_decay=0.99,
    adjustment=None
)

バッチ正規化。内部共変量シフトの低減によるディープネットワーク学習の高速化"

セルゲイ・イオフ、クリスチャン・セゲディ



バッチ正規化は、内部共分散を減らすことによって、ニューラルネットワークの学習を加速させます。




conv2dとfully_connectedの正規化関数として使用できる。


パラメータです。

1入力です。入力

2 decay:減衰係数。トレーニングセットの性能が良く,バリデーション/テストセットの性能が悪い場合,以下のように選択する.

小さな係数(0.9を推奨)にする。安定性を高めたい場合は、zero_debias_moving_meanをTrueに設定する。

3 中心:Trueの場合、ベータオフセットあり、Falseの場合、ベータオフセットなし

4 scale: Trueの場合、ガンマを乗じる。Falseの場合、ガンマは使用されない。次のレイヤーが線形である場合(nn.reluなど)、スケーリングは次のレイヤーで行うことができるので

ので、レイヤーを無効にすることができます。

5 イプシロン:ゼロによる除算を回避する

6 activation_fn: 活性化用、デフォルトは線形活性化関数

7 param_initializers : ベータ、ガンマ、移動平均、移動分散に関する最適化初期化処理

8 param_regularizers : ベータおよびガンマ正則化の最適化

9 updates_collections : update_ops は train_op で実行される必要がある。Noneの場合、制御依存性を

更新が計算されることを保証する。

10 is_training: このレイヤーがトレーニングモードであるかどうか。学習モードでは、与えられた指数移動平均を用いて、移動統計量 moving_mean と moving_variance を蓄積する。 

decay. when it is not in training mode, then it will use the values moving_mean and moving_variance.



11 scope: optional scope variable_scope






Note: During training, moving_mean and moving_variance need to be updated. by default, the update operation is put into
tf.GraphKeys.UPDATE_OPS, so you need to add them as dependencies on train_op
. Example.
  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops): train_op = optimizer.minimize(loss)
It is possible to set updates_collections = None to force updates, but this may result in a loss of speed, especially in a distributed setup.
Returns the output of this operation
API: https://tensorflow.google.cn/api_docs/python/tf/contrib/layers/batch_norm




ministの例です。

import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


# define our typical fully-connected + batch normalization + nonlinearity set-up
def dense(x, size, scope):
    return tf.contrib.layers.fully_connected(x, size,
                                             activation_fn=None,
                                             scope=scope)


def dense_batch_relu(x, phase, scope):
    with tf.variable_scope(scope):
        h1 = tf.contrib.layers.fully_connected(x, 100,
                                               activation_fn=None,
                                               scope='dense')
        h2 = tf.contrib.layers.batch_norm(h1,
                                          center=True, scale=True,
                                          is_training=phase,
                                          scope='bn')
        return tf.nn.relu(h2, 'relu')


tf.reset_default_graph()
x = tf.placeholder('float32', (None, 784), name='x')
y = tf.placeholder('float32', (None, 10), name='y')
phase = tf.placeholder(tf.bool, name='phase')

h1 = dense_batch_relu(x, phase,'layer1')
h2 = dense_batch_relu(h1, phase, 'layer2')
logits = dense(h2, 10, 'logits')

with tf.name_scope('accuracy'):
    accuracy = tf.reduce_mean(tf.cast(
            tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1)),
            'float32'))

with tf.name_scope('loss'):
    loss = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))


def train(mnist):
    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    with tf.control_dependencies(update_ops):
        # Ensures that we execute the update_ops before performing the train_step
        train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())

    history = []
    iterep = 500
    for i in range(iterep * 30):
        x_train, y_train = mnist.train.next_batch(100)
        sess.run(train_step,
                 feed_dict={'x:0': x_train,
                            'y:0': y_train,
                            'phase:0': 1})
        if (i + 1) % iterep == 0:
            epoch = (i + 1)/iterep
            tr = sess.run([loss, accuracy],
                          feed_dict={'x:0': mnist.train.images,
                                     'y:0': mnist.train.labels,
                                     'phase:0': 1})
            t = sess.run([loss, accuracy],
                         feed_dict={'x:0': mnist.test.images,
                                    'y:0': mnist.test.labels,
                                    'phase:0': 0})
            history += [[epoch] + tr + t]
            print(history[-1])
    return history


def main(argv=None):
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    train(mnist)


if __name__ == '__main__':
    tf.app.run()