fullyConnectedLayer
全結合層
説明
全結合層は、入力に重み行列を乗算し、バイアス ベクトルを加算します。
作成
説明
は全結合層を返し、layer
= fullyConnectedLayer(outputSize
)OutputSize
プロパティを指定します。
は、名前と値のペアを使用して、オプションの パラメーターと初期化、学習率および正則化、および layer
= fullyConnectedLayer(outputSize
,Name,Value
)Name
の各プロパティを設定します。たとえば、fullyConnectedLayer(10,'Name','fc1')
は、出力サイズが 10、名前が 'fc1'
である全結合層を作成します。複数の名前と値のペアを指定できます。各プロパティ名を一重引用符で囲みます。
プロパティ
全結合
OutputSize
— 出力サイズ
正の整数
全結合層の出力サイズ。正の整数として指定します。
例: 10
InputSize
— 入力サイズ
'auto'
(既定値) | 正の整数
全結合層の入力サイズ。正の整数または 'auto'
として指定します。InputSize
が 'auto'
の場合、学習中に入力サイズが自動的に決定されます。
パラメーターと初期化
WeightsInitializer
— 重みを初期化する関数
'glorot'
(既定値) | 'he'
| 'orthogonal'
| 'narrow-normal'
| 'zeros'
| 'ones'
| 関数ハンドル
重みを初期化する関数。次のいずれかに指定します。
'glorot'
– Glorot 初期化子 [1] (Xavier 初期化子とも呼ばれる) を使用して重みを初期化します。Glorot 初期化子は、平均 0、分散2/(InputSize + OutputSize)
の一様分布から個別にサンプリングを行います。'he'
– He 初期化子 [2] を使用して重みを初期化します。He 初期化子は、平均 0、分散2/InputSize
の正規分布からサンプリングを行います。'orthogonal'
– 直交行列 Q を使用して入力の重みを初期化します。この直交行列は、単位正規分布に従ってサンプリングされた乱数行列 Z に対する QR 分解 Z = QR によって与えられます。[3]'narrow-normal'
– 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、重みを初期化します。'zeros'
– 0 で重みを初期化します。'ones'
– 1 で重みを初期化します。関数ハンドル – カスタム関数で重みを初期化します。関数ハンドルを指定する場合、関数は
weights = func(sz)
という形式でなければなりません。ここで、sz
は重みのサイズです。例については、カスタム重み初期化関数の指定を参照してください。
この層では、Weights
プロパティが空の場合にのみ重みが初期化されます。
データ型: char
| string
| function_handle
BiasInitializer
— バイアスを初期化する関数
"zeros"
(既定値) | "narrow-normal"
| "ones"
| 関数ハンドル
バイアスを初期化する関数。次のいずれかの値として指定します。
"zeros"
— 0 でバイアスを初期化します。"ones"
— 1 でバイアスを初期化します。"narrow-normal"
— 平均 0、標準偏差 0.01 の正規分布から個別にサンプリングを行って、バイアスを初期化します。関数ハンドル — カスタム関数でバイアスを初期化します。関数ハンドルを指定する場合、関数は
bias = func(sz)
という形式でなければなりません。ここで、sz
はバイアスのサイズです。
この層では、Bias
プロパティが空の場合にのみバイアスが初期化されます。
データ型: char
| string
| function_handle
Weights
— 層の重み
[]
(既定値) | 行列
層の重み。行列として指定します。
層の重みは学習可能なパラメーターです。層の Weights
プロパティを使用して、重みの初期値を直接指定できます。ネットワークに学習させるときに、層の Weights
プロパティが空ではない場合、関数 trainnet
および trainNetwork
は Weights
プロパティを初期値として使用します。Weights
プロパティが空の場合、ソフトウェアは層の WeightsInitializer
プロパティによって指定された初期化子を使用します。
学習時、Weights
は OutputSize
行 InputSize
列の行列です。
データ型: single
| double
Bias
— 層のバイアス
[]
(既定値) | 行列
層のバイアス。行列として指定します。
層のバイアスは学習可能なパラメーターです。ニューラル ネットワークの学習時に、Bias
が空ではない場合、関数 trainnet
および trainNetwork
は Bias
プロパティを初期値として使用します。Bias
が空の場合、ソフトウェアは BiasInitializer
によって指定された初期化子を使用します。
学習時、Bias
は OutputSize
行 1
列の行列です。
データ型: single
| double
学習率および正則化
WeightLearnRateFactor
— 重みの学習率係数
1
(既定値) | 非負のスカラー
重みの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層の重みの学習率が決定されます。たとえば、WeightLearnRateFactor
が 2
の場合、この層の重みの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
BiasLearnRateFactor
— バイアスの学習率係数
1
(既定値) | 非負のスカラー
バイアスの学習率係数。非負のスカラーとして指定します。
この係数にグローバル学習率が乗算されて、この層のバイアスの学習率が決定されます。たとえば、BiasLearnRateFactor
が 2
の場合、層のバイアスの学習率は現在のグローバル学習率の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル学習率が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
WeightL2Factor
— 重みの L2 正則化係数
1 (既定値) | 非負のスカラー
重みの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層の重みの L2 正則化が決定されます。たとえば、WeightL2Factor
が 2
の場合、この層の重みの L2 正則化はグローバル L2 正則化係数の 2 倍になります。グローバル L2 正則化係数は、関数 trainingOptions
を使用して指定できます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
BiasL2Factor
— バイアスの L2 正則化係数
0
(既定値) | 非負のスカラー
バイアスの L2 正則化係数。非負のスカラーとして指定します。
この係数にグローバル L2 正則化係数が乗算されて、この層のバイアスの L2 正則化が決定されます。たとえば、BiasL2Factor
が 2
の場合、この層のバイアスの L2 正則化はグローバル L2 正則化係数の 2 倍になります。関数 trainingOptions
で指定した設定に基づいて、グローバル L2 正則化係数が決定されます。
データ型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
層
NumInputs
— 入力の数
1
(既定値)
この プロパティ は読み取り専用です。
層への入力の数。1
として返されます。この層は単一の入力のみを受け入れます。
データ型: double
InputNames
— 入力名
{'in'}
(既定値)
この プロパティ は読み取り専用です。
入力名。{'in'}
として返されます。この層は単一の入力のみを受け入れます。
データ型: cell
NumOutputs
— 出力の数
1
(既定値)
この プロパティ は読み取り専用です。
層からの出力の数。1
として返されます。この層には単一の出力のみがあります。
データ型: double
OutputNames
— 出力名
{'out'}
(既定値)
この プロパティ は読み取り専用です。
出力名。{'out'}
として返されます。この層には単一の出力のみがあります。
データ型: cell
例
全結合層の作成
出力サイズが 10、名前が fc1
の全結合層を作成します。
layer = fullyConnectedLayer(10,Name="fc1")
layer = FullyConnectedLayer with properties: Name: 'fc1' Hyperparameters InputSize: 'auto' OutputSize: 10 Learnable Parameters Weights: [] Bias: [] Use properties method to see a list of all properties.
Layer
配列に全結合層を含めます。
layers = [ ...
imageInputLayer([28 28 1])
convolution2dLayer(5,20)
reluLayer
maxPooling2dLayer(2,Stride=2)
fullyConnectedLayer(10)
softmaxLayer]
layers = 6x1 Layer array with layers: 1 '' Image Input 28x28x1 images with 'zerocenter' normalization 2 '' 2-D Convolution 20 5x5 convolutions with stride [1 1] and padding [0 0 0 0] 3 '' ReLU ReLU 4 '' 2-D Max Pooling 2x2 max pooling with stride [2 2] and padding [0 0 0 0] 5 '' Fully Connected 10 fully connected layer 6 '' Softmax softmax
全結合層の初期の重みとバイアスの指定
重みとバイアスの初期化子関数を指定するには、それぞれ WeightsInitializer
プロパティと BiasInitializer
プロパティを使用します。重みとバイアスを直接指定するには、それぞれ Weights
プロパティと Bias
プロパティを使用します。
初期化関数の指定
出力サイズが 10 の全結合層を作成し、重み初期化子を He 初期化子に指定します。
outputSize = 10; layer = fullyConnectedLayer(outputSize,'WeightsInitializer','he')
layer = FullyConnectedLayer with properties: Name: '' Hyperparameters InputSize: 'auto' OutputSize: 10 Learnable Parameters Weights: [] Bias: [] Use properties method to see a list of all properties.
Weights
プロパティおよび Bias
プロパティは空になることに注意してください。学習時に、これらのプロパティは指定した初期化関数を使用して初期化されます。
カスタム初期化関数の指定
重みとバイアスの独自の初期化関数を指定するには、関数ハンドルに WeightsInitializer
プロパティおよび BiasInitializer
プロパティを設定します。これらのプロパティに、重みとバイアスのサイズを入力として取り、初期化値を出力する関数ハンドルを指定します。
出力サイズが 10 の全結合層を作成し、標準偏差 0.0001 のガウス分布から重みとバイアスをサンプリングする初期化子を指定します。
outputSize = 10; weightsInitializationFcn = @(sz) rand(sz) * 0.0001; biasInitializationFcn = @(sz) rand(sz) * 0.0001; layer = fullyConnectedLayer(outputSize, ... 'WeightsInitializer',@(sz) rand(sz) * 0.0001, ... 'BiasInitializer',@(sz) rand(sz) * 0.0001)
layer = FullyConnectedLayer with properties: Name: '' Hyperparameters InputSize: 'auto' OutputSize: 10 Learnable Parameters Weights: [] Bias: [] Use properties method to see a list of all properties.
ここでも、Weights
プロパティおよび Bias
プロパティは空になります。学習時に、これらのプロパティは指定した初期化関数を使用して初期化されます。
重みおよびバイアスの直接指定
出力サイズが 10 の全結合層を作成し、MAT ファイル FCWeights.mat
で重みとバイアスをそれぞれ W
と b
に設定します。
outputSize = 10; load FCWeights layer = fullyConnectedLayer(outputSize, ... 'Weights',W, ... 'Bias',b)
layer = FullyConnectedLayer with properties: Name: '' Hyperparameters InputSize: 720 OutputSize: 10 Learnable Parameters Weights: [10x720 double] Bias: [10x1 double] Use properties method to see a list of all properties.
ここで、Weights
プロパティおよび Bias
プロパティには指定した値が含まれます。学習時に、これらのプロパティが空ではない場合、指定した値が初期の重みとバイアスとして使用されます。この場合、初期化子関数は使用されません。
アルゴリズム
全結合層
全結合層は、入力に重み行列を乗算し、バイアス ベクトルを加算します。
その名前からわかるように、全結合層のすべてのニューロンは前の層にあるすべてのニューロンに結合しています。この層は、前の層によってイメージ全体で学習されたすべての特徴 (ローカル情報) を組み合わせて、より大きなパターンを特定します。分類問題の場合、最後の全結合層は、特徴を組み合わせてイメージを分類します。そのため、ネットワークにある最後の全結合層の引数 outputSize
は、データセットのクラスの数と等しくなります。回帰問題の場合、出力サイズは応答変数の数と等しくなければなりません。
全結合層を作成するときに、関連する名前と値のペアの引数を使用して、この層の学習率と正則化パラメーターも調整できます。調整しないことを選択した場合、ソフトウェアは関数 trainingOptions
で定義されたグローバル学習パラメーターを使用します。
層への入力がシーケンスの場合 (LSTM ネットワークの場合など)、全結合層は各タイム ステップで独立に動作します。たとえば、全結合層の前の層が、サイズ D x N x S の配列 X を出力する場合、全結合層はサイズ outputSize
x N x S の配列 Z を出力します。タイム ステップ t で、Z の対応するエントリは です。ここで、 は、タイム ステップ t の X を表します。
全結合層は出力をフラットにします。これらは、空間データをチャネル次元で符号化し、出力の空間次元を削除します。
層の入力形式と出力形式
層配列内または層グラフ内の層は、形式を整えた dlarray
オブジェクトとして後続の層にデータを渡します。dlarray
オブジェクトの形式は文字列で、各文字はデータ内の対応する次元を表します。この形式には次の文字が 1 つ以上含まれています。
"S"
— 空間"C"
— チャネル"B"
— バッチ"T"
— 時間"U"
— 指定なし
たとえば、4 次元配列として表された 2 次元イメージ データがあり、最初の 2 つの次元がイメージの空間次元に対応し、3 番目の次元がイメージのチャネルに対応し、4 番目の次元がバッチ次元に対応している場合、このイメージ データは "SSCB"
(空間、空間、チャネル、バッチ) という形式で表されます。
functionLayer
オブジェクトを使用するか、関数 forward
と関数 predict
を dlnetwork
オブジェクトと共に使用して、カスタム層の開発などの自動微分ワークフローで、これらの dlarray
オブジェクトを操作できます。
次の表は、FullyConnectedLayer
オブジェクトでサポートされている入力形式、および対応する出力形式を示しています。ソフトウェアが nnet.layer.Formattable
クラスを継承していないカスタム層、または Formattable
プロパティが 0
(false
) に設定された FunctionLayer
オブジェクトに層の出力を渡す場合、その層は形式を整えていない dlarray
オブジェクトを受け取り、この表に示された形式に従って次元が並べられます。ここには一部の形式のみを示します。層では、追加の "S"
(空間) 次元または "U"
(未指定) 次元をもつ形式など、追加の形式がサポートされている場合があります。
入力形式 | 出力形式 |
---|---|
|
|
| |
| |
| |
|
|
|
|
| |
| |
|
|
| |
| |
|
|
| |
| |
|
参照
[1] Glorot, Xavier, and Yoshua Bengio. "Understanding the Difficulty of Training Deep Feedforward Neural Networks." In Proceedings of the Thirteenth International Conference on Artificial Intelligence and Statistics, 249–356. Sardinia, Italy: AISTATS, 2010. https://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
[2] He, Kaiming, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. "Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification." In 2015 IEEE International Conference on Computer Vision (ICCV), 1026–34. Santiago, Chile: IEEE, 2015. https://doi.org/10.1109/ICCV.2015.123
[3] Saxe, Andrew M., James L. McClelland, and Surya Ganguli. "Exact Solutions to the Nonlinear Dynamics of Learning in Deep Linear Neural Networks.” Preprint, submitted February 19, 2014. https://arxiv.org/abs/1312.6120.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
バージョン履歴
R2016a で導入R2024a: DAGNetwork
オブジェクトおよび SeriesNetwork
オブジェクトは非推奨
R2024a 以降、DAGNetwork
オブジェクトおよび SeriesNetwork
オブジェクトは非推奨となりました。代わりに dlnetwork
オブジェクトを使用してください。
DAGNetwork
オブジェクトおよび SeriesNetwork
オブジェクトのサポートを削除する予定はありません。ただし、dlnetwork
オブジェクトには次の利点があるため、代わりにこのオブジェクトを使うことを推奨します。
dlnetwork
オブジェクトは、ネットワークの構築、予測、組み込み学習、可視化、圧縮、検証、およびカスタム学習ループをサポートする統合されたデータ型です。dlnetwork
オブジェクトは、ユーザーが作成したり外部のプラットフォームからインポートしたりできる、さまざまなネットワーク アーキテクチャをサポートしています。関数
trainnet
はdlnetwork
オブジェクトをサポートしているため、損失関数を簡単に指定できます。組み込みの損失関数を選択するか、カスタム損失関数を指定できます。dlnetwork
オブジェクトを使用した学習と予測は、通常、LayerGraph
とtrainNetwork
を使用したワークフローよりも高速です。
学習済みの DAGNetwork
オブジェクトまたは SeriesNetwork
オブジェクトを dlnetwork
オブジェクトに変換するには、関数 dag2dlnetwork
を使用します。
DAGNetwork
オブジェクトおよび SeriesNetwork
オブジェクトと比べ、dlnetwork
オブジェクトでは全結合層の動作が多少異なります。全結合層は出力をフラットにします。出力データを形状変更することにより、空間データをチャネル次元で符号化します。SeriesNetwork
オブジェクトと DAGNetwork
オブジェクトの全結合層は、サイズ 1 の空間次元をもつデータを出力することにより、入力と同じ数の空間次元をもつデータを出力します。dlnetwork
オブジェクトの全結合層は、出力の空間次元を削除します。
R2019a: 既定の重みの初期化は Glorot
R2019a 以降では、既定で、Glorot 初期化子を使用してこの層の重みが初期化されます。この動作は、学習を安定化させるのに役立ち、通常は深いネットワークの学習時間を短縮します。
以前のリリースでは、既定で、平均 0、分散 0.01 の正規分布からサンプリングを行って、層の重みが初期化されます。この動作を再現するには、層の 'WeightsInitializer'
オプションを 'narrow-normal'
に設定します。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)