Main Content

コード生成における dlarray の制限事項

推奨される使用方法

コード生成用に、関数 dlarray (Deep Learning Toolbox) を使用して深層学習配列を作成します。たとえば、mynet.mat MAT ファイルに事前学習済みの dlnetwork (Deep Learning Toolbox) ネットワーク オブジェクトがあるとします。このネットワークの応答を予測するには、次のコードに示すようなエントリポイント関数を MATLAB® で作成します。

function a = foo(in)
dlIn = dlarray(in, 'SSC');

persistent dlnet;
if isempty(dlnet)
    dlnet = coder.loadDeepLearningNetwork('mynet.mat');
end

dlA = predict(dlnet, dlIn);

a = extractdata(dlA);

end

可変サイズの dlarray の使用

可変サイズの dlarray オブジェクトを使用する MATLAB コードのコードを生成できます。

たとえば、次の MATLAB 設計ファイルを定義します。

function out = fooAdd(in1,in2) %#codegen
dlIn1_1 = dlarray(in1);
dlIn1_2 = dlarray(in2);
out = dlIn1_1 + dlIn1_2;
end

2 つの入力 in1in2single 型の制限なしの 2 次元配列として指定します。fooAdd の汎用 C MEX コードを生成するための適切なコード構成オブジェクト cfg を作成します。MEX コードを生成し、生成された MEX を実行します。

t_in1 = coder.typeof(single(1),[inf inf],[1 1]);
t_in2 = coder.typeof(single(1),[inf inf],[1 1]);

codegen fooAdd -args {t_in1,t_in2} -report 

out = fooAdd_mex(single(eye(4,4)),single(ones(4,1)));

可変サイズの dlarray オブジェクトのコードを生成するときは、次の制限に従ってください。

  • dlarray オブジェクトの次元 U は固定サイズでなければなりません。

  • dlarray のデータ形式 fmt が 1 文字のみの場合、対応するデータ配列 X に可変サイズの次元を 1 つだけ含めることができます。その他の X の次元は、いずれも大きさが 1 の次元でなければなりません。

  • dlarray オブジェクトと数値配列の間の演算で、数値配列のいずれかのオペランドが暗黙的に拡張される可能性がある場合は、dlarray オブジェクトの固定サイズの次元 U を数値配列の可変サイズの次元と結合しないでください。

  • 可変サイズの dlarray オブジェクトに対する maxminmean などの単項演算では、使用する次元を定数値で明示的に指定します。自動次元選択の制限事項を参照してください。

制限

深層学習配列のコード生成には次の制限があります。

  • dlarray オブジェクトのデータ形式引数はコンパイル時の定数でなければなりません。次に例を示します。

    function out = foo()
    
    dlA = dlarray(ones(5,4),'SSC'); %fmt 'SSC' is constant
     .
     .
     .
    end

  • コード生成レポートには、dlarray オブジェクトのサイズは表示されません。サイズは常に 1x1 と表示されます。

    Screen shot of sample report generator showing dlarray size as 1-by-1

  • MATLAB では、dlarray によってラベルの順序 'SCBTU' が強制的に適用されます。この適用により、演算であいまいなセマンティクスが回避され、暗黙的に入力間でラベルが一致します。この動作は、MEX コードの生成時に模倣されます。ただし、スタティック ライブラリ、ダイナミック ライブラリ、実行可能ファイルなどのスタンドアロン コード生成の場合、データ形式は dlarray オブジェクトの fmt 引数の指定に従います。そのため、エントリポイント関数の入力または出力が dlarray オブジェクトで、そのラベルの順序が 'SCBTU' でない場合、データ レイアウトは MATLAB 環境とスタンドアロン コードで異なります。

    たとえば、dlarray オブジェクトを出力とする関数 foo について考えます。

    function dlA = foo()
    rng default
    dlA = dlarray(rand(5,4), 'BC');
     
    end
    

    MATLAB では、dlA4(C)5(B) 列です。

    dlA = 
    
      4(C) × 5(B) dlarray
    
        0.8147    0.9058    0.1270    0.9134    0.6324
        0.0975    0.2785    0.5469    0.9575    0.9649
        0.1576    0.9706    0.9572    0.4854    0.8003
        0.1419    0.4218    0.9157    0.7922    0.9595
    

    スタンドアロン コード生成では、dlA5(B)4(C) 列です。

  • コード生成では、dlnetwork オブジェクトの predict メソッドの dlarray 入力は single データ型でなければなりません。

参考

オブジェクト

関連する例

詳細