batchNormalizationLayer
バッチ正規化層
説明
バッチ正規化層は、観測値全体におけるデータ ミニバッチの正規化を、各チャネルについて個別に行います。畳み込みニューラル ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げるには、畳み込み層の間にあるバッチ正規化層と、ReLU 層などの非線形性を使用します。
正規化後、この層は、学習可能なパラメーターのスケール係数 γ だけ入力をスケーリングし、それを学習可能なパラメーターのオフセット β だけシフトします。
作成
説明
は、バッチ正規化層を作成します。layer = batchNormalizationLayer
は、バッチ正規化層を作成し、1 つ以上の名前と値のペアを使用して、オプションの layer = batchNormalizationLayer(Name,Value)TrainedMean、TrainedVariance、Epsilon、パラメーターと初期化、学習率および正則化、および Name の各プロパティを設定します。たとえば、batchNormalizationLayer('Name','batchnorm') は、'batchnorm' という名前のバッチ正規化層を作成します。
プロパティ
バッチ正規化
予測に使用される平均統計値。チャネルごとの平均値の数値ベクトルとして指定します。
層入力のタイプに応じて、関数 trainnet および dlnetwork は、次のサイズをもつようにこのプロパティを自動的に形状変更します。
| 層入力 | プロパティ サイズ |
|---|---|
| 特徴入力 | NumChannels 行 1 列 |
| ベクトル シーケンス入力 | |
| 1 次元イメージ入力 | 1×NumChannels |
| 1 次元イメージ シーケンス入力 | |
| 2 次元イメージ入力 | 1×1×NumChannels |
| 2 次元イメージ シーケンス入力 | |
| 3 次元イメージ入力 | 1×1×1×NumChannels |
| 3 次元イメージ シーケンス入力 |
BatchNormalizationStatistics 学習オプションが 'moving' である場合、学習中に実行時推定を使用してバッチ正規化統計量が近似され、学習後に TrainedMean プロパティと TrainedVariance プロパティがそれぞれ平均と分散の最新の移動推定値に設定されます。
BatchNormalizationStatistics 学習オプションが 'population' である場合、ネットワークの学習終了後にデータが再度渡され、TrainedMean プロパティと TrainedVariance プロパティがそれぞれ学習データ セット全体から計算された平均と分散に設定されます。
層は TrainedMean と TrainedVariance を使用して、予測時に入力を正規化します。
データ型: single | double
予測に使用される分散統計値。チャネルごとの分散値の数値ベクトルとして指定します。
層入力のタイプに応じて、関数 trainnet および dlnetwork は、次のサイズをもつようにこのプロパティを自動的に形状変更します。
| 層入力 | プロパティ サイズ |
|---|---|
| 特徴入力 | NumChannels 行 1 列 |
| ベクトル シーケンス入力 | |
| 1 次元イメージ入力 | 1×NumChannels |
| 1 次元イメージ シーケンス入力 | |
| 2 次元イメージ入力 | 1×1×NumChannels |
| 2 次元イメージ シーケンス入力 | |
| 3 次元イメージ入力 | 1×1×1×NumChannels |
| 3 次元イメージ シーケンス入力 |
BatchNormalizationStatistics 学習オプションが 'moving' である場合、学習中に実行時推定を使用してバッチ正規化統計量が近似され、学習後に TrainedMean プロパティと TrainedVariance プロパティがそれぞれ平均と分散の最新の移動推定値に設定されます。
BatchNormalizationStatistics 学習オプションが 'population' である場合、ネットワークの学習終了後にデータが再度渡され、TrainedMean プロパティと TrainedVariance プロパティがそれぞれ学習データ セット全体から計算された平均と分散に設定されます。
層は TrainedMean と TrainedVariance を使用して、予測時に入力を正規化します。
データ型: single | double
ミニバッチの分散に加算する定数。正のスカラーとして指定します。
ソフトウェアは、正規化の前にミニバッチの分散にこの定数を加算して、数値安定性を確保し、ゼロ除算を回避します。
R2023a より前: Epsilon は 1e-5 以上でなければなりません。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
この プロパティ は読み取り専用です。
入力チャネル数。次のいずれかとして指定します。
"auto"— 学習時に入力チャネルの数を自動的に決定します。正の整数 — 指定された数の入力チャネルの層を構成します。
NumChannelsと層入力データのチャネル数は一致しなければなりません。たとえば、入力が RGB イメージの場合、NumChannelsは 3 でなければなりません。入力が 16 個のフィルターをもつ畳み込み層の出力である場合、NumChannelsは 16 でなければなりません。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string
パラメーターと初期化
チャネル スケール係数を初期化する関数。次のいずれかに指定します。
'ones'– 1 でチャネル スケール係数を初期化します。'zeros'– 0 でチャネル スケール係数を初期化します。'narrow-normal'– 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、チャネル スケール係数を初期化します。関数ハンドル – カスタム関数でチャネル スケール係数を初期化します。関数ハンドルを指定する場合、関数は
scale = func(sz)という形式でなければなりません。ここで、szはスケールのサイズです。例については、カスタム重み初期化関数の指定を参照してください。
この層では、Scale プロパティが空の場合にのみチャネル スケール係数が初期化されます。
データ型: char | string | function_handle
チャネル オフセットを初期化する関数。次のいずれかに指定します。
'zeros'– 0 でチャネル オフセットを初期化します。'ones'– 1 でチャネル オフセットを初期化します。'narrow-normal'– 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、チャネル オフセットを初期化します。関数ハンドル – カスタム関数でチャネル オフセットを初期化します。関数ハンドルを指定する場合、関数は
offset = func(sz)という形式でなければなりません。ここで、szはスケールのサイズです。例については、カスタム重み初期化関数の指定を参照してください。
この層では、Offset プロパティが空の場合にのみチャネル オフセットが初期化されます。
データ型: char | string | function_handle
チャネル スケール係数 γ。数値配列として指定します。
チャネル スケール係数は学習可能なパラメーターです。関数 trainnet を使用してネットワークに学習させるとき、または dlnetwork オブジェクトを初期化するときに、Scale が空でない場合、ソフトウェアは Scale プロパティを初期値として使用します。Scale が空の場合、ScaleInitializer によって指定された初期化子が使用されます。
層入力のタイプに応じて、関数 trainnet および dlnetwork は、次のサイズをもつようにこのプロパティを自動的に形状変更します。
| 層入力 | プロパティ サイズ |
|---|---|
| 特徴入力 | NumChannels 行 1 列 |
| ベクトル シーケンス入力 | |
| 1 次元イメージ入力 | 1×NumChannels |
| 1 次元イメージ シーケンス入力 | |
| 2 次元イメージ入力 | 1×1×NumChannels |
| 2 次元イメージ シーケンス入力 | |
| 3 次元イメージ入力 | 1×1×1×NumChannels |
| 3 次元イメージ シーケンス入力 |
データ型: single | double
チャネル オフセット β。数値ベクトルとして指定します。
チャネル オフセットは学習可能なパラメーターです。関数 trainnet を使用してネットワークに学習させるとき、または dlnetwork オブジェクトを初期化するときに、Offset が空でない場合、ソフトウェアは Offset プロパティを初期値として使用します。Offset が空の場合、OffsetInitializer によって指定された初期化子が使用されます。
層入力のタイプに応じて、関数 trainnet および dlnetwork は、次のサイズをもつようにこのプロパティを自動的に形状変更します。
| 層入力 | プロパティ サイズ |
|---|---|
| 特徴入力 | NumChannels 行 1 列 |
| ベクトル シーケンス入力 | |
| 1 次元イメージ入力 | 1×NumChannels |
| 1 次元イメージ シーケンス入力 | |
| 2 次元イメージ入力 | 1×1×NumChannels |
| 2 次元イメージ シーケンス入力 | |
| 3 次元イメージ入力 | 1×1×1×NumChannels |
| 3 次元イメージ シーケンス入力 |
データ型: single | double
移動平均を計算するための減衰値。0 ~ 1 の数値スカラーとして指定します。
関数 trainNetwork または trainnet を使用するとき、BatchNormalizationStatistics 学習オプションが 'moving' である場合、各反復において、層は次を使用して移動平均値を更新します。
ここで、 は更新後の平均、 は平均の減衰値、 は層入力の平均、 は移動平均の最新値を表します。
関数 trainNetwork または trainnet を使用するとき、BatchNormalizationStatistics 学習オプションが 'population' である場合、このオプションは効果がありません。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
移動分散を計算するための減衰値。0 ~ 1 の数値スカラーとして指定します。
関数 trainNetwork または trainnet を使用するとき、BatchNormalizationStatistics 学習オプションが 'moving' である場合、各反復において、層は次を使用して移動分散値を更新します。
ここで、 は更新後の分散、 は分散の減衰値、 は層入力の分散、 は移動分散の最新値を表します。
関数 trainNetwork または trainnet を使用するとき、BatchNormalizationStatistics 学習オプションが 'population' である場合、このオプションは効果がありません。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
学習率および正則化
スケール係数の学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、層のスケール係数の学習率が決定されます。たとえば、ScaleLearnRateFactor が 2 の場合、層のスケール係数の学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、グローバル学習率が決定されます。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
オフセットの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、層のオフセットの学習率が決定されます。たとえば、OffsetLearnRateFactor が 2 の場合、層のオフセットの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions で指定された設定に基づいて、グローバル学習率が決定されます。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
スケール係数の L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、層のスケール係数の学習率が決定されます。たとえば、ScaleL2Factor が 2 の場合、層のオフセットの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions を使用して指定できます。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
オフセットの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、層のオフセットの学習率が決定されます。たとえば、OffsetL2Factor が 2 の場合、層のオフセットの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions を使用して指定できます。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
層
この プロパティ は読み取り専用です。
層への入力の数。1 として格納されます。この層は単一の入力のみを受け入れます。
データ型: double
この プロパティ は読み取り専用です。
入力名。{'in'} として格納されます。この層は単一の入力のみを受け入れます。
データ型: cell
この プロパティ は読み取り専用です。
層からの出力の数。1 として格納されます。この層には単一の出力のみがあります。
データ型: double
この プロパティ は読み取り専用です。
出力名。{'out'} として格納されます。この層には単一の出力のみがあります。
データ型: cell
例
BN1 という名前のバッチ正規化層を作成します。
layer = batchNormalizationLayer(Name="BN1")layer =
BatchNormalizationLayer with properties:
Name: 'BN1'
NumChannels: 'auto'
Hyperparameters
MeanDecay: 0.1000
VarianceDecay: 0.1000
Epsilon: 1.0000e-05
Learnable Parameters
Offset: []
Scale: []
State Parameters
TrainedMean: []
TrainedVariance: []
Show all properties
Layer 配列にバッチ正規化層を含めます。
layers = [
imageInputLayer([32 32 3])
convolution2dLayer(3,16,Padding=1)
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2,Stride=2)
convolution2dLayer(3,32,Padding=1)
batchNormalizationLayer
reluLayer
fullyConnectedLayer(10)
softmaxLayer
]layers =
10×1 Layer array with layers:
1 '' Image Input 32×32×3 images with 'zerocenter' normalization
2 '' 2-D Convolution 16 3×3 convolutions with stride [1 1] and padding [1 1 1 1]
3 '' Batch Normalization Batch normalization
4 '' ReLU ReLU
5 '' 2-D Max Pooling 2×2 max pooling with stride [2 2] and padding [0 0 0 0]
6 '' 2-D Convolution 32 3×3 convolutions with stride [1 1] and padding [1 1 1 1]
7 '' Batch Normalization Batch normalization
8 '' ReLU ReLU
9 '' Fully Connected 10 fully connected layer
10 '' Softmax softmax
ヒント
カスタム学習ループを使用してニューラル ネットワークに学習させる場合は、ニューラル ネットワークのバッチ正規化状態を手動で更新しなければなりません。詳細については、カスタム学習ループでのバッチ正規化統計量の更新を参照してください。
アルゴリズム
バッチ正規化層は、観測値全体におけるデータ ミニバッチの正規化を、各チャネルについて個別に行います。畳み込みニューラル ネットワークの学習速度を上げ、ネットワークの初期化に対する感度を下げるには、畳み込み層の間にあるバッチ正規化層と、ReLU 層などの非線形性を使用します。
この層はまず、ミニバッチの平均を減算し、ミニバッチの標準偏差で除算することにより、各チャネルの活性化を正規化します。さらに、この層は、学習可能なパラメーターのオフセット β だけ入力をシフトし、それを学習可能なパラメーターのスケール係数 γ でスケーリングします。β と γ はそれら自体が学習可能なパラメーターであり、ネットワークの学習中に更新されます。
バッチ正規化層は、ニューラル ネットワークを通じて伝播される活性化と勾配を正規化します。これにより、ネットワークの学習は簡単な最適化問題になります。この事実を十分に活用するために、学習率を増やすことができます。この最適化問題は簡単なため、パラメーターの更新量が大きくなり、ネットワークの学習時間を短縮できます。また、L2 とドロップアウト正則化を小さくすることもできます。バッチ正規化層では、学習中の特定のイメージの活性化は、同じミニバッチにどのイメージが現れるかによって異なります。この正則化の効果を十分に活用するには、すべての学習エポックの前に学習データをシャッフルします。学習中にデータをシャッフルする頻度を指定するには、trainingOptions の名前と値のペアの引数 'Shuffle' を使用します。
バッチ正規化演算は、各チャネルについて、空間領域、時間領域、および観測値の各次元における平均 μB と分散 σB2 をまず計算することで、入力の要素 xi を正規化します。その後、正規化された活性化を次のように計算します。
ここで、ϵ は、分散が非常に小さいときに数値安定性を向上させる定数です。
ゼロ平均と単位分散をもつ入力がバッチ正規化後の演算に最適ではない可能性を考慮して、バッチ正規化演算は、次の変換を使用して活性化のさらなるシフトとスケーリングを行います。
ここで、オフセット β とスケール係数 γ は、ネットワークの学習中に更新される学習可能なパラメーターです。
学習後にネットワークによる予測を行うには、バッチ正規化において一定の平均と分散を使用してデータを正規化する必要があります。この一定の平均と分散を取得するには、学習後に学習データから計算するか、実行中の統計計算を使用して学習中に近似値を計算します。
BatchNormalizationStatistics 学習オプションが 'moving' である場合、学習中に実行時推定を使用してバッチ正規化統計量が近似され、学習後に TrainedMean プロパティと TrainedVariance プロパティがそれぞれ平均と分散の最新の移動推定値に設定されます。
BatchNormalizationStatistics 学習オプションが 'population' である場合、ネットワークの学習終了後にデータが再度渡され、TrainedMean プロパティと TrainedVariance プロパティがそれぞれ学習データ セット全体から計算された平均と分散に設定されます。
層は TrainedMean と TrainedVariance を使用して、予測時に入力を正規化します。
層配列内または層グラフ内の層は、形式を整えた dlarray オブジェクトとして後続の層にデータを渡します。dlarray オブジェクトの形式は文字列で、各文字はデータ内の対応する次元を表します。この形式には次の文字が 1 つ以上含まれています。
"S"— 空間"C"— チャネル"B"— バッチ"T"— 時間"U"— 指定なし
たとえば、4 次元配列として表された 2 次元イメージ データがあり、最初の 2 つの次元がイメージの空間次元に対応し、3 番目の次元がイメージのチャネルに対応し、4 番目の次元がバッチ次元に対応している場合、このイメージ データは "SSCB" (空間、空間、チャネル、バッチ) という形式で記述できます。
functionLayer オブジェクトを使用するか、関数 forward と関数 predict を dlnetwork オブジェクトと共に使用して、カスタム層の開発などの自動微分ワークフローで、これらの dlarray オブジェクトを操作できます。
次の表は、BatchNormalizationLayer オブジェクトでサポートされている入力形式、および対応する出力形式を示しています。ソフトウェアが nnet.layer.Formattable クラスを継承していないカスタム層、または Formattable プロパティが 0 (false) に設定された FunctionLayer オブジェクトに層の出力を渡す場合、その層は形式を整えていない dlarray オブジェクトを受け取り、この表に示された形式に従って次元が並べられます。ここには一部の形式のみを示します。層では、追加の "S" (空間) 次元または "U" (未指定) 次元をもつ形式など、追加の形式がサポートされている場合があります。
| 入力形式 | 出力形式 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dlnetwork オブジェクトでは、BatchNormalizationLayer オブジェクトもこれらの入力形式と出力形式の組み合わせをサポートします。
| 入力形式 | 出力形式 |
|---|---|
|
|
|
|
|
|
|
|
参照
[1] Ioffe, Sergey, and Christian Szegedy. “Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift.” Preprint, submitted March 2, 2015. https://arxiv.org/abs/1502.03167.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)