深層学習のヒントとコツ
このページでは、深層学習ネットワークの精度を改善するための、さまざまな学習オプションや手法について説明します。
ネットワーク アーキテクチャの選択
適切なネットワーク アーキテクチャは、タスクや利用可能なデータによって異なります。どのアーキテクチャを使用するかや、事前学習済みのネットワークを使用するかゼロから学習させるかを決定する際に、以下の推奨事項を検討してください。
データ | タスクの説明 | 詳細 |
---|---|---|
イメージ | 自然イメージの分類 | さまざまな事前学習済みのネットワークを試してみてください。事前学習済みの深層学習ネットワークの一覧については、事前学習済みの深層ニューラル ネットワークを参照してください。 ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを対話形式で準備する方法については、ディープ ネットワーク デザイナーを使用した転移学習を参照してください。 |
自然イメージの回帰 | さまざまな事前学習済みのネットワークを試してみてください。事前学習済みの分類ネットワークを回帰ネットワークに変換する方法を示す例については、分類ネットワークの回帰ネットワークへの変換を参照してください。 | |
自然イメージ以外のイメージの分類と回帰 (非常に小さいイメージやスペクトログラムなど) | 非常に小さいイメージの分類方法を示す例については、イメージ分類用の残差ネットワークの学習を参照してください。 スペクトログラムの分類方法を示す例については、深層学習を使用した音声コマンド認識モデルの学習を参照してください。 | |
セマンティック セグメンテーション | 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)を参照してください。ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを対話形式で準備する方法については、Transfer Learning with Pretrained Audio Networks in Deep Network Designerを参照してください。 深層学習を使用して音を分類する方法を示す例については、Classify Sound Using Deep Learning (Audio Toolbox)を参照してください。 |
学習オプションの選択
関数 trainingOptions
には、深層学習ネットワークに学習させるためのさまざまなオプションがあります。
ヒント | 詳細 |
---|---|
学習の進行状況を監視する | 学習の進行状況プロットをオンにするには、trainingOptions の 'Plots' オプションを 'training-progress' に設定します。 |
検証データを使用する | 検証データを指定するには、 メモ 検証データセットが小さすぎてデータを十分に表していない場合、報告されたメトリクスが役に立たない可能性があります。使用する検証データセットが大きすぎると、学習に時間がかかる可能性があります。 |
転移学習の場合、新しい層の学習速度を上げて、転移層での学習速度を下げる | たとえば、
転移学習の場合、同じエポック数の学習を行う必要はありません。 ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを対話形式で準備する方法については、ディープ ネットワーク デザイナーを使用した転移学習を参照してください。 |
すべてのエポックでデータをシャッフルする | すべてのエポック (データを一巡すること) でデータをシャッフルするには、
メモ シーケンス データの場合、シャッフルを行うとパディングや切り捨てられるデータの量が増える可能性があるため、シャッフルが精度に悪影響を与えることがあります。シーケンス データを使用する場合、シーケンス長でデータを並べ替えると役に立つことがあります。詳細については、シーケンスのパディング、切り捨て、および分割を参照してください。
|
さまざまなオプティマイザーを試す | さまざまなオプティマイザーを指定するには、 |
詳細については、パラメーターの設定と畳み込みニューラル ネットワークの学習を参照してください。
学習精度の改善
学習中に問題に気が付いた場合は、以下の考えられる解決策について検討してください。
問題 | 考えられる解決策 |
---|---|
損失に NaN または大きなスパイクがある |
学習率を減らしても効果がない場合は、勾配クリップの使用を試してください。勾配のしきい値を設定するには、 |
学習の終了時に損失がまだ減少している | trainingOptions の 'MaxEpochs' オプションを使用してエポック数を増やすことによって、学習時間を延ばします。 |
損失が横ばいになる | 予想外に大きい値で損失が横ばいになる場合は、横ばいになったところで学習率を下げます。学習率のスケジュールを変更するには、 学習率を下げても効果がない場合は、モデルが適合不足である可能性があります。パラメーターの数または層の数を増やしてみてください。検証損失を監視することによって、モデルが適合不足かどうか確認できます。 |
検証損失が学習損失をはるかに上回っている | 過適合を防止するには、以下の 1 つ以上を試してください。
|
損失の減少が非常に遅い |
イメージ データの場合、ネットワークにバッチ正規化層を含めてみてください。詳細については、 |
詳細については、パラメーターの設定と畳み込みニューラル ネットワークの学習を参照してください。
学習のエラーの修正
ネットワークが少しも学習されない場合は、以下の考えられる解決策について検討してください。
エラー | 説明 | 考えられる解決策 |
---|---|---|
学習時のメモリ不足エラー | 利用可能なハードウェアに現在のミニバッチ、ネットワークの重み、および計算した活性化を格納できません。 |
ミニバッチ サイズを減らしても効果がない場合は、層の数を減らすか層内のパラメーター数またはフィルター数を減らして、小規模なネットワークの使用を試してください。 |
カスタム層のエラー | カスタム層の実装に問題がある可能性があります。 |
|
学習がエラー 'CUDA_ERROR_UNKNOWN' をスローする | GPU が OS からの要求の計算と表示の両方に使用されている場合、このエラーをスローすることがあります。 |
ミニバッチ サイズを減らしても効果がない場合は、Windows® で、タイムアウト検出と復旧 (TDR) の設定を調整してみてください。たとえば、 |
analyzeNetwork
を使用して、深層学習ネットワークを解析できます。関数 analyzeNetwork
は、ネットワーク アーキテクチャを対話的に可視化して表示し、ネットワークに関するエラーや問題を検出して、ネットワーク層についての詳細情報を提供します。ネットワーク アナライザーを使用して、ネットワーク アーキテクチャを可視化して把握し、アーキテクチャが正しく定義されていることを確認して、学習前に問題を検出します。analyzeNetwork
が検出する問題には、層の欠損または切り離し、層入力のサイズの不一致や誤り、層の入力数の誤り、無効なグラフ構造などがあります。
データの準備と前処理
データを前処理して、精度を高めることができます。
クラスの重み付けまたはバランス調整
観測値の数がすべてのクラスで等しいことが理想的です。ただし、タスクによっては、クラスが不均衡である場合があります。たとえば、路上シーンの自動車データセットには、歩行者や自転車運転者のピクセルよりも多くの空、建物、および道路のピクセルが含まれる傾向があります。これは、空、建物、および道路がより広いイメージ領域を占めているためです。学習では上位クラスを優先してバイアスがかけられるため、正しく処理されていない場合は、こうした不均衡が学習プロセスに悪影響を及ぼす可能性があります。
分類タスクの場合、classificationLayer
の 'ClassWeights'
オプションを使用してクラスの重みを指定できます。例については、Train Sequence Classification Network Using Data With Imbalanced Classesを参照してください。セマンティック セグメンテーション タスクの場合、pixelClassificationLayer
(Computer Vision Toolbox) の ClassWeights
(Computer Vision Toolbox) プロパティを使用してクラスの重みを指定できます。
または、以下の 1 つ以上を行って、クラスのバランスを調整することもできます。
最も頻度が少ないクラスに新しい観測値を追加します。
最も頻度が多いクラスから観測値を削除します。
類似のクラスをグループ化します。たとえば、クラス "car" および "truck" を単一のクラス "vehicle" にグループ化します。
イメージ データの前処理
イメージ データの前処理の詳細については、イメージの深層学習向け前処理を参照してください。
タスク | 詳細 |
---|---|
イメージのサイズ変更 | 事前学習済みのネットワークを使用するには、ネットワークの入力サイズに合わせてイメージのサイズを変更しなければなりません。イメージのサイズを変更するには、 auimds = augmentedImageDatastore(inputSize,imds); ヒント イメージのサイズ変更を含む深層学習用のイメージの前処理を効率的に行うには、 関数
|
イメージ拡張 | 過適合を避けるには、イメージ変換を使用します。詳細については、拡張イメージを使用したネットワークの学習を参照してください。 |
回帰ターゲットの正規化 | ネットワークに入力する前に予測子を正規化します。学習の前に応答を正規化する場合、学習済みネットワークの予測を変換して、元の応答の予測を求めなければなりません。 詳細については、回帰用の畳み込みニューラル ネットワークの学習を参照してください。 |
シーケンス データの前処理
LSTM ネットワークの使用方法の詳細については、長短期記憶ニューラル ネットワークを参照してください。
タスク | 詳細 |
---|---|
シーケンス データの正規化 | シーケンス データを正規化するには、まず、すべてのシーケンスについて特徴あたりの平均値と標準偏差を計算します。次に、各学習観測値について、平均値を減算し、標準偏差で除算します。 詳細については、シーケンス データの正規化を参照してください。 |
シーケンスのパディングと切り捨ての削減 | シーケンスのパディングまたは切り捨ての際に、パディングまたは破棄するデータの量を減らすには、シーケンス長でデータを並べ替えてみてください。 詳細については、シーケンスのパディング、切り捨て、および分割を参照してください。 |
予測のためのミニバッチのサイズとパディングのオプションの指定 | 長さが異なるシーケンスで予測を行うと、ミニバッチのサイズが、入力データに追加されるパディングの量に影響し、予測値が変わることがあります。さまざまな値を使用して、ネットワークに最適なものを確認してください。 ミニバッチのサイズとパディングのオプションを指定するには、関数 |
利用可能なハードウェアの使用
実行環境を指定するには、trainingOptions
の 'ExecutionEnvironment'
オプションを使用します。
問題 | 詳細 |
---|---|
CPU での学習が遅い | 単一の CPU での学習が非常に遅い場合、事前学習済みの深層学習ネットワークを特徴抽出器として使用して、機械学習モデルに学習させてみてください。例については、事前学習済みのネットワークを使用したイメージの特徴の抽出を参照してください。 |
GPU での LSTM の学習が遅い | CPU は、シーケンスが短いミニバッチを使用する LSTM ネットワークの学習に適しています。CPU を使用するには、 |
利用可能な GPU で使用されないものがある | 複数の GPU があるマシンにアクセスできる場合は、単に trainingOptions の 'ExecutionEnvironment' オプションを 'multi-gpu' に設定します。詳細については、MATLAB による複数の GPU での深層学習を参照してください。 |
詳細については、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloudを参照してください。
MAT ファイルからの読み込みに関するエラーの修正
MAT ファイルから層またはネットワークを読み込むことができず、次のような形式の警告が表示される場合があります。
Warning: Unable to load instances of class layerType into a heterogeneous array. The definition of layerType could be missing or contain an error. Default objects will be substituted. Warning: While loading an object of class 'SeriesNetwork': Error using 'forward' in Layer nnet.cnn.layer.MissingLayer. The function threw an error and could not be executed.
ファイルに、パスにないカスタム層が含まれている – カスタム層が含まれるネットワークを読み込むには、カスタム層ファイルを MATLAB® パスに追加します。
ファイルにサポート パッケージのカスタム層が含まれている – サポート パッケージの層を使用するネットワークを読み込むには、対応する関数 (
resnet18
など) を使用するか、アドオン エクスプローラーを使用して、コマンド ラインで必要なサポート パッケージをインストールします。ファイルに、パスにないドキュメンテーションの例のカスタム層が含まれている – ドキュメンテーションの例のカスタム層が含まれるネットワークを読み込むには、例をライブ スクリプトとして開いて、例のフォルダーから作業ディレクトリに層をコピーします。
ファイルに、インストールされていないツールボックスの層が含まれている – Computer Vision Toolbox や Text Analytics Toolbox など、他のツールボックスの層にアクセスするには、対応するツールボックスをインストールします。
推奨されている解決策を試した後、MAT ファイルを再度読み込みます。
参考
trainingOptions
| checkLayer
| analyzeNetwork
| ディープ ネットワーク デザイナー