主要内容

。

cuDNNを使用した深层学习ネットワークのコード生成

GPU编码器™を使用して,深度学习工具箱™からさまざまな事前学习済みの深层学习ネットワークの予测に対する最适化されたコードを生成できます。生成コードでは,入力オブジェクト(系列网络(深度学习工具箱)またはDAGNetwork(深度学习工具箱))でで指定した,层,およびおよびを使使(cnn)ががはネットワークれます。コードジェネレーターはnvidia®GPUのnvidia cuda®深层神经网络库(cuDNN)を利用します.cuDNNは深层ニューラルネットワークに対するプリミティブのGPUで高速化されたライブラリです。生成されたコードは,ソースコード,スタティックライブラリまたはダイナミックライブラリ,あるいはさまざまなNVIDIA GPUプラットフォームに配布できる実行可能ファイルとしてプロジェクトに统合できます。

次のいずれかの方法を使用して畳み込みネットワークのコードを生成します。

  • 马铃薯®エントリポイント关数からCUDAコードを生成する标准の关数代码生成

  • MATLABエントリポイント关数からCUDAコードを生成するGPU编码器アプリ。

メモ

以前のリリースでは,关数cnncodegenをを用することによってによってによってライブラリライブラリを対象することができたた.r2020b以降以降は,关联cnncodegenの代わりに代码生成コマンドを使用することをお勧めします。これは,今后のリリースで,关数cnncodegenがc++コードを生成し,手臂®Mali GPUプロセッサプロセッサ専スタティックライブラリをする予定であるためですですですです。

googlenetをを使用したコード生成およびイメージイメージ分享

この例では,GPU编码器を使用して事前学习済みのgooglenet(深度学习工具箱)深层深层畳み込みニューラルネットワークのののコードをを生し,イメージを分类します.Googlenetは,100万枚超えるイメージ习习しおり,イメージを1000个のカテゴリ(キーボード,マグカップ,铅笔,动物など)に分类できます。このネットワークは広范囲にわたるイメージについての豊富な特徴表现を学习しています。このネットワークは入力としてイメージを取り,イメージ内のオブジェクトのラベルを各オブジェクトカテゴリの确率と共に出力します。この例では,代码生成コマンドとgpu编码器アプリを使使し事前て习済みのネットワークのコード生成方法

要件

必须

この例では,以下の追加の要件を持つCUDA MEXを生成します。

  1. 深入学习工具箱。

  2. google网络的深度学习工具箱模型サポートパッケージ。

  3. 用于深度学习库的GPU编码器界面サポートパッケージ。

  4. CUDA対応nVidia GPUおよび互换性のある.8ビット幂罚款でドライバー。计算能力6.1,6.3,またはそれ以上のの。

オプション

スタティックライブラリ,ダイナミックライブラリ,実行可能ファイルなどのMEX以外のビルドでは,以下の要件も适用されます。

  1. CUDAツールキットおよびcuDNNライブラリ。サポートされているコンパイラおよびライブラリのバージョンの详细は,前提条件となる制品のインストールを参照してください。

  2. コンパイラおよびライブラリの环境変数。详细については,环境数を参照してください。

事前学习済みのネットワークの読み込み

  1. 事前学习済みのGoogLeNetネットワークを読み込みます。イメージ分类用の异なる事前学习済みネットワークの読み込みを选択できます。必要なサポートパッケージがインストールされていない场合,ダウンロード用リンクが表示されます。

    净= googlenet;

  2. オブジェクトにはDAGNetwork关が格式されています。关字analyzeNetwork(深度学习工具箱)を使用して,ネットワークアーキテクチャを対话的に可视化して表示し,ネットワークに关するエラーや问题を検出して,ネットワーク层についての详细情报を表示します。层の情报には,层の活性化と学习可能なパラメーターのサイズ,学习可能なパラメーターの総数,および再帰层の状态パラメーターのサイズが含まれます。

    analyzeNetwork(净值);

  3. 分享するイメージのサイズ,ネットワークのの力サイズと同じでなけれなりん.Googlenetののん。imageInputlayer.(深度学习工具箱)のサイズは224x 224 x 3です。能力classificationLayer(深度学习工具箱)班级プロパティには,ネットワークによって学习さたクラス名前がれてますますますいますます。うちいいますのうち10个をランダムに表示し。

    ClassNames = Net.Layers(END).Classes;numclasses = numel(classnames);DISP(CLASSNMES(RANDPERM(NUMCLASES,10)))
    'Speedboat''窗口屏幕''Isopod''木勺''唇膏'''Drake'''鬣狗'''哑铃''草莓''&amper''

    詳細については,深层学习层の一覧(深度学习工具箱)を参照してください。

エントリポイント关数の作成

  1. MATLABででを行为エントリポイント关键词作物

    1. 关节Coder.LoadDeePlearningnetwork.を使用して深层学习モデルを読み込み,CNNクラスを作成して设定する。详细については,コード生成用の事前学习済みのネットワークの読み込みを参照してください。

    2. 预测(深度学习工具箱)を呼び出して応答をするする。

  2. 次に例を示します。

    功能OUT = googlenet_predict(上)%#代码生成执着的yeNet;如果isempty(mynet)mynet = coder.loaddeeplearningnetwork('googlenet');结尾%通过输入出局=预测(Mynet,In);

    永続的なオブジェクト我的网DAGNetworkオブジェクトを読み込みます。エントリポイント关数への最初の呼び出しで,永続的なオブジェクトが作成されて设定されます。后続の关数の呼び出しでは,入力の呼び出し预测に同じオブジェクトが再利用され,ネットワークオブジェクトの再构と読み込みが回避されます。

    メモ

    コード生成では,ネットワークを永続オブジェクトに読み込む必要があります。

  3. 特价の层のネットワークネットワークネットワーク化激活(深度学习工具箱)メソッドを使用することもできます。たとえば,次のコードの行はlayerIdxで指定された层のネットワーク活性化を返します。

    OUT =激活(MYNET,IN,LayerIDX,'Outputas','频道');

  4. 分类(深度学习工具箱)メソッドを使用して,学習済みネットワーク我的网のイメージデータのクラスラベルを予测することもできます。

    [出来,分数] =分类(我的网,在);

    LSTMネットワークに対しては,predictandanddatestate.(深度学习工具箱)メソッドとresetState(深度学习工具箱)メソッドも使用できます。これらのメソッドの使用上の注意および制限については,サポートされる关数の表の対応するエントリを参照してください。

代码生成を使用したコード生成

  1. 出力又名,场所,タイプなどのビルド设定を成するは,コーダーコーダー成作作作作作作者有关coder.gpuConfigを使用します。たとえば,代码生成コマンドを使用ししてて梅克斯を生成する料CFG = coder.gpuConfig( 'MEX');を使用します。

    その他の利用可能なオプションは次のとおりです。

    1. cfg = coder.gpuconfig('lib');,CUDA C / C ++スタティックライブラリの生成时に代码生成で使用する生成构成オブジェクト作物成し。

    2. CFG = coder.gpuConfig( 'DLL');,CUDA C / C ++ダイナミックライブラリの生成时に代码生成で使用する生成构成オブジェクト作物成し。

    3. cfg = coder.gpuconfig('exe');,CUDA C / C ++実行可能ファイル生成时に代码生成で使用する生成构成オブジェクト作物成し。

  2. Cudnnのコード生成パラメーター指定指定には,DeepLearningConfigプロパティを,编码器。DeepLearningConfigを使用して作成した编码器。CuDNNConfigオブジェクトに设定します。

    cfg = coder.gpuconfig('mex');cfg.TargetLang ='C ++';cfg.DeepLearningConfig = coder.DeepLearningConfig(“cudnn”);cfg.DeepLearningConfig.AutoTuning = true;cfg.DeepLearningConfig.DataType ='fp32';

    数据类型プロパティを使用することによって,サポートされている层での推论计算の精度を指定します0.32ビット浮动小数点の推论を実行する场合,'fp32'を使用します0.8ビット整数には,“int8”を使用します。既定値は'fp32'です。INT8の精度を使用するには,以6.1计算能力上のCUDA GPUが必要です。GpuConfigオブジェクトのComputeCapabilityプロパティプロパティ使使し,适切な计算能力値値设定し。

    メモ

    INT8データ型のコード生成は,エントリポイント关键内のの习习ネットワークサポートていませんしませません。

  3. 代码生成コマンドを実行します。代码生成コマンドはgooglenet_predict.mMATLABエントリポイント关数からCUDAコードを生成します。

    代码生成-Config.CFG.googlenet_predict.-  args.{ONE(224,224,3)}-报告

    1. -报告オプションは,matlabコードのデバッグににコード生成レポート生成するよう代码生成に指示します。

    2. - args.オプションは,入力在で指定したクラス,サイズ,および実数/复素数を使用して,ファイルgooglenet_predict.mをコンパイルするように代码生成にに指示し値(224,224,3)はGoogLeNetネットワークの入力层サイズに対応します。

    3. -Config.オプションは,指定した構成オブジェクトをコード生成に使用するように代码生成に指示します。

    メモ

    コード生成に半精度の入力を指定できます。ただし,コードジェネレーターの型は入力を単精度にキャストします.Deep学习工具箱は,MATLAB内のすべての计算に単精度浮动小数点演算を使用します。

    コードジェネレーターは,既定で列优先のレイアウト使します。行优先のレイアウト使使使は,代码生成コマンドに-Rowmajor.オプションを渡します。あるいは,コード生成构成オブジェクトのcfg.RowMajorパラメーターを変更して,行优先のレイアウトでコードを构成します。

  4. コード生成に成功したら,MATLABコマンドウィンドウで[レポートの表示]をクリックすることで,結果のコード生成レポートを表示できます。レポートがレポートビューアーウィンドウに表示されます。コード生成時にコードジェネレーターによりエラーまたは警告が検出されると,レポートでは問題が説明され,問題のあるMATLABコードへのリンクが提供されます。コード生成レポートを参照してください。

    代码生成成功:查看报告

生成コード

DAGネットワ​​ークは,78个の层クラスから成るを含むc ++クラスとして生成さます。コードコードジェネレーター畳み込み畳み込み层ととと层のレイヤーレイヤーフュージョン适を使使のててのををのしてをししししししししgooglenet_predict_types.h.ファイルからのクラス宣言のスニペットが表示されます。

googlenet_predict_types.h.ファイル

  • このクラスの设置()メソッドは,ハンドルを设定し,ネットワークオブジェクトの各层にメモリを割り当てます。

  • 预测()メソッドは,ネットワーク内の78个の层それぞれについて予测を呼び出します。

  • Deeplearningnetwork.cu.ファイルにはb_googlenet_0クラスのオブジェクト関数の定義が含まれます。

たとえば,ファイル,ファイルファイルは,ネットワーク内の全层や畳み込み层のパラメーターを层层に対してなどのれパラメーターを层に対してに対してエクスポートされを持つ层に対してエクスポートされれれ持つ层に対してに対してエクスポートれれれたとえば层CNN_GOOGLENET_CONV * _W.およびCNN_GOOGLENET_CONV * _B.は,ネットワーク内のFusedConvReLU層の重みとバイアスパラメーターに対応します。コードジェネレーターは,これらのバイナリファイルを代码生成フォルダーに配置します。

メモ

视窗®システムの場合,有些后卫などのウイルス対策ソフトウェアによって,一部の重みファイルが感染されていると誤って識別され,削除される場合があります。これらのケースは誤検知であり,ウイルス対策プログラムでファイルを安全であるとしてマークできます。

生成されたコードファイルgooglenet_predict()で,エントリポイント関数googlenet_predict.cu.は,b_googlenet_0クラス型の静的オブジェクトを构筑し,このネットワークオブジェクトに対して设置や预测を呼び出します。

googlenet_predict.cu.ファイル

アプリを使用した生成

エントリポイントのの指定に,入アプリ手顺を,アプリで手顺を完了し。GPU编码器アプリを使用したコード生成を参照してください。

[コード生成]手順で,以下を行います。

  1. [ビルドタイプ]梅克斯に设定します。

  2. [详细设定]をクリックします。[深层学习]ペインで,[ターゲットライブラリ][cuDNN]に设定します。

  3. 设定ウィンドウを闭じます.CUDAコードを生成するには,[生成]をクリックします。

生成された的makefile

'lib''DLL',および'可执行程序'ターゲットに対して,コードジェネレーターは代码生成フォルダーに* _rtw.mk.制作ファイルを作用成し。この制作ファイルでは,生成されたコードのはセクションセクションで検出さされたたSTART_DIRを使用して指定されます。既定では,この変数は,コードが生成される现在の作业フォルダーのパスを指します。生成されたファイルを移动し,生成文件を使用してビルドする予定がある场合は那START_DIRの生成さされた値适切ななパスので置き换え

生成された墨西哥人の実行

  1. 分享到するは,ネットワークのの力サイズと同じばなりません。分享するイメージ読み取り,そのサイズをネットワークの入サイズ変更ますますこの変更しは。します。

    Im = imread(“peppers.png”);InputLayerSize = Net.Layers(1).InputSize;IM = IMResize(I,InputLayersize(1:2));
  2. 入力イメージに対してgooglenetの预测を呼び出します。

    predict_scores = googlenet_predict_mex(IM);
  3. 上位5つの予测ラベルとそれらに対応する确率をヒストグラムとして表示します。ネットワークはイメージを非常に多くのオブジェクトカテゴリに分类しますが,多くのカテゴリは似ているため,ネットワークを评価するときは,通常,上位5つの精度を考虑します。このネットワークは高い确率でこのイメージをピーマンとして分类します。

    [得分,Indx] =排序(预测_coves,“下降”);ClassNamestop = ClassNames(Indx(1:5));h =图;H.Position(3)= 2 * H.Position(3);AX1 =子图(1,2,1);AX2 =子图(1,2,2);图像(AX1,IM);BARH(AX2,分数(5:-1:1))XLABEL(AX2,“概率”)YTicklabels(AX2,ClassNamestop(5:-1:1))AX2.YAXISLOCATION =“对”;sgtitle('使用googlenet的前5名预测'

参考

关节

オブジェクト

关键词トピック