久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【干貨】Batch Normalization: 如何更快地訓練深度神經(jīng)網(wǎng)絡

 山峰云繞 2019-04-17


       https://m./group/6680840467610862093/?app=news_article&timestamp=1555510222&req_id=20190417221021010023073028975B587&group_id=6680840467610862093



【導讀】本文是谷歌機器學習工程師 Chris Rawles 撰寫的一篇技術(shù)博文,,探討了如何在 TensorFlow 和 tf.keras 上利用 Batch Normalization 加快深度神經(jīng)網(wǎng)絡的訓練,。我們知道,,深度神經(jīng)網(wǎng)絡一般非常復雜,,即使是在當前高性能GPU的加持下,,要想快速訓練深度神經(jīng)網(wǎng)絡依然不容易。Batch Normalization 也許是一個不錯的加速方法,,本文介紹了它如何幫助解決梯度消失和梯度爆炸問題,,并討論了ReLu激活以及其他激活函數(shù)對于抵消梯度消失問題的作用。最后,,本文使用TensorFlow和tf.keras實現(xiàn)了在MNIST上Batch Normalization,,有助于加深讀者理解。

How to use Batch Normalization with TensorFlow and tf.keras to train deep neural networks faster

訓練深度神經(jīng)網(wǎng)絡可能非常耗時,。但是可以通過消除梯度來顯著地減少訓練時間,,這種情況發(fā)生在網(wǎng)絡由于梯度(特別是在較早的層中的梯度)接近零值而停止更新。 結(jié)合Xavier權(quán)重初始化和ReLu激活功能有助于抵消消失梯度問題,。 這些技術(shù)也有助于解決與之相反的梯度爆炸問題,,這種情況下梯度變得非常大,,它防止模型更新。

批量標準化(Batch Normalization)也許是對付梯度消失和爆炸問題的最有力工具,。 批量標準化的工作方式如下:對于給定層中的每個單元,,首先計算z分數(shù),然后在兩個受過訓練的變量γ和β應用線性轉(zhuǎn)換,。 批量標準化通常在非線性激活函數(shù)之前完成(參見下文),,但在激活函數(shù)之后應用批量標準也可能是有利的。 查看這個講座了解該技術(shù)如何工作的更多細節(jié),。

http://cs231n./slides/2017/cs231n_2017_lecture6.pdf

在反向傳播過程中,,梯度傾向于在較低層里變得更小,從而減緩權(quán)重更新并因此減少訓練次數(shù),。 批量標準化有助于消除所謂的梯度消失問題,。

批量標準化可以在TensorFlow中以三種方式實現(xiàn),。使用:

1. tf.keras.layers.BatchNormalization

2. tf.layers.batch_normalization

3. tf.nn.batch_normalization

tf.keras模塊成為1.4版TensorFlow API的核心的一部分,。 并為構(gòu)建TensorFlow模型提供高級API; 所以我會告訴你如何在Keras做到這一點。tf.layers.batch_normalization函數(shù)具有類似的功能,,但Keras被證明是在TensorFlow中編寫模型函數(shù)的一種更簡單的方法,。

in_training_mode = tf.placeholder(tf.bool)hidden = tf.keras.layers.Dense(n_units, activation=None)(X) # no activation function, yetbatch_normed = tf.keras.layers.BatchNormalization()(hidden, training=in_training_mode)output = tf.keras.activations\ .relu(batch_normed) # ReLu is typically done after batch normalization# optimizer code here …extra_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)with tf.control_dependencies(extra_ops): train_op = optimizer.minimize(loss)

注意批量標準化函數(shù)中的訓練變量。 這是必需的,,因為批量標準化在訓練期間與應用階段的操作方式不同,。在訓練期間,z分數(shù)是使用批均值和方差計算的,,而在推斷中,,則是使用從整個訓練集估算的均值和方差計算的。

在TensorFlow中,,批量標準化可以使用tf.keras.layers作為附加層實現(xiàn),。

包含tf.GraphKeys.UPDATE_OPS的第二個代碼塊很重要。對于網(wǎng)絡中的每個單元,,使用tf.keras.layers.BatchNormalization,,TensorFlow會不斷估計訓練數(shù)據(jù)集上權(quán)重的均值和方差。這些存儲的值用于在預測時間應用批量標準化,。 每個單元的訓練集均值和方差可以通過打印extra_ops來觀察,,extra_ops包含網(wǎng)絡中每圖層的列表:

print(extra_ops)[<tf.Tensor 'batch_normalization/AssignMovingAvg:0’ shape=(500,) dtype=float32_ref>, # layer 1 mean values <tf.Tensor 'batch_normalization/AssignMovingAvg_1:0’ shape=(500,) dtype=float32_ref>, # layer 1 variances ...]

雖然批量標準化在tf.nn模塊中也可用,但它需要額外的記錄,,因為均值和方差是函數(shù)的必需參數(shù),。 因此,用戶必須在批次級別和訓練集級別上手動計算均值和方差,。 因此,,它是一個比tf.keras.layers或tf.layers更低的抽象層次;應避免用tf.nn實現(xiàn),。

▌在MNIST上批量標準化



下面,我使用TensorFlow將批量標準化應用到突出的MNIST數(shù)據(jù)集,。 看看這里的代碼,。 MNIST是一個易于分析的數(shù)據(jù)集,不需要很多層就可以實現(xiàn)較低的分類錯誤,。 但是,,我們?nèi)匀豢梢詷?gòu)建深度網(wǎng)絡并觀察批量標準化如何實現(xiàn)收斂。

我們使用tf.estimator API構(gòu)建自定義估算器,。 首先我們建立模型:

def dnn_custom_estimator(features, labels, mode, params): in_training = mode == tf.estimator.ModeKeys.TRAIN use_batch_norm = params['batch_norm'] net = tf.feature_column.input_layer(features, params['features']) for i, n_units in enumerate(params['hidden_units']): net = build_fully_connected(net, n_units=n_units, training=in_training, batch_normalization=use_batch_norm, activation=params['activation'], name='hidden_layer' + str(i)) logits = output_layer(net, 10, batch_normalization=use_batch_norm, training=in_training) predicted_classes = tf.argmax(logits, 1) loss = tf.losses.softmax_cross_entropy(onehot_labels=labels, logits=logits) accuracy = tf.metrics.accuracy(labels=tf.argmax(labels, 1), predictions=predicted_classes, name='acc_op') tf.summary.scalar('accuracy', accuracy[1]) # for visualizing in TensorBoard if mode == tf.estimator.ModeKeys.EVAL: return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops={'accuracy': accuracy}) # Create training op. assert mode == tf.estimator.ModeKeys.TRAIN extra_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) optimizer = tf.train.AdamOptimizer(learning_rate=params['learning_rate']) with tf.control_dependencies(extra_ops): train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step()) return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op)

在我們定義模型函數(shù)之后,,讓我們構(gòu)建自定義估計器并訓練和評估我們的模型:

def train_and_evaluate(output_dir): features = [tf.feature_column.numeric_column(key='image_data', shape=(28*28))] classifier = tf.estimator.Estimator(model_fn=dnn_custom_estimator, model_dir=output_dir, params={'features': features, 'batch_norm': USE_BATCH_NORMALIZATION, 'activation': ACTIVATION, 'hidden_units': HIDDEN_UNITS, 'learning_rate': LEARNING_RATE}) train_spec = tf.estimator.TrainSpec(input_fn=train_input_fn, max_steps=NUM_STEPS) eval_spec = tf.estimator.EvalSpec(input_fn=eval_input_fn) tf.estimator.train_and_evaluate(classifier, train_spec, eval_spec)train_and_evaluate('mnist_model')

讓我們來測試批量標準化如何影響不同深度的模型。將我們的代碼打包到Python包后,,我們可以使用Cloud ML Engine并行執(zhí)行多個實驗:

# def ml-engine functionsubmitMLEngineJob() { gcloud ml-engine jobs submit training $JOBNAME \ --package-path=$(pwd)/mnist_classifier/trainer \ --module-name trainer.task \ --region $REGION \ --staging-bucket=gs://$BUCKET \ --scale-tier=BASIC \ --runtime-version=1.4 \ -- \ --outdir $OUTDIR \ --hidden_units $net \ --num_steps 1000 \ $batchNorm}# launch jobs in parallelexport PYTHONPATH=${PYTHONPATH}:${PWD}/mnist_classifierfor batchNorm in '' '--use_batch_normalization'do net='' for layer in 500 400 300 200 100 50 25; do net=$net$layer netname=${net//,/_}${batchNorm/--use_batch_normalization/_bn} JOBNAME=mnist$netname_$(date -u +%y%m%d_%H%M%S) OUTDIR=gs://${BUCKET}/mnist_models/mnist_model$netname/trained_model echo $OUTDIR $REGION $JOBNAME gsutil -m rm -rf $OUTDIR submitMLEngineJob net=$net, done done

下圖顯示了達到90%測試精度所需的訓練迭代次數(shù)(1次迭代包含的批次大小為500),。 很明顯,批量標準化顯著加快了深度網(wǎng)絡的訓練,。如果沒有批量標準化,,隨著每個后續(xù)層的增加,訓練步驟的數(shù)量都會增加,,但使用它后,,訓練步數(shù)幾乎保持不變。 在實踐中,,它是面對更困難的數(shù)據(jù)集,,更多層網(wǎng)絡結(jié)構(gòu)時取得成功的先決條件。

如果沒有批量標準化,,達到90%準確度所需的訓練迭代次數(shù)會隨著層數(shù)的增加而增加,,這可能是由于梯度消失造成的。

同樣,,如下所示,,對于具有7個隱藏層的全連接的網(wǎng)絡,沒有批量標準化的收斂時間較慢

上述實驗利用了常用的ReLu激活功能,。 雖然不能像上面所示一樣抵擋梯度消失帶來的效應,,ReLu激活比Sigmoid或tanh激活功能要好得多。 Sigmoid激活函數(shù)對梯度消失很無力,。在更大的數(shù)值(非常正或負)時,,sigmoid函數(shù)“飽和” 即S形函數(shù)的導數(shù)接近零。 當越來越多節(jié)點飽和時,,更新次數(shù)減少,,網(wǎng)絡停止訓練。

使用sigmoid激活函數(shù)而不使用批量標準化,,相同的7層網(wǎng)絡訓練會顯著減慢,。當使用批量標準化,,網(wǎng)絡達到收斂時的迭代次數(shù)與使用ReLu相似。

另一方面,,其他激活函數(shù)(如指數(shù)ReLu或泄漏ReLu函數(shù))可以幫助抵制梯度消失問題,,因為它們對于正數(shù)和負數(shù)都具有非零導數(shù)。

最后,,重要的是要注意批量標準化會給訓練帶來額外的時間成本,。 盡管批量標準化通常會減少達到收斂的訓練步數(shù),但它會帶來額外的時間成本,,因為它引入了額外的操作,,并且還給每個單元引入了兩個新的訓練參數(shù)。

對于MNIST分類問題(使用1080 GTX GPU),,批量標準化能在較少的迭代次數(shù)收斂,,但每次迭代的時間較慢。 最終,,批量標準化版本的收斂速度仍然較快,,但整合訓練時間后,改進效果并不明顯,。

結(jié)合XLA和混合批量標準化(fused Batch Normalization)(在tf.layers.batch_normalization中融合了參數(shù))可以通過將幾個單獨的操作組合到單個內(nèi)核中來加速批量標準化操作,。

無論如何,,批量標準化可以成為加速深度神經(jīng)網(wǎng)絡訓練的非常有價值的工具,。 像訓練深度神經(jīng)網(wǎng)絡一樣,確定一種方法是否有助于解決問題的最佳方法就是做一下實驗,!

附Keras官方資源

  1. 官網(wǎng):keras.io
  2. 中文版文檔:keras.io/zh/
  3. 快速入門:keras.io/zh/#30-kera…
  4. Github:github.com/keras-team/…
  5. Google+網(wǎng)上論壇:groups.google.com/forum/#!for…
  6. slack:kerasteam.slack.com/

參考文獻:

https:///how-to-use-batch-normalization-with-tensorflow-and-tf-keras-to-train-deep-neural-networks-faster-60ba4d054b73

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多