主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

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

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

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

  • MATLAB®エントリポイント関数からCUDAコードを生成する標準の関数codegen

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

メモ

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

GoogLeNetを使用したコードの生成およびイメージの分類

この例では,GPU编码器を使用して事前学習済みのgooglenet(深度学习工具箱)深層畳み込みニューラルネットワークのCUDAコードを生成し,イメージを分類します。100年GoogLeNetは万枚を超えるイメージで学習しており,イメージを1000個のオブジェクトカテゴリ(キーボード,マグカップ,鉛筆,動物など)に分類できます。このネットワークは広範囲にわたるイメージについての豊富な特徴表現を学習しています。このネットワークは入力としてイメージを取り,イメージ内のオブジェクトのラベルを各オブジェクトカテゴリの確率と共に出力します。この例では,codegenコマンドとGPU编码器アプリを使用して事前学習済みのネットワークのコードを生成する方法を示します。

要件

必須

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

  1. 深度学习工具。

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

  3. 深度学习库的GPU编码器接口サポートパッケージ。

  4. CUDA対応NVIDIA GPUおよび互換性のあるドライバー。8ビット整数精度では,计算能力6.1,6.3,またはそれ以上のCUDA GPUが必要です。

オプション

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

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

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

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

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

    网= googlenet;

  2. オブジェクトにはDAGNetworkオブジェクトが格納されています。関数analyzeNetwork(深度学习工具箱)を使用して,ネットワークアーキテクチャを対話的に可視化して表示し,ネットワークに関するエラーや問題を検出して,ネットワーク層についての詳細情報を表示します。層の情報には,層の活性化と学習可能なパラメーターのサイズ,学習可能なパラメーターの総数,および再帰層の状態パラメーターのサイズが含まれます。

    analyzeNetwork(净);

  3. 分類するイメージのサイズは,ネットワークの入力サイズと同じでなければなりません。GoogLeNetの場合,imageInputLayer(深度学习工具箱)のサイズは224 x 224 x 3です。出力classificationLayer(深度学习工具箱)プロパティには,ネットワークによって学習されたクラスの名前が含まれています。1000年合計個のクラス名のうち10個をランダムに表示します。

    一会= net.Layers . class(结束);numClasses =元素个数(类名);disp(类名(randperm (numClasses 10)))
    “快艇”“纱窗”“等足动物”“木勺”“口红”“德雷克”“鬣狗”“哑铃”“草莓”“奶油苹果”

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

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

  1. MATLABで次を行うエントリポイント関数を作成します。

    1. 関数coder.loadDeepLearningNetworkを使用して深層学習モデルを読み込み,CNNクラスを作成して設定する。詳細については,コード生成用の事前学習済みのネットワークの読み込みを参照してください。

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

  2. 次に例を示します。

    函数= googlenet_predict(中)% # codegen持续的mynet;如果isempty(mynet) mynet = code . loaddeeplearningnetwork (“googlenet”);结束输入通过率=预测(mynet,);

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

    メモ

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

  3. 特定の層のネットワーク活性化に激活(深度学习工具箱)メソッド,次ののますことことことできできできできでき行行行行行layerIdxで指定された層のネットワーク活性化を返します。

    出=激活(mynet layerIdx,“OutputAs”,“渠道”);

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

    [,分数]=分类(mynet,);

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

codegenを使用したコード生成

  1. 出力ファイル名,場所,タイプなどのビルド設定を構成するには,コーダー構成オブジェクトを作成します。このオブジェクトを作成するには,関数coder.gpuConfigを使用します。たとえば,codegenコマンドを使用してCUDA墨西哥人を生成する場合,cfg = coder.gpuConfig(墨西哥人);を使用します。

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

    1. cfg = coder.gpuConfig(“自由”);, CUDA C / c++スタティックライブラリの生成時にcodegenで使用するコード生成構成オブジェクトを作成します。

    2. cfg = coder.gpuConfig (dll);, CUDA C / c++ダイナミックライブラリの生成時にcodegenで使用するコード生成構成オブジェクトを作成します。

    3. cfg = coder.gpuConfig (exe);, CUDA C / c++実行可能ファイルの生成時にcodegenで使用するコード生成構成オブジェクトを作成します。

  2. cuDNNのコード生成パラメーターを指定するには,DeeplearningConfigプロパティを,coder.deeplearningconfigをを用して作物coder.cudnnconfigオブジェクトに設定します。

    cfg = coder.gpuConfig (墨西哥人的);cfg。TargetLang =“c++”;cfg。DeepLearningConfig =编码器。DeepLearningConfig ('cudnn');cfg.deeplearningconfig.autotuning = true;cfg.deeplearningconfig.datatype =.“fp32”

    数据类型プロパティを使用することによって,サポートされている層での推論計算の精度を指定します。32ビット浮動小数点の推論を実行する場合,“fp32”を使用します。8ビット整数には,'int8'を使用します。既定値は“fp32”です。INT8の精密を使使するは,计算能力6.1以上のcuda gpuが必要です。GpuConfigオブジェクトのComputeCapabilityプロパティを使用して,適切な计算能力値に設定します。

    メモ

    INT8データ型のコード生成は,エントリポイント関数内の複数の深層学習ネットワークをサポートしていません。

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

    codegen配置cfggooglenet_predictarg游戏{1 (224224 3)}报告

    1. 报告オプションは,MATLABコードのデバッグに使用できるコード生成レポートを生成するようにcodegenに指示します。

    2. arg游戏オプションは,入力在で指定したクラス,サイズ,および実数/複素数を使用して,ファイルgooglenet_predict.mをコンパイルするようにcodegenに指示します。値(224224年,3)はGoogLeNetネットワークの入力層サイズに対応します。

    3. 配置オプションは,指定した构成オブジェクトコード生成に使使ようにcodegenに指示します。

    メモ

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

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

  4. コード生成に成功し,matlabコマンドウィンドウで[レポートの表示)あるmatlabコードコードへのリンクが提供されコード生成レポートを参照してください。

    代码生成成功:查看报告

生成コード

78年DAGネットワークは個の層クラスから成る配列を含むc++クラスとして生成されます。コードジェネレーターは畳み込み層とReLU層のレイヤーフュージョン最適化を使用して層の数を削減します。googlenet_predict_types.hファイルからのクラス宣言のスニペットが表示されます。

googlenet_predict_types.hファイル

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

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

  • DeepLearningNetwork.cuファイルにはb_googlenet_0クラスクラスオブジェクト关节

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

メモ

窗户®システムシステムの合,位防守などのウイルス対策ソフトウェアによって,一道のの重みファイルが感染されいると误って识别さされれされる场场がありれますのケースはは误検知でありますますますケースは误検知でありでありますますケースは误検知でありでありますますケースはは误検を安全であるとしてマークできます。

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

googlenet_predict.cuファイル

アプリを使用したコード生成

エントリポイント関数を指定し,入力の型を指定するには,アプリで手順を完了します。GPU编码器アプリアプリ使使使用した生成を参照してください。

[コード生成)手顺手顺,以下を行い。

  1. [ビルドタイプ]墨西哥人に設定します。

  2. [詳細設定]をクリックします。[深層学習]ペインで,[ターゲットライブラリ](cuDNN)に設定します。

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

生成されたmakefile

“自由”“dll”,およびexe”ターゲットに対して,コードジェネレーターはcodegenフォルダーに* _rtw.mk使ファイルを作成します。この使ファイルでは,生成されたコードの場所はセクションで検出された変数START_DIRを使用して指定されます。既定では,この変数は,コードが生成される現在の作業フォルダーのパスを指します。生成されたファイルを移動し,makefileを使用してビルドする予定がある場合は,START_DIRの生成された値を適切なパスの場所で置き換えます。

生成され喵喵喵喵

  1. 分類するイメージのサイズは,ネットワークの入力サイズと同じでなければなりません。分類するイメージを読み取り,そのサイズをネットワークの入力サイズに変更します。このサイズ変更では,イメージの縦横比が多少変化します。

    我= imread (“peppers.png”);inputLayerSize = net.Layers (1) .InputSize;我= imresize(我inputLayerSize (1:2));
  2. 入力イメージに対してGoogLeNetの预测を呼び出します。

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

    [分数,indx] =排序(predict_scores“下”);classNamesTop =一会(indx (1:5));h =图;h.Position (3) = 2 * h.Position (3);ax₁=情节(1、2、1);ax2 =情节(1、2、2);图像(ax₁,im);barh (ax2,分数(5:1:1))包含(ax2,'可能性') yticklabels (ax2 classNamesTop (5: 1:1)) ax2。YAxisLocation ='对';sgtitle (“使用GoogLeNet的5大预测”

参考

関数

オブジェクト

関連するトピック