Main Content

深層学習のヒントとコツ

このページでは、深層学習ネットワークの精度を改善するための、さまざまな学習オプションや手法について説明します。ネットワークの学習を高速化する方法については、Speed Up Deep Neural Network Trainingを参照してください。

ネットワーク アーキテクチャの選択

適切なネットワーク アーキテクチャは、タスクや利用可能なデータによって異なります。どのアーキテクチャを使用するかや、事前学習済みのネットワークを使用するかゼロから学習させるかを決定する際に、以下の推奨事項を検討してください。

データタスクの説明詳細
イメージ自然イメージの分類

さまざまな事前学習済みのネットワークを試してみてください。事前学習済みの深層学習ネットワークの一覧については、事前学習済みの深層ニューラル ネットワークを参照してください。

ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを対話形式で準備する方法については、ディープ ネットワーク デザイナーを使用した転移学習用のネットワークの準備を参照してください。

自然イメージの回帰さまざまな事前学習済みのネットワークを試してみてください。事前学習済みの分類ネットワークを回帰ネットワークに変換する方法を示す例については、分類ネットワークの回帰ネットワークへの変換を参照してください。
自然イメージ以外のイメージの分類と回帰 (非常に小さいイメージやスペクトログラムなど)

非常に小さいイメージの分類方法を示す例については、イメージ分類用の残差ネットワークの学習を参照してください。

スペクトログラムの分類方法を示す例については、深層学習を使用した音声コマンド認識モデルの学習を参照してください。

セマンティック セグメンテーションComputer Vision Toolbox™ には、セマンティック セグメンテーション用の深層学習ネットワークを作成するためのツールが用意されています。詳細については、深層学習を使用したセマンティック セグメンテーション入門 (Computer Vision Toolbox)を参照してください。
シーケンス、時系列、および信号sequence-to-label 分類例については、深層学習を使用したシーケンスの分類を参照してください。
sequence-to-sequence 分類と回帰詳細は、深層学習を使用した sequence-to-sequence 分類および深層学習を使用した sequence-to-sequence 回帰を参照してください。
sequence-to-one 回帰例については、深層学習を使用した sequence-to-one 回帰を参照してください。
時系列予測例については、深層学習を使用した時系列予測を参照してください。
テキスト分類と回帰Text Analytics Toolbox™ には、テキスト データ用の深層学習ネットワークを作成するためのツールが用意されています。例については、深層学習を使用したテキスト データの分類を参照してください。
テキスト生成例については、深層学習を使用したテキストの生成を参照してください。
Audioオーディオの分類と回帰

さまざまな事前学習済みのネットワークを試してみてください。事前学習済みの深層学習ネットワークの一覧については、Pretrained Models (Audio Toolbox)を参照してください。

転移学習用のネットワークをプログラムで準備する方法については、Transfer Learning with Pretrained Audio Networks (Audio Toolbox)を参照してください。ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを対話形式で準備する方法については、Adapt Pretrained Audio Network for New Data Using Deep Network Designerを参照してください。

深層学習を使用して音を分類する方法を示す例については、Classify Sound Using Deep Learning (Audio Toolbox)を参照してください。

学習オプションの選択

関数 trainingOptions には、深層学習ネットワークに学習させるためのさまざまなオプションがあります。

ヒント詳細
学習の進行状況を監視する学習の進行状況プロットをオンにするには、Plots 学習オプションを "training-progress" に設定します。
検証データを使用する

検証データを指定するには、ValidationData 学習オプションを使用します。

メモ

検証データセットが小さすぎてデータを十分に表していない場合、報告されたメトリクスが役に立たない可能性があります。使用する検証データセットが大きすぎると、学習に時間がかかる可能性があります。

転移学習の場合、新しい層の学習速度を上げて、転移層での学習速度を下げる

たとえば、convolution2dLayerWeightLearnRateFactor プロパティを使用して、新しい層に指定する学習率係数を増やします。

InitialLearnRate 学習オプションを使用して、初期学習率を減らします。

転移学習の場合、同じエポック数の学習を行う必要はありません。MaxEpochs 学習オプションを使用してエポック数を減らします。

ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを対話形式で準備する方法については、ディープ ネットワーク デザイナーを使用した転移学習用のネットワークの準備を参照してください。

すべてのエポックでデータをシャッフルする

すべてのエポック (データを一巡すること) でデータをシャッフルするには、Shuffle 学習オプションを "every-epoch" に設定します。

メモ

シーケンス データの場合、シャッフルを行うとパディングや切り捨てられるデータの量が増える可能性があるため、シャッフルが精度に悪影響を与えることがあります。シーケンス データを使用する場合、シーケンス長でデータを並べ替えると役に立つことがあります。詳細については、シーケンスのパディングと切り捨てを参照してください。

さまざまなオプティマイザーを試す

さまざまなオプティマイザーを指定するには、関数 trainingOptions の引数 solverName を使用します。

学習精度の改善

学習中に問題に気が付いた場合は、以下の考えられる解決策について検討してください。

問題考えられる解決策
損失に NaN または大きなスパイクがある

InitialLearnRate 学習オプションを使用して、初期学習率を減らします。

学習率を減らしても効果がない場合は、勾配クリップの使用を試してください。勾配しきい値を設定するには、GradientThreshold 学習オプションを使用します。

学習の終了時に損失がまだ減少しているMaxEpochs 学習オプションを使用してエポック数を増やすことによって、学習時間を延ばします。
損失が横ばいになる

予想外に大きい値で損失が横ばいになる場合は、横ばいになったところで学習率を下げます。学習率スケジュールを変更するには、LearnRateSchedule 学習オプションを使用します。

学習率を下げても効果がない場合は、モデルが適合不足である可能性があります。パラメーターの数または層の数を増やしてみてください。検証損失を監視することによって、モデルが適合不足かどうかを確認できます。

検証損失が学習損失をはるかに上回っている

過適合を防止するには、以下の 1 つ以上を試してください。

  • データ拡張を使用します。詳細については、augmentedImageDatastore を参照してください。

  • ドロップアウト層を使用します。詳細については、dropoutLayer を参照してください。

  • L2Regularization 学習オプションを使用して、グローバル L2 正則化係数を増やします。

損失の減少が非常に遅い

InitialLearnRate 学習オプションを使用して、初期学習率を増やします。

イメージ データの場合、ネットワークにバッチ正規化層を含めてみてください。詳細については、batchNormalizationLayer を参照してください。

学習のエラーの修正

ネットワークが少しも学習されない場合は、以下の考えられる解決策について検討してください。

エラー説明考えられる解決策
学習時のメモリ不足エラー利用可能なハードウェアに現在のミニバッチ、ネットワークの重み、および計算した活性化を格納できません。

MiniBatchSize 学習オプションを使用して、ミニバッチ サイズを減らしてみてください。

ミニバッチ サイズを減らしても効果がない場合は、層の数を減らすか層内のパラメーター数またはフィルター数を減らして、小規模なネットワークの使用を試してください。

カスタム層のエラーカスタム層の実装に問題がある可能性があります。

checkLayer を使用してカスタム層の有効性をチェックし、潜在的な問題を見つけます。

checkLayer を使用してテストに失敗した場合、この関数はテスト診断とフレームワーク診断を表示します。テスト診断は層の問題を示しますが、フレームワーク診断は、より詳細な情報を提供します。テスト診断の詳細と考えられる解決策の提案については、診断を参照してください。

学習がエラー 'CUDA_ERROR_UNKNOWN' をスローするGPU が OS からの要求の計算と表示の両方に使用されている場合、このエラーをスローすることがあります。

trainingOptionsMiniBatchSize オプションを使用してミニバッチ サイズを減らしてみてください。

ミニバッチ サイズを減らしても効果がない場合は、Windows® で、タイムアウト検出と復旧 (TDR) の設定を調整してみてください。たとえば、TdrDelay を 2 秒 (既定の設定) から 4 秒に変更します (レジストリの編集が必要)。

analyzeNetwork を使用して、深層学習ネットワークを解析できます。関数 analyzeNetwork は、ネットワーク アーキテクチャを対話的に可視化して表示し、ネットワークに関するエラーや問題を検出して、ネットワーク層についての詳細情報を提供します。ネットワーク アナライザーを使用して、ネットワーク アーキテクチャを可視化して把握し、アーキテクチャが正しく定義されていることを確認して、学習前に問題を検出します。analyzeNetwork が検出する問題には、層の欠損または切り離し、層入力のサイズの不一致や誤り、層の入力数の誤り、無効なネットワーク構造などがあります。

データの準備と前処理

データを前処理して、精度を高めることができます。

クラス加重またはバランス調整

観測値の数がすべてのクラスで等しいことが理想的です。ただし、タスクによっては、クラスが不均衡である場合があります。たとえば、路上シーンの自動車データセットには、歩行者や自転車運転者のピクセルよりも多くの空、建物、および道路のピクセルが含まれる傾向があります。これは、空、建物、および道路がより広いイメージ領域を占めているためです。学習では上位クラスを優先してバイアスがかけられるため、正しく処理されていない場合は、こうした不均衡が学習プロセスに悪影響を及ぼす可能性があります。

分類タスクの場合、関数 trainnet のカスタム損失関数を使用してクラスの重みを指定できます。例については、Train Sequence Classification Network Using Data with Imbalanced Classesを参照してください。

または、以下の 1 つ以上を行って、クラスのバランスを調整することもできます。

  • 最も頻度が少ないクラスに新しい観測値を追加します。

  • 最も頻度が多いクラスから観測値を削除します。

  • 類似のクラスをグループ化します。たとえば、クラス "car" および "truck" を単一のクラス "vehicle" にグループ化します。

イメージ データの前処理

イメージ データの前処理の詳細については、イメージの深層学習向け前処理を参照してください。

タスク詳細
イメージのサイズ変更

事前学習済みのネットワークを使用するには、ネットワークの入力サイズに合わせてイメージのサイズを変更しなければなりません。イメージのサイズを変更するには、augmentedImageDatastore を使用します。たとえば、この構文はイメージ データストア imds 内のイメージのサイズを変更します。

auimds = augmentedImageDatastore(inputSize,imds);

ヒント

ImageDatastore オブジェクトを使用すると、事前取得を使用して JPG または PNG イメージ ファイルのバッチ読み取りを行うことができます。イメージのサイズ変更を含む深層学習用のイメージの前処理を効率的に行うには、augmentedImageDatastore オブジェクトを使用します。ImageDatastore オブジェクトの ReadFcn プロパティを使用しないでください。ReadFcn プロパティをカスタム関数に設定した場合、ImageDatastore オブジェクトはイメージ ファイルを事前取得しないため、通常、速度が大幅に低下します。

イメージ拡張

過適合を避けるには、イメージ変換を使用します。詳細については、augmentedImageDatastore を参照してください。

回帰ターゲットの正規化

ネットワークに入力する前に予測子を正規化します。学習の前に応答を正規化する場合、学習済みネットワークの予測を変換して、元の応答の予測を求めなければなりません。

詳細については、回帰用の畳み込みニューラル ネットワークの学習を参照してください。

シーケンス データの前処理

LSTM ネットワークの使用方法の詳細については、長短期記憶ニューラル ネットワークを参照してください。

タスク詳細
シーケンス データの正規化

シーケンス データを正規化するには、まず、すべてのシーケンスについて特徴あたりの平均値と標準偏差を計算します。次に、各学習観測値について、平均値を減算し、標準偏差で除算します。

詳細については、シーケンス データの正規化を参照してください。

シーケンスのパディングと切り捨ての削減

シーケンスのパディングまたは切り捨ての際に、パディングまたは破棄するデータの量を減らすには、シーケンス長でデータを並べ替えてみてください。

詳細については、シーケンスのパディングと切り捨てを参照してください。

予測のためのミニバッチのサイズとパディングのオプションの指定

長さが異なるシーケンスで予測を行うと、ミニバッチのサイズが、入力データに追加されるパディングの量に影響し、予測値が変わることがあります。さまざまな値を使用して、ネットワークに最適なものを確認してください。

ミニバッチのサイズとパディングのオプションを指定するには、minibatchpredict 関数の MiniBatchSize オプションおよび SequenceLength オプションを使用します。

利用可能なハードウェアの使用

実行環境を指定するには、ExecutionEnvironment 学習オプションを使用します。

問題詳細
CPU での学習が遅い単一の CPU での学習が非常に遅い場合、事前学習済みの深層学習ネットワークを特徴抽出器として使用して、機械学習モデルに学習させてみてください。例については、事前学習済みのネットワークを使用したイメージの特徴の抽出を参照してください。
GPU での LSTM の学習が遅い

CPU は、シーケンスが短いミニバッチを使用する LSTM ネットワークの学習に適しています。CPU を使用するには、ExecutionEnvironment 学習オプションを "cpu" に設定します。

利用可能な GPU で使用されないものがある複数の GPU があるマシンにアクセスできる場合は、単に ExecutionEnvironment 学習オプションを "multi-gpu" に設定します。詳細については、MATLAB による複数の GPU での深層学習を参照してください。

詳細については、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloudを参照してください。

MAT ファイルからの読み込みに関するエラーの修正

MAT ファイルから層またはネットワークを読み込むことができず、次のような形式の警告が表示される場合があります。

Warning: While loading an object of class 'dlnetwork':
Error using dlnetwork/initialize
Invalid network.

Error in dlnetwork (line 160)
                net = initialize(net, dlX{:});

Error in dlnetwork.loadobj (line 748)
                    net = dlnetwork(in.LayerGraph, exampleInputs{:},
                    'Initialize', in.Initialized);

Caused by:
    Layer 'layer': Error using the initialize function in layer sreluLayer. The
    function threw an error and could not be executed.
        Method 'initialize' is not defined for class 'sreluLayer' or is removed
        from
        MATLAB's search path. 
その場合、MAT ファイル内のネットワークに、使用できない層が含まれている可能性があります。これには以下のような原因が考えられます。

  • ファイルに、パスにないカスタム層が含まれている – カスタム層が含まれるネットワークを読み込むには、カスタム層ファイルを MATLAB® パスに追加します。

  • ファイルにサポート パッケージのカスタム層が含まれている – サポート パッケージの層を使用するネットワークを読み込むには、対応する関数 (imagePretrainedNetwork など) を使用するか、アドオン エクスプローラーを使用して、コマンド ラインで必要なサポート パッケージをインストールします。

  • ファイルに、パスにないドキュメンテーションの例のカスタム層が含まれている – ドキュメンテーションの例のカスタム層が含まれるネットワークを読み込むには、例をライブ スクリプトとして開いて、例のフォルダーから作業ディレクトリに層をコピーします。

  • ファイルに、インストールされていないツールボックスの層が含まれている – Computer Vision Toolbox や Text Analytics Toolbox など、他のツールボックスの層にアクセスするには、対応するツールボックスをインストールします。

推奨されている解決策を試した後、MAT ファイルを再度読み込みます。

参考

| | | | |

関連するトピック