このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,ディープネットワークデザイナーアプリを使用して転移学習をインタラクティブに実行する方法を説明します。
転移学習は,事前学習済みの深層学習ネットワークを利用して,新しいタスクを学習するように微調整するプロセスです。通常は,転移学習を使用する方が,ネットワークにゼロから学習させるよりも簡単で時間もかかりません。少量のデータを使用して,新しいタスクに学習済みの特徴を高速に転移できます。
ディープネットワークデザイナーでイメージ分類のための転移学習を実行するには,次の手順に従います。
ディープネットワークデザイナーアプリを開いて事前学習済みのネットワークを選択します。
新しいデータセットをインポートします。
最後の層を,新しいデータセットに適応させた新しい層に置き換えます。
学習率を設定して,新しい層での学習速度を転移層より速くします。
ディープネットワークデザイナーを使用してネットワークに学習させるか,ネットワークをエクスポートしてコマンドラインで学習させます。
ワークスペースで,MathWorks营销データセットを解凍します。75年これは個のMathWorksの商品イメージから成る小さなデータセットであり,5つの異なるクラス(“帽”,“立方体”,“打牌”,“螺丝刀”,“火炬”)に属します。
解压缩(“MerchData.zip”);
ディープネットワークデザイナーを開くには,[アプリ]タブの[機械学習および深層学習]でアプリのアイコンをクリックします。あるいは,コマンドラインからアプリを開くこともできます。
deepNetworkDesigner
ディープネットワークデザイナーには,広範囲のイメージに適した豊富な特徴表現を学習している,さまざまな事前学習済みのイメージ分類ネットワークが用意されています。転移学習は,使用するイメージが,ネットワークの学習時にもともと使用されたイメージに類似している場合に特に効果を発揮します。使用する学習イメージがImageNetデータベースに含まれるような自然イメージの場合,どの事前学習済みネットワークも適しています。使用可能なネットワークの一覧,およびネットワークを比較する方法については,事前学習済みの深層ニューラルネットワークを参照してください。
使用するデータがImageNetのデータと大きく異なる場合(たとえば,非常に小さいイメージ,スペクトログラム,またはイメージ以外のデータを使用する場合)は,新しいネットワークに学習させる方が良いこともあります。ネットワークにゼロから学習させる方法を示す例については,ディープネットワークデザイナーを使用したシンプルなシーケンス分類ネットワークの作成およびディープネットワークデザイナーでの簡単なセマンティックセグメンテーションネットワークの作成を参照してください。
SqueezeNetでは追加のサポートパッケージが必要ありません。その他の事前学習済みネットワークでは,必要なサポートパッケージがインストールされていない場合,[インストール]オプションがアプリに表示されます。
事前学習済みネットワークの一覧から(SqueezeNet)を選択し,[開く]をクリックします。
ディープネットワークデザイナーの[デザイナー]ペインにネットワーク全体が縮小表示されます。
ネットワークのプロットを確認します。マウスでズームインするには,Ctrlキーを押しながらスクロールホイールを使用します。移動するには,方向キーを使用するか,スクロールホイールを押したままでマウスをドラッグします。プロパティを表示する層を選択します。すべての層の選択を解除すると,[プロパティ]ペインにネットワークの概要が表示されます。
ディープネットワークデザイナーにデータを読み込むには,[データ]タブで,[データのインポート]、[イメージデータのインポート]をクリックします。[イメージデータのインポート]ダイアログボックスが開きます。
[データソース]リストの[フォルダー]を選択します。[参照]をクリックし,解凍したMerchDataフォルダーを選択します。
学習データにイメージ拡張を適用するよう選択することが可能です。ディープネットワークデザイナーアプリには以下の拡張オプションが用意されています。
X軸方向のランダムな反転
Y軸方向のランダムな反転
ランダムな回転
ランダムな再スケーリング
ランダムな水平方向の平行移動
ランダムな垂直方向の平行移動
ランダム化された”拡張”をデータに適用して,実質的に学習データの量を増やすことができます。拡張では,イメージデータの歪みに対して不変になるようにネットワークに学習させることもできます。たとえば,入力イメージに存在する回転に対してネットワークが不変になるように,入力イメージにランダムな回転を追加できます。
この例ではX軸方向のランダムな反転,(-90、90)度の範囲のランダムな回転,[1,2]の範囲のランダムな再スケーリングを実行します。
検証データを学習データから分割してインポートするか,それとも他のソースからインポートするかを選択することも可能です。検証では,学習データと比較して新しいデータのモデルパフォーマンスが推定され,パフォーマンスの監視や過適合の防止に役立ちます。
この例では,イメージの30%を検証に使用します。
[インポート]をクリックして,ディープネットワークデザイナーにデータをインポートします。
ディープネットワークデザイナーを使用すると,[データ]タブにある学習データと検証データの分布を視覚的に検査できます。この例では,データセットにクラスが 5 つあることが確認できます。各クラスからのランダムな観測値も確認できます。
[デザイナー]ペインのネットワークを編集して,データの新しいクラス数を指定します。転移学習用のネットワークを準備するために,最後の学習可能な層と最終分類層を置き換えます。
転移学習に事前学習済みネットワークを使用するには,新しいデータセットに一致するようにクラス数を変更しなければなりません。まず,ネットワークの最後の学習可能な層を見つけます。SqueezeNetの最後の学習可能な層は,最後の畳み込み層“conv10”
です。この場合は,その畳み込み層を,クラスの数と同じ数のフィルターを持つ新しい畳み込み層に置き換えます。
新しいconvolution2dLayer
をキャンバスにドラッグします。元の畳み込み層と一致させるために,FilterSize
を1,1
に設定します。
NumFilters
プロパティは,分類問題のクラス数を定義します。NumFilters
を新しいデータのクラス数(この例では5
)に変更します。
WeightLearnRateFactor
およびBiasLearnRateFactor
を10
に設定して学習率を変更し,新しい層での学習速度を転移層より速くします。
最後の2次元畳み込み層を削除して,代わりに新しい層を結合します。
転移学習用に,出力層を置き換える必要があります。[層のライブラリ]の最後までスクロールして,新しいclassificationLayer
をキャンバスにドラッグします。元の分類層を削除して,その位置に新しい層を結合します。
新しい出力層には,OutputSize
を設定する必要はありません。学習時に,ディープネットワークデザイナーによって層の出力クラスがデータから自動的に設定されます。
ネットワークの学習の準備が整っていることを確認するには,[解析]をクリックします。深層学習ネットワークアナライザーによってエラー0が報告されている場合,編集したネットワークの学習の準備が整っています。
ディープネットワークデザイナーでは,アプリにインポートした,あるいはアプリで作成したネットワークに学習させることが可能です。
既定の設定でネットワークに学習させるには,[学習]タブの[学習]をクリックします。既定の学習オプションは大きなデータセットに適しています。小さなデータセットの場合は,ミニバッチサイズを小さくし,検証頻度を減らします。
学習をさらに細かく制御するには,(学習オプション]をクリックして学習の設定を選択します。
初期学習率を小さい値に設定して,転移層での学習速度を下げます。
各エポックで1回,検証データに対する精度が計算されるように,検証頻度を指定します。
小さい数のエポックを指定します。エポックとは,学習データセット全体の完全な学習サイクルのことです。転移学習の場合,同じエポック数の学習を行う必要はありません。
ミニバッチのサイズ,つまり各反復で使用するイメージの数を指定します。それぞれのエポックで必ずデータセット全体が使用されるように,学習サンプルの数を均等に分割するようミニバッチのサイズを設定します。
この例では,InitialLearnRateを0.0001
に,ValidationFrequencyを5
に,MaxEpochsを8
に設定します。観測値が55個あるため,MiniBatchSizeを11
に設定して学習データを均等に分け,各エポックで必ず学習データセット全体が使用されるようにします。学習オプションの詳細については,trainingOptions
を参照してください。
指定した学習オプションでネットワークを学習させるには,[閉じる]をクリックしてから[学習]をクリックします。
ディープネットワークデザイナーでは,学習の進行状況の可視化と監視が行えます。必要に応じて,学習オプションを編集してネットワークを再学習させることができます。
学習した重みを含むネットワークアーキテクチャをエクスポートするには,[学習]タブの[エクスポート]、(学習済みネットワークと結果のエクスポート]を選択します。ディープネットワークデザイナーによって,学習済みネットワークが変数trainedNetwork_1
に,学習情報が変数trainInfoStruct_1
にエクスポートされます。
trainInfoStruct_1
trainInfoStruct_1 =结构体字段:TrainingLoss:[1×40双]TrainingAccuracy:[1×40双]ValidationLoss:[4.3374 1.3966 2.4329南南南南南南南南南南南南南南南0.7526 0.6424 0.5940 0.6349南南南南南南南南南南南南南南南南0.5490 0.5179]ValidationAccuracy:[10 15南南南南南南南南南南南70 90 85年南南南南南南南南南南南南85 90年南南南南南南南南95]BaseLearnRate:[1×40双]FinalValidationLoss: 0.5179 FinalValidationAccuracy: 95
使用するネットワークと学習オプションを再作成するMATLABコードを生成することもできます。[学習]タブの[エクスポート]、(学習用コードの生成)を選択します。MATLABコードを確認して、学習用のデータの準備、ネットワーク アーキテクチャの作成、およびネットワークの学習をプログラムによって行う方法を学びます。
学習済みネットワークを使用して分類する新しいイメージを読み込みます。
我= imread (“MerchDataTest.jpg”);
イメージサイズは学習の間,ネットワークの入力サイズに合うようにディープネットワークデザイナーにより変更されます。ネットワークの入力サイズを確認するには,[デザイナー]ペインに移動してimageInputLayer
(最初の層)を選択します。このネットワークの入力サイズは227 x 227です。
ネットワークの入力サイズに合うようにテストイメージをサイズ変更します。
I = imresize(I, [227 227]);
学習済みネットワークを使用してテストイメージを分類します。
(YPred,聚合氯化铝)= (trainedNetwork_1, I)进行分类;imshow(I) label = YPred;标题(string(标签)+”、“+ num2str(100 *马克斯(聚合氯化铝),3)+“%”);