Main Content

深層学習のネットワーク構成

それ自体が層グラフを定義するカスタム層を作成するには、層定義の properties (Learnable) セクションで、学習可能パラメーターとして dlnetwork オブジェクトを宣言します。この手法は "ネットワーク構成" と呼ばれます。以下の場合にネットワーク構成を使用できます。

  • 学習可能な層のブロックを表す単一のカスタム層 (残差ブロックなど) の作成。

  • コントロール フローをもつネットワーク (入力データに応じて動的に変更できるセクションをもつネットワークなど) の作成。

  • ループをもつネットワーク (自分自身に出力をフィードバックするセクションをもつネットワークなど) の作成。

学習可能パラメーターと状態パラメーターの両方をもつ入れ子ネットワーク (たとえば、バッチ正規化層または LSTM 層をもつネットワークなど) の場合は、層定義の properties (Learnable, State) セクションでネットワークを宣言します。

学習可能な dlnetwork オブジェクトを含むカスタム層を定義する方法の例については、入れ子になった深層学習層の定義を参照してください。

入れ子層をもつネットワークに学習させる方法を説明する例については、入れ子層をもつ深層学習ネットワークの学習を参照してください。

学習可能な dlnetwork オブジェクトを学習で使用するための自動的な初期化

カスタム層を作成すると、親ネットワークが完全に構築された後に、入れ子にされた dlnetwork オブジェクトの学習可能パラメーターを自動的に初期化させることができます。入れ子ネットワークを自動的に初期化する場合、入れ子にされた dlnetwork を含む各カスタム層に渡す入力のサイズと形状を追跡し続ける必要はありません。

dlnetwork オブジェクトに対して関数 predictforward を使用する場合、入力データは書式化された 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 つの関数 predictforward のいずれかを使用します。フォワード パスが予測時に発生する場合、層は関数 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 を使用します。

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)を参照してください。

参考

| | | |

関連するトピック