分類用のシンプルな深層学習ニューラル ネットワークの作成
この例では、深層学習による分類用のシンプルな畳み込みニューラル ネットワークを作成し、学習を行う方法を説明します。畳み込みニューラル ネットワークは深層学習に不可欠なツールであり、特にイメージの認識に適しています。
この例では、以下を実行する方法を示します。
イメージ データを読み込み、確認します。
ニューラル ネットワーク アーキテクチャを定義します。
学習オプションを指定します。
ニューラル ネットワークを学習させます。
新しいデータのラベルを予測し、分類精度を計算します。
シンプルなイメージ分類ニューラル ネットワークの作成および学習を対話的に行う方法を示す例については、ディープ ネットワーク デザイナーを使用したシンプルなイメージ分類ネットワークの作成を参照してください。
イメージ データの読み込みと確認
数字の標本データをイメージ データストアとして読み込みます。imageDatastore
は、フォルダー名に基づいてイメージに自動的にラベルを付け、データを ImageDatastore
オブジェクトとして格納します。イメージ データストアを使用すると、メモリに収まらないデータなどの大きなイメージ データを格納し、畳み込みニューラル ネットワークの学習中にイメージをバッチ単位で効率的に読み取ることができます。
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos', ... 'nndatasets','DigitDataset'); imds = imageDatastore(digitDatasetPath, ... 'IncludeSubfolders',true,'LabelSource','foldernames');
データストアのイメージをいくつか表示します。
figure; perm = randperm(10000,20); for i = 1:20 subplot(4,5,i); imshow(imds.Files{perm(i)}); end
各カテゴリのイメージの数を計算します。labelCount
は、ラベル、およびそれぞれのラベルが付いているイメージの数を格納する table です。データストアには 0 ~ 9 の数字それぞれについて 1000 個のイメージ、合計で 10000 個のイメージが含まれます。ニューラル ネットワークの最後の全結合層のクラス数を引数 OutputSize
として指定できます。
labelCount = countEachLabel(imds)
labelCount=10×2 table
Label Count
_____ _____
0 1000
1 1000
2 1000
3 1000
4 1000
5 1000
6 1000
7 1000
8 1000
9 1000
ニューラル ネットワークの入力層にイメージのサイズを指定しなければなりません。digitData
の最初のイメージのサイズを確認します。イメージはそれぞれ 28 x 28 x 1 ピクセルです。
img = readimage(imds,1); size(img)
ans = 1×2
28 28
学習セットと検証セットの指定
データを学習データセットと検証データセットに分割し、学習セットの各カテゴリに 750 個のイメージが含まれ、検証セットに各ラベルの残りのイメージが含まれるようにします。splitEachLabel
は、データストア digitData
を 2 つの新しいデータストア trainDigitData
と valDigitData
に分割します。
numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,'randomize');
ニューラル ネットワーク アーキテクチャの定義
畳み込みニューラル ネットワーク アーキテクチャを定義します。
layers = [ imageInputLayer([28 28 1]) convolution2dLayer(3,8,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,16,'Padding','same') batchNormalizationLayer reluLayer maxPooling2dLayer(2,'Stride',2) convolution2dLayer(3,32,'Padding','same') batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer];
イメージ入力層 imageInputLayer
にはイメージ サイズを指定します。ここでは 28 x 28 x 1 です。これらの数値は、高さ、幅、およびチャネル サイズに対応します。数字データはグレースケール イメージで構成されるため、チャネル サイズ (カラー チャネル) は 1 です。カラー イメージの場合、RGB 値に対応してチャネル サイズは 3 になります。データは、trainNetwork
により既定で学習の開始時にシャッフルされるため、シャッフルの必要はありません。学習時の各エポックの開始時にも、trainNetwork
によりデータは自動的にシャッフルされます。
畳み込み層 畳み込み層の最初の引数は filterSize
です。これは、イメージのスキャン時に学習関数によって使用されるフィルターの高さと幅を示します。この例では、3 という数字によってフィルター サイズが 3 x 3 であることを示しています。フィルターの高さと幅には異なるサイズを指定できます。2 つ目の引数 numFilters
はフィルターの数です。これは、入力の同じ領域に結合するニューロンの数を示します。このパラメーターによって、特徴マップの数が決定されます。名前と値のペア 'Padding'
を使用して、入力の特徴マップにパディングを追加します。既定のストライドが 1 の畳み込み層の場合、'same'
パディングによって空間の出力サイズが入力サイズと同じになります。convolution2dLayer
の名前と値のペアの引数を使用して、この層のストライドと学習率を定義することもできます。
バッチ正規化層 バッチ正規化層は、ニューラル ネットワークを通じて伝播される活性化と勾配を正規化します。これにより、ニューラル ネットワークの学習は簡単な最適化問題になります。畳み込み層の間にあるバッチ正規化層と、ReLU 層などの非線形性を使用して、ニューラル ネットワークの学習速度を上げ、ニューラル ネットワークの初期化に対する感度を下げます。batchNormalizationLayer
を使用して、バッチ正規化層を作成します。
ReLU 層 バッチ正規化層の後に非線形活性化関数が続きます。最も一般的な活性化関数は、正規化線形ユニット (ReLU) です。reluLayer
を使用して、ReLU 層を作成します。
最大プーリング層 畳み込み層 (と活性化関数) の後で、ダウンサンプリング処理を行うことがあります。これにより、特徴マップの空間サイズが縮小され、冗長な空間情報が削除されます。ダウンサンプリングでは、層ごとに必要な計算量を増やさずに、より深い畳み込み層のフィルターの数を増やすことができます。ダウンサンプリングの 1 つの方法が最大プーリングの使用です。これは、maxPooling2dLayer
を使用して作成します。最大プーリング層は、最初の引数 poolSize
によって指定された、入力の矩形領域の最大値を返します。この例では、矩形領域のサイズは [2,2] です。名前と値のペアの引数 'Stride'
は、入力に沿ってスキャンするときに学習関数が取るステップ サイズを指定します。
全結合層 畳み込み層とダウンサンプリング層の後には、1 つ以上の全結合層を配置します。その名前からわかるように、全結合層はニューロンが前の層のすべてのニューロンに結合している層です。この層は、前の層によってイメージ全体で学習されたすべての特徴を組み合わせて、より大きなパターンを特定します。最後の全結合層は、これらの特徴を組み合わせてイメージを分類します。そのため、最後の全結合層の OutputSize
パラメーターは、ターゲット データのクラスの数と等しくなります。この例では、10 個のクラスに対応して、出力サイズが 10 になっています。fullyConnectedLayer
を使用して、全結合層を作成します。
ソフトマックス層 ソフトマックス活性化関数は、全結合層の出力を正規化します。ソフトマックス層の出力は合計が 1 になる正の数値で構成されており、分類層で分類の確率として使用できます。最後の全結合層の後に関数 softmaxLayer
を使用してソフトマックス層を作成します。
分類層 最後の層は分類層です。この層は、ソフトマックス活性化関数によって各入力について返された確率を使用して、互いに排他的なクラスの 1 つに入力を割り当て、損失を計算します。分類層を作成するには、classificationLayer
を使用します。
学習オプションの指定
ニューラル ネットワーク構造を定義した後、学習オプションを指定します。初期学習率を 0.01 としたモーメンタム項付き確率的勾配降下法 (SGDM) を使用して、ニューラル ネットワークに学習させます。エポックの最大数を 4 に設定します。エポックとは、学習データセット全体の完全な学習サイクルのことです。検証データと検証頻度を指定して、学習中にニューラル ネットワークの精度を監視します。すべてのエポックでデータをシャッフルします。学習データでニューラル ネットワークに学習させ、学習中に一定の間隔で検証データに対してその精度を計算します。検証データは、ニューラル ネットワークの重みの更新には使用されません。学習の進行状況プロットをオンにして、コマンド ウィンドウの出力をオフにします。
options = trainingOptions('sgdm', ... 'InitialLearnRate',0.01, ... 'MaxEpochs',4, ... 'Shuffle','every-epoch', ... 'ValidationData',imdsValidation, ... 'ValidationFrequency',30, ... 'Verbose',false, ... 'Plots','training-progress');
学習データを使用したニューラル ネットワークの学習
layers
、学習データ、および学習オプションによって定義されたアーキテクチャを使用して、ニューラル ネットワークに学習させます。既定で、trainNetwork
は、使用可能な GPU があれば GPU を使用し、なければ CPU を使用します。GPU で学習を行うには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。trainingOptions
の名前と値のペアの引数 'ExecutionEnvironment'
を使用して、実行環境を指定することもできます。
学習の進行状況プロットには、ミニバッチの損失と精度、および検証の損失と精度が表示されます。学習の進行状況プロットの詳細は、深層学習における学習の進行状況の監視を参照してください。損失は交差エントロピー損失です。精度は、ニューラル ネットワークによって正しく分類されるイメージの割合です。
net = trainNetwork(imdsTrain,layers,options);
検証イメージの分類と精度の計算
学習済みニューラル ネットワークを使用して検証データのラベルを予測し、最終検証精度を計算します。精度は、ニューラル ネットワークによって予測が正しく行われるラベルの割合です。この場合、99% を超える予測ラベルが検証セット内の真のラベルに一致しています。
YPred = classify(net,imdsValidation); YValidation = imdsValidation.Labels; accuracy = sum(YPred == YValidation)/numel(YValidation)
accuracy = 0.9988
参考
trainNetwork
| trainingOptions
| analyzeNetwork
| ディープ ネットワーク デザイナー