このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
この例では,事前学習済みの畳み込みニューラルネットワークから学習済みのイメージの特徴を抽出し,これらの特徴を使用してイメージ分類器に学習させる方法を説明します。特徴抽出は,事前学習済みの深いネットワークの表現能力を活用できる最も簡単で時間のかからない方法です。たとえば,抽出した特徴に対してfitcecoc
(统计和机器学习的工具箱™)を使用してサポートベクターマシン(SVM)に学習させることができます。特徴抽出が必要とするものはデータを一巡する1つのパスのみであるため,ネットワークの学習を加速するためのGPUがない場合,これは適切な開始点となります。
サンプルイメージを解凍してイメージデータストアとして読み込みます。imageDatastore
は,フォルダー名に基づいてイメージに自動的にラベルを付け,データをImageDatastore
オブジェクトとして格納します。イメージデータストアを使用すると,メモリに収まらないデータを含む大きなイメージデータを格納できます。データを70%の学習データと30%のテストデータに分割します。
解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);[imdsTrain, imdsTest] = splitEachLabel (imd, 0.7,“随机”);
このとき,この非常に小さなデータセットには,55個の学習イメージと20個の検証イメージが格納されています。いくつかのサンプルイメージを表示します。
numTrainImages =元素个数(imdsTrain.Labels);idx = randperm (numTrainImages 16);数字为i = 1:16 subplot(4,4,i) i = readimage(imdsTrain,idx(i));imshow(我)结束
事前学習済みのResNet-18ネットワークを読み込みます。深度学习工具箱模型ResNet-18网络サポートパッケージがインストールされていない場合,ダウンロード用リンクが表示されます。100年ResNet-18は万枚を超えるイメージについて学習済みであり,イメージを1000個のオブジェクトカテゴリ(キーボード,マウス,鉛筆,多くの動物など)に分類できます。結果として,このモデルは広範囲のイメージに対する豊富な特徴表現を学習しています。
网= resnet18
net = DAGNetwork with properties: Layers: [71x1 net.cnn.layer. layer] Connections: [78x2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_predictions'}
ネットワークアーキテクチャを解析します。最初の層であるイメージ入力層には,サイズが224 x 224 x 3の入力イメージが必要です。ここで3はカラーチャネルの数です。
inputSize = net.Layers (1) .InputSize;analyzeNetwork(净)
ネットワークにはサイズが224 x 224 x 3の入力イメージが必要ですが,イメージデータストアにあるイメージのサイズは異なります。学習およびテストイメージのサイズをネットワークへの入力前に自動的に変更するには,拡張イメージデータストアを作成して,目的のイメージサイズを指定し,これらのデータストアを激活
の入力引数として使用します。
augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);augimdsTest = augmentedImageDatastore (inputSize (1:2), imdsTest);
ネットワークは,入力イメージの階層表現を構築します。深い層には,初期の層の低レベルの特徴を使用して構築された,より高レベルの特徴が含まれます。学習イメージとテストイメージの特徴表現を取得するには,ネットワークの最後のグローバルプーリング層激活
で“pool5”,
を使用します。グローバルプーリング層は,すべての空間位置に対して入力の特徴をプーリングします。512年合計で個の特徴が得られます。
层=“pool5”;featuresTrain =激活(净、augimdsTrain层,“OutputAs”,“行”);featuresTest =激活(净、augimdsTest层,“OutputAs”,“行”);谁featuresTrain
名称大小字节类属性特性55x512 112640单
学習データおよびテストデータからクラスラベルを抽出します。
YTrain = imdsTrain.Labels;欧美= imdsTest.Labels;
学習イメージから抽出された特徴を予測子変数として使用し,fitcecoc
(统计和机器学习的工具箱)を使用してマルチクラスサポートベクターマシン(SVM)をあてはめます。
分类器= fitcecoc (featuresTrain YTrain);
テストイメージから抽出された特徴を使用する学習済みのSVMモデルで,テストイメージを分類します。
YPred =预测(分类器,featuresTest);
4個のサンプルテストイメージと,その予測ラベルを表示します。
Idx = [1 5 10 15];数字为i = 1:numel(idx) subplot(2,2,i) i = readimage(imdsTest,idx(i));标签= YPred (idx (i));imshow (I)标题(char(标签)结束
テストセットに対する分類精度を計算します。精度とは,ネットワークによって予測が正しく行われるラベルの割合です。
精度=平均值(YPred == YTest)
精度= 1
ネットワークの初期の層から特徴を抽出し,これらの特徴について分類器に学習させることもできます。通常,初期の層ではより少数の浅い特徴が抽出され,空間分解能が高く,活性化の合計数が大きくなります。“res3b_relu”
層から特徴を抽出します。128年これは個の特徴を出力する最後の層であり,活性化の空間サイズは28行28列になります。
层=“res3b_relu”;featuresTrain =激活(净、augimdsTrain层);featuresTest =激活(净、augimdsTest层);谁featuresTrain
Name Size Bytes Class Attributes feature
この例の最初の部分で使用した抽出された特徴は,グローバルプーリング層によってすべての空間位置に対してプーリングされています。初期の層で特徴を抽出する際に同じ結果を得るには,すべての空間位置に対して活性化を手動で平均化します。N
——- - - - - -
C
(Nは観測値の数でCは特徴の数)の形式で特徴を取得するには,大きさが1の次元を削除し転置します。
featuresTrain = squeeze(mean(featuresTrain,[1 2]))';featuresTest = squeeze(mean(featuresTest,[1 2]))';谁featuresTrain
名称大小字节类属性特征55x128 28160单
浅い特徴についてSVM分類器に学習させます。テスト精度を計算します。
分类器= fitcecoc (featuresTrain YTrain);YPred =预测(分类器,featuresTest);精度=平均值(YPred == YTest)
精度= 0.9500
学習済みのSVMはいずれも精度が高くなります。特徴抽出を使用しても十分な精度が得られない場合,代わりに転移学習を試してください。例については,新しいイメージを分類するための深層学習ネットワークの学習を参照してください。事前学習済みのネットワークの一覧と比較については,事前学習済みの深層ニューラルネットワークを参照してください。
fitcecoc
(统计学和机器学习工具箱)|resnet50