Main Content

コード生成用の事前学習済みのネットワークの読み込み

事前学習済みニューラル ネットワークのコードを生成できます。コード ジェネレーターにネットワークを提供するには、学習済みネットワークから SeriesNetwork (Deep Learning Toolbox)DAGNetwork (Deep Learning Toolbox)yolov2ObjectDetector (Computer Vision Toolbox)yolov3ObjectDetector (Computer Vision Toolbox)yolov4ObjectDetector (Computer Vision Toolbox)ssdObjectDetector (Computer Vision Toolbox)、または dlnetwork (Deep Learning Toolbox) オブジェクトを読み込みます。

coder.loadDeepLearningNetwork を使用したネットワークの読み込み

coder.loadDeepLearningNetwork を使用して、コード生成でサポートされているネットワークからネットワーク オブジェクトを読み込むことができます。ネットワークを MAT ファイルから指定できます。MAT ファイルには、読み込まれるネットワークのみが含まれていなければなりません。

たとえば、関数 trainNetwork (Deep Learning Toolbox) を使用して myNet と呼ばれる事前学習済みのネットワーク オブジェクトを作成するとします。次に、「save」と入力してワークスペースを保存します。これにより、ネットワーク オブジェクトを含む matlab.mat と呼ばれるファイルが作成されます。ネットワーク オブジェクト myNet を読み込むには、次のように入力します。

net = coder.loadDeepLearningNetwork('matlab.mat');

事前学習済みの SeriesNetworkDAGNetworkdlnetworkyolov2ObjectDetectoryolov3ObjectDetectoryolov4ObjectDetector、または ssdObjectDetector オブジェクトを返す次のような関数名を使用して、ネットワークを指定することもできます。

たとえば、次のように入力してネットワーク オブジェクトを読み込みます。

net = coder.loadDeepLearningNetwork('googlenet');

前述の一覧の Deep Learning Toolbox™ 関数では、その関数のサポート パッケージをインストールする必要があります。事前学習済みの深層ニューラル ネットワーク (Deep Learning Toolbox)を参照してください。

コード生成のネットワーク オブジェクトの指定

codegen またはアプリを使用してコードを生成する場合、coder.loadDeepLearningNetwork を使用してエントリポイント関数の内部でネットワーク オブジェクトを読み込みます。次に例を示します。

function out = myNet_predict(in) %#codegen

persistent mynet;

if isempty(mynet)
    mynet = coder.loadDeepLearningNetwork('matlab.mat');
end
out = predict(mynet,in);

alexnetinceptionv3googlenetresnet などのサポート パッケージ関数として使用可能な事前学習済みネットワークでは、たとえば、mynet = googlenet を記述してそのサポート パッケージ関数を直接指定できます。

次に、エントリポイント関数のコードを生成します。次に例を示します。

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); 
codegen -args {ones(224,224,3,'single')} -config cfg myNet_predict

コード生成の dlnetwork オブジェクトの指定

mynet.mat MAT ファイルに事前学習済みの dlnetwork ネットワーク オブジェクトがあるとします。このネットワークの応答を予測するには、このコードに示すように、MATLAB® でエントリポイント関数を作成します。

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

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

dlA = predict(dlnet, dlIn);

a = extractdata(dlA);

end

この例では、myDLNet_predict への入力と出力はより単純なデータ型であり、dlarray オブジェクトは関数内に作成されます。dlarray オブジェクトの extractdata (Deep Learning Toolbox) メソッドは、dlarray dlA のデータを myDLNet_predict の出力として返します。出力 a のデータ型は、dlA の基になるデータ型と同じです。このエントリポイントの設計には、次の利点があります。

  • スタティック ライブラリ、ダイナミック ライブラリ、実行可能ファイルなどのスタンドアロン コード生成ワークフローとの統合が容易になる。

  • 関数 extractdata からの出力のデータ形式が、MATLAB 環境と生成されたコードの両方で同じ順序 ('SCBTU') になる。

  • MEX ワークフローでのパフォーマンスが向上する。

  • Simulink®dlarray オブジェクトをネイティブにサポートしていないが、MATLAB Function ブロックの使用により Simulink ワークフローが単純化される。

次に、エントリポイント関数のコードを生成します。次に例を示します。

cfg = coder.gpuConfig('lib');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); 
codegen -args {ones(224,224,3,'single')} -config cfg myDLNet_predict

制限

  • coder.loadDeepLearningNetwork は複数のネットワークを含む MAT ファイルの読み込みをサポートしていません。

  • MAT ファイルには、読み込まれるネットワークのみが含まれていなければなりません。

  • コード ジェネレーターでは、ロケール設定によって決まる 8 ビット ASCII コードセットで文字が表されます。したがって、ファイル、フォルダー、またはネットワーク名に非 ASCII 文字を使用すると、エラーが発生する可能性があります。詳細については、コード生成での文字のエンコードを参照してください。

参考

関数

オブジェクト

関連するトピック