このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
深層学習のネットワーク構成
それ自体が層グラフを定義するカスタム層を作成するには、層定義の properties (Learnable)
セクションで、学習可能パラメーターとして dlnetwork
オブジェクトを宣言します。この手法は "ネットワーク構成" と呼ばれます。以下の場合にネットワーク構成を使用できます。
学習可能な層のブロックを表す単一のカスタム層 (残差ブロックなど) の作成。
コントロール フローをもつネットワーク (入力データに応じて動的に変更できるセクションをもつネットワークなど) の作成。
ループをもつネットワーク (自分自身に出力をフィードバックするセクションをもつネットワークなど) の作成。
学習可能パラメーターと状態パラメーターの両方をもつ入れ子ネットワーク (たとえば、バッチ正規化層または LSTM 層をもつネットワークなど) の場合は、層定義の properties (Learnable, State)
セクションでネットワークを宣言します。
学習可能な dlnetwork
オブジェクトを含むカスタム層を定義する方法の例については、入れ子になった深層学習層の定義を参照してください。
入れ子層をもつネットワークに学習させる方法を説明する例については、入れ子層をもつ深層学習ネットワークの学習を参照してください。
学習可能な dlnetwork
オブジェクトを学習で使用するための自動的な初期化
カスタム層を作成すると、親ネットワークが完全に構築された後に、入れ子にされた dlnetwork
オブジェクトの学習可能パラメーターを自動的に初期化させることができます。入れ子ネットワークを自動的に初期化する場合、入れ子にされた dlnetwork
を含む各カスタム層に渡す入力のサイズと形状を追跡し続ける必要はありません。
dlnetwork
オブジェクトに対して関数 predict
と forward
を使用する場合、入力データは書式化された dlarray
オブジェクトでなければなりません。ソフトウェアにより、書式化された dlarray
オブジェクトが層の関数に必ず渡されるようにするには、クラスの定義に Formattable
mixin を含めます。
classdef myLayer < nnet.layer.Layer & nnet.layer.Formattable ... end
自動的な初期化を活用するには、初期化されていない dlnetwork
オブジェクトをコンストラクター関数が作成するように指定しなければなりません。初期化されていない dlnetwork
オブジェクトを作成するには、名前と値のオプション Initialize
を false に設定します。入力層を指定する必要がないため、層の入力サイズを指定する必要はありません。
function layer = myLayer % Initialize layer properties. ... % Define network. layers = [ % Network layers go here. ]; layer.Network = dlnetwork(lgraph,Initialize=false); end
親ネットワークが初期化されると、入れ子にされた dlnetwork
オブジェクトの学習可能パラメーターが同時に初期化されます。学習可能パラメーターのサイズは、カスタム層の入力データのサイズによって異なります。入れ子ネットワーク全体にデータが伝播され、伝播されたサイズおよび入れ子ネットワークの層の初期化プロパティに従ってパラメーターが自動的に初期化されます。
関数 trainNetwork
を使用して親ネットワークに学習させると、入れ子にされた dlnetwork
オブジェクトが trainNetwork
の呼び出し時に初期化されます。親ネットワークが dlnetwork
の場合、親ネットワークを構築したとき (構築時に親の dlnetwork
を初期化する場合)、または親ネットワークに関数 initialize
を使用したとき (構築時に親の dlnetwork
を初期化しない場合)、入れ子にされた dlnetwork
オブジェクトが初期化されます。
自動的な初期化を使用しない場合は、初期化済みの入れ子ネットワークを使ってカスタム層を構築できます。この場合、親ネットワークの前に入れ子ネットワークが初期化されます。構築時に入れ子ネットワークを初期化するには、入れ子ネットワークの入力のサイズを手動で指定しなければなりません。この場合、入れ子ネットワークの入力のサイズを手動で指定する必要があります。これを実行するには、入力層を使用するか、コンストラクター関数 dlnetwork
にサンプル入力を与えます。dlnetwork
オブジェクトへの入力のサイズを指定しなければならないため、この層を作成するときに入力サイズの指定が必要になる場合があります。層への入力のサイズを判断するために、関数 analyzeNetwork
を使用して前の層の活性化サイズをチェックできます。
予測関数と順方向関数
層によっては学習時と予測時の動作が異なる場合があります。たとえば、ドロップアウト層は学習時にのみドロップアウトを行い、予測時には何の影響も与えません。層は、フォワード パスを実行するために 2 つの関数 predict
と forward
のいずれかを使用します。フォワード パスが予測時に発生する場合、層は関数 predict
を使用します。フォワード パスが学習時に発生する場合、層は関数 forward
を使用します。予測時と学習時で異なる 2 つの関数を必要としない場合は、関数 forward
を省略できます。この場合、学習時に層は predict
を使用します。
カスタム層の関数 predict
および forward
を実装する際は、dlnetwork
オブジェクト内の層が正しく動作することを確認するために、dlnetwork
オブジェクトの関数 predict
および forward
をそれぞれ使用します。
学習可能な dlnetwork
オブジェクトをもつカスタム層では、カスタム逆方向関数がサポートされていません。
このコード例では、入力 dlnetwork
をもつ関数 predict
および forward
の使用方法を示します。
function Z = predict(layer,X) % Predict using network. net = layer.Network; Z = predict(net,X); end function Z = forward(layer,X) % Forward pass using network. net = layer.Network; Z = forward(net,X); end
このコード例では、状態パラメーターをもつ dlnetwork
オブジェクトと共に関数 predict
および forward
を使用する方法を示します。
function [Z,state] = predict(layer,X) % Predict using network. net = layer.Network; [Z,state] = predict(net,X); end function [Z,state] = forward(layer,X) % Forward pass using network. net = layer.Network; [Z,state] = forward(net,X); end
学習時と予測時で dlnetwork
オブジェクトの動作が同じ場合は、順方向関数を省略できます。この場合、ソフトウェアは学習時に関数 predict
を使用します。
GPU 互換性
層の順方向関数が dlarray
オブジェクトを完全にサポートしている場合、層は GPU 互換です。そうでない場合、GPU 互換にするには、層関数が入力をサポートし、gpuArray
(Parallel Computing Toolbox) 型の出力を返さなければなりません。
多くの MATLAB® 組み込み関数が入力引数 gpuArray
(Parallel Computing Toolbox) および dlarray
をサポートしています。dlarray
オブジェクトをサポートしている関数の一覧については、dlarray をサポートする関数の一覧を参照してください。GPU で実行される関数の一覧については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。深層学習に GPU を使用するには、サポートされている GPU デバイスもなければなりません。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。MATLAB での GPU の使用の詳細は、MATLAB での GPU 計算 (Parallel Computing Toolbox)を参照してください。
参考
checkLayer
| trainNetwork
| trainingOptions
| analyzeNetwork
| dlnetwork