主要内容

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

新しいイメージを分類するための深層学習ネットワークの学習

この例では,転移学習を使用して,畳み込みニューラルネットワークの再学習を行い,新しい一連のイメージを分類する方法を説明します。

事前学習済みのイメージ分類ネットワークは,100多万枚を超えるイメージで学習しており,イメージを1000個のオブジェクトカテゴリ(キーボード,マグカップ,鉛筆,多くの動物など)に分類できます。このネットワークは広範囲にわたるイメージについての豊富な特徴表現を学習しています。このネットワークは入力としてイメージを取り,イメージ内のオブジェクトのラベルを各オブジェクトカテゴリの確率と共に出力します。

転移学習は,深層学習アプリケーションでよく使用されています。事前学習済みのネットワークを取得して,新しいタスクの学習の開始点として使用できます。通常は,転移学習によってネットワークを微調整する方が,ランダムに初期化された重みでゼロからネットワークに学習させるよりもはるかに簡単で時間がかかりません。少ない数の学習イメージを使用して,新しいタスクに学習済みの特徴を高速に転移できます。

データの読み込み

新しいイメージを解凍してイメージデータストアとして読み込みます。この非常に小さいデータセットには75枚のイメージのみが含まれています。データを学習データセットと検証データセットに分割します。イメージの70%を学習に使用し,30%を検証に使用します。

解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.7);

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

事前学習済みのGoogLeNetネットワークを読み込みます。深度学习工具箱™模型GoogLeNet网络サポートパッケージがインストールされていない場合,ダウンロード用リンクが表示されます。

別の事前学習済みネットワークを試すには,この例をMATLAB®で開き,別のネットワークを選択します。たとえば,googlenetよりも高速なネットワークであるsqueezenetを試すことができます。この例は,他の事前学習済みネットワークを使用して実行することもできます。使用可能なすべてのネットワークについては,事前学習済みのネットワークの読み込みを参照してください。

网=googlenet;

analyzeNetworkを使用して,ネットワークアーキテクチャを対話的に可視化し,ネットワーク層についての詳細情報を表示します。

analyzeNetwork(净)

ネットワークのプロパティの最初の要素はイメージ入力層です。GoogLeNetネットワークの場合,この層にはサイズが224 x 224 x 3の入力イメージが必要です。ここで3はカラーチャネルの数です。その他のネットワークには異なるサイズの入力イメージが必要な場合があります。たとえば,Xception ネットワークにはサイズ 299 x 299 x 3 のイメージが必要です。

net.Layers (1)
ans = ImageInputLayer with properties: Name: 'data' InputSize: [224 224 3] Hyperparameters DataAugmentation: 'none' Normalization: 'zerocenter' NormalizationDimension: 'auto' Mean: [224×224×3 single]
inputSize = net.Layers (1) .InputSize;

最後の層の置き換え

ネットワークの畳み込み層は,入力イメージを分類するために,最後の学習可能な層と最終分類層が使用するイメージの特徴を抽出します。GoogLeNetのこれらの2つの層“loss3-classifier”および“输出”は,ネットワークによって抽出された特徴を組み合わせてクラス確率,損失値,および予測ラベルにまとめる方法に関する情報を含んでいます。新しいイメージを分類するために事前学習済みのネットワークを再学習させるには,これら2つの層を新しいデータセットに適応させた新しい層に置き換えます。

学習済みのネットワークから層グラフを抽出します。ネットワークがAlexNet, VGG-16, VGG-19などのSeriesNetworkオブジェクトである場合,网。层の層のリストを層グラフに変換します。

如果isa(净,“SeriesNetwork”) lgraph = layerGraph(net.Layers);其他的lgraph = layerGraph(净);结束

置き換える2つの層の名前を見つけます。これは手動で行うことも,サポート関数findLayersToReplaceを使用してこれらの層を自動的に見つけることもできます。

[learnableLayer, classLayer] = findLayersToReplace (lgraph);[learnableLayer, classLayer]
ans = 1×2 Layer array with layers: 1 'loss3-classifier' Fully Connected 1000 Fully Connected Layer 2 'output' Classification output crossentropyex with 'tench' and 999 other classes

ほとんどのネットワークでは,学習可能な重みを持つ最後の層は全結合層です。この全結合層を,新しいデータセットのクラスの数(この例では5)と同じ数の出力を持つ新しい全結合層に置き換えます。SqueezeNetなどの一部のネットワークでは,その代わりに最後の学習可能な層が1 x 1畳み込み層となっています。この場合は,その畳み込み層を,クラスの数と同じ数のフィルターを持つ新しい畳み込み層に置き換えます。新しい層での学習速度を転移された層より速くするには,層の学習率係数を大きくします。

numClasses =元素个数(类别(imdsTrain.Labels));如果isa (learnableLayer“nnet.cnn.layer.FullyConnectedLayer”newLearnableLayer = fullconnectedlayer (numClasses,...“名字”“new_fc”...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);elseifisa (learnableLayer“nnet.cnn.layer.Convolution2DLayer”newLearnableLayer = convolution2dLayer(1,numClasses,...“名字”“new_conv”...“WeightLearnRateFactor”10...“BiasLearnRateFactor”10);结束lgraph = replaceLayer (lgraph learnableLayer.Name newLearnableLayer);

分類層はネットワークの出力クラスを指定します。分類層をクラスラベルがない新しい分類層に置き換えます。trainNetworkは,学習時に層の出力クラスを自動的に設定します。

newClassLayer = classificationLayer (“名字”“new_classoutput”);lgraph = replaceLayer (lgraph classLayer.Name newClassLayer);

新しい層が正しく結合されていることを確認するには,新しい層グラフをプロットして,ネットワークの最後の方の層を拡大します。

图(“单位”“归一化”“位置”,[0.3 0.3 0.4 0.4]);情节(lgraph) ylim ([0, 10])

初期の層の凍結

これで,新しい一連のイメージでネットワークに再学習させる準備が整いました。オプションで,ネットワークの初期の層について学習率を0に設定すると,それらの層の重みを”凍結”できます。学習中にtrainNetworkは凍結された層のパラメーターを更新しません。凍結された層の勾配は計算する必要がないため,多数の初期の層について重みを凍結すると,ネットワーク学習を大幅に高速化できます。新しいデータセットが小さい場合,初期のネットワーク層を凍結すると,新しいデータセットに対するこれらの層の過適合を防止することもできます。

層グラフの層および結合を抽出し,凍結する層を選択します。GoogLeNetでは,最初の10個の層がネットワークの初期”ステム”を作ります。サポート関数freezeWeightsを使用して,最初の10個の層について学習率を0に設定します。サポート関数createLgraphUsingConnectionsを使用して,すべての層を元の順序で再結合します。新しい層グラフに含まれる層は元と同じですが,初期の層の学習率は0に設定されています。

层= lgraph.Layers;连接= lgraph.Connections;层(1:10)= freezeWeights(层(1:10));lgraph = createLgraphUsingConnections(层,连接);

ネットワークの学習

ネットワークにはサイズが224 x 224 x 3の入力イメージが必要ですが,イメージデータストアにあるイメージのサイズは異なります。拡張イメージデータストアを使用して学習イメージのサイズを自動的に変更します。学習イメージに対して実行する追加の拡張演算として,学習イメージを縦軸に沿ってランダムに反転させる演算や,水平方向および垂直方向に最大30ピクセルだけランダムに平行移動させて最大10%スケールアップする演算を指定します。データ拡張は,ネットワークで過適合が発生したり,学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。

pixelRange = [-30 30];scaleRange = [0.9 1.1];imageAugmenter = imageDataAugmenter (...“RandXReflection”,真的,...“RandXTranslation”pixelRange,...“RandYTranslation”pixelRange,...“RandXScale”scaleRange,...“RandYScale”, scaleRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,...“DataAugmentation”, imageAugmenter);

他のデータ拡張を実行せずに検証イメージのサイズを自動的に変更するには,追加の前処理演算を指定せずに拡張イメージデータストアを使用します。

augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);

学習オプションを指定します。InitialLearnRateを小さい値に設定して,まだ凍結されていない転移層での学習速度を下げます。上記の手順では,最後の学習可能な層の学習率係数を大きくして,新しい最後の層での学習時間を短縮しています。この学習率設定の組み合わせによって,新しい層では高速に学習が行われ,中間層では学習速度が低下し,凍結された初期の層では学習が行われません。

学習するエポック数を指定します。転移学習の実行時には,同じエポック数の学習を行う必要はありません。エポックとは,学習データセット全体の完全な学習サイクルのことです。ミニバッチのサイズと検証データを指定します。エポックごとに1回,検定精度を計算します。

miniBatchSize = 10;valFrequency =地板(元素个数(augimdsTrain.Files) / miniBatchSize);选择= trainingOptions (“个”...“MiniBatchSize”miniBatchSize,...“MaxEpochs”6...“InitialLearnRate”3的军医,...“洗牌”“every-epoch”...“ValidationData”augimdsValidation,...“ValidationFrequency”valFrequency,...“详细”假的,...“阴谋”“训练进步”);

学習データを使用してネットワークに学習させます。既定では,利用可能なGPUがある場合,trainNetworkはGPUを使用します(并行计算工具箱™,および以3.0计算能力上のCUDA®対応GPUが必要)。そうでない場合,trainNetworkはCPUを使用します。trainingOptionsの名前と値のペアの引数“ExecutionEnvironment”を使用して,実行環境を指定することもできます。データセットのサイズが非常に小さいため,学習は短時間で終了します。

网= trainNetwork (augimdsTrain、lgraph选项);

検証イメージの分類

微調整したネットワークを使用して検証イメージを分類し,分類精度を計算します。

(YPred,聚合氯化铝)=(网络,augimdsValidation)进行分类;精度= mean(YPred == imdsvalidate . labels)
精度= 0.9000

4枚のサンプル検証イメージを,予測ラベルとイメージがそれらのラベルを持つ予測確率と共に表示します。

idx = randperm(元素个数(imdsValidation.Files), 4);数字i = 1:4 subplot(2,2,i) i = readimage(imdsValidation,idx(i));imshow(I) label = YPred(idx(I));标题(string(标签)+”、“+ num2str(100 *马克斯(聚合氯化铝(idx(我),:)),3)+“%”);结束

参照

[1] Szegedy, Christian, Liu Wei, Jia Yangqing, Pierre Sermanet, Scott Reed, Dragomir angelov, Dumitru Erhan, Vincent Vanhoucke和Andrew Rabinovich。“更深入的回旋。”在计算机视觉与模式识别IEEE会议论文集1 - 9页。2015.

参考

||||||||||

関連するトピック