使用TensorFlow(Keras)實施
介紹
批處理規範化(BN)是許多機器學習從業人員遇到的技術。
而且,如果您還沒有這樣做的話,本文將解釋BN的基本直覺,包括其起源以及如何使用TensorFlow和Keras在神經網絡中實現它。
對於那些熟悉BN技術並且只想專注於實現的人,可以跳到下面的「代碼」部分。
定義
批處理規範化是一種技術,它通過引入一個附加層來減輕神經網絡中不穩定梯度的影響,該附加層對來自前一層的輸入執行操作。在通過縮放和移位操作對輸入值進行轉換之後,這些操作將對輸入值進行標準化和標準化。
第一步是導入工具和庫,這些工具和庫將用於實現或支持神經網絡的實現。所使用的工具如下:
TensorFlow:一個用於實施,培訓和部署機器學習模型的開源平臺。Keras:一個開放原始碼庫,用於實現可在CPU和GPU上運行的神經網絡體系結構。import tensorflow as tffrom tensorflow import keras
我們將使用的數據集是瑣碎的fashion-MNIST數據集。
fashion-MNIST數據集包含70,000件服裝圖像。更具體地說,它包括60,000個訓練示例和10,000個測試示例,它們都是尺寸為28 x 28的灰度圖像,分為十類。
數據集的準備工作包括通過將每個像素值除以255.0來歸一化訓練圖像和測試圖像。這會將像素值置於0到1的範圍內。
在此階段,還將創建數據集的驗證部分。在訓練期間利用該組數據集來評估網絡在各種迭代中的性能。
(train_images,train_labels),(test_images,test_labels)= keras.datasets.fashion_mnist.load_data()train_images = train_images / 255.0 test_images = test_images / 255.0validation_images = train_images [:5000] validation_labels = train_labels [:5000]
Keras提供了實現分類模型所需的工具。Keras提供了一種順序API,用於以連續的方式堆疊神經網絡的各個層。
以下是將要構成我們的神經網絡的各層信息。
展平:採用輸入形狀,並將輸入圖像數據展平為一維數組。緻密的:緻密層中嵌入了任意數量的單元/神經元。每個神經元都是一個感知器。甲感知器是一種人工神經網絡的基本組成部分,它是由發明弗蘭克布拉特於1958年感知器基於所述閾值邏輯單元上利用的操作。批標準化:批標準化層通過對輸入的輸入數據執行一系列操作來工作。這組操作涉及到進入BN層的輸入值的偏移量的標準化,歸一化,重新縮放和移位。激活層:這對神經網絡內的輸入執行指定的操作。該層在網絡內引入了非線性。本文實現的模型將利用激活函數:整流線性單元(ReLU)和softmax。ReLU對來自神經元的值施加的變換由公式y = max(0,x)表示。ReLU激活功能將神經元的任何負值鉗制為0,而正值保持不變。這種數學轉換的結果被用作當前層的激活,並用作下一層的輸入。# Placing batch normalization layer before the activation layersmodel = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28,28]), keras.layers.Dense(300, use_bias=False), keras.layers.BatchNormalization(), keras.layers.Activation(keras.activations.relu), keras.layers.Dense(200, use_bias=False), keras.layers.BatchNormalization(), keras.layers.Activation(keras.activations.relu), keras.layers.Dense(100, use_bias=False), keras.layers.BatchNormalization(), keras.layers.Activation(keras.activations.relu), keras.layers.Dense(10, activation=keras.activations.softmax)])
讓我們看一下BN層的內部組件
僅僅訪問索引2的層將為第一個BN層中的變量及其內容提供信息,
model.layers[2].variables
在這裡,我將不涉及太多細節,但是請注意變量名「 gamma」和「 beta」,這些變量中包含的值負責重新激活和補償層中的激活。
for variable in model.layers[2].variables: print(variable.name)>> batch_normalization/gamma:0>> batch_normalization/beta:0>> batch_normalization/moving_mean:0>> batch_normalization/moving_variance:0
這條進入更詳細的內BN層問候的操作。
在密集層中,偏置分量設置為false。偏差的省略是由於激活標準化過程中由於平均減法而發生的常數值抵消的結果。
在下一個代碼段中,我們設置並指定優化算法來訓練實現的神經網絡,以及損失函數和超參數(例如學習率和曆元數)。
sgd = keras.optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss="sparse_categorical_crossentropy", optimizer=sgd, metrics=["accuracy"])
現在,我們使用模型的順序API的fit方法訓練網絡,該工具提供了訓練已實現網絡的工具。
model.fit(train_images,train_labels,epochs = 60,validation_data =(validation_images,validation_labels))
使用之前預留的測試數據進行模型性能的評估。
利用評估結果,您可以在觀察測試數據集評估的準確性之後,決定微調網絡超參數或進入生產。
model.evaluate(test_images,test_labels)
在訓練階段,您可能會注意到,與沒有批處理規範化層的網絡訓練相比,每個紀元花費的時間更長。這是因為批處理歸一化為神經網絡增加了一層複雜性,以及模型在訓練期間學習所需的額外參數。
儘管每個紀元時間的增加與「批歸一化」減少了模型收斂到最優解所需的時間這一事實是平衡的。
本文實現的模型對於我們來說太淺了,無法注意到在神經網絡體系結構中利用批量歸一化的全部好處。通常,在更深的卷積神經網絡中可以找到批處理規範化。
上面實現的神經網絡在激活層之前具有批處理歸一化層。但是完全有可能在激活層之後添加BN層。# Placing batch normalization layer after the activation layersmodel = keras.models.Sequential([ keras.layers.Flatten(input_shape=[28,28]), keras.layers.Dense(300, use_bias=False), keras.layers.Activation(keras.activations.relu), keras.layers.BatchNormalization(), keras.layers.Dense(200, use_bias=False), keras.layers.Activation(keras.activations.relu), keras.layers.BatchNormalization(), keras.layers.Dense(100, use_bias=False), keras.layers.Activation(keras.activations.relu), keras.layers.BatchNormalization(), keras.layers.Dense(10, activation=keras.activations.softmax)])
研究人員已對批處理規範化技術進行了廣泛的研究。例如批量重新歸一化和自歸一化神經網絡結論
BN是神經網絡中的一種常用技術,因此了解該技術的工作方式以及其實現方式將是有用的知識,尤其是在分析大多數神經網絡體系結構時。