分類用のシンプルな深層学習ニューラル ネットワークの作成
この例では、深層学習による分類用のシンプルな畳み込みニューラル ネットワークを作成し、学習を行う方法を説明します。
畳み込みニューラル ネットワークは深層学習に不可欠なツールであり、特にイメージの認識に適しています。
この例では、以下を実行する方法を示します。
イメージ データを読み込み、確認します。
ニューラル ネットワーク アーキテクチャを定義します。
学習オプションを指定します。
ニューラル ネットワークを学習させます。
新しいデータのラベルを予測し、分類精度を計算します。
シンプルなイメージ分類ニューラル ネットワークの作成および学習を対話的に行う方法を示す例については、イメージ分類入門を参照してください。
イメージ データの読み込みと確認
関数 imageDatastore
を使用して数字データをイメージ データストアとして読み込み、イメージ データが格納されているフォルダーを指定します。イメージ データストアを使用すると、メモリに収まらないデータなどの大きなイメージ データを格納し、畳み込みニューラル ネットワークの学習中にイメージをバッチ単位で効率的に読み取ることができます。
unzip("DigitsData.zip"); dataFolder = "DigitsData"; imds = imageDatastore(dataFolder, ... IncludeSubfolders=true, ... LabelSource="foldernames");
データストアのイメージをいくつか表示します。
figure tiledlayout("flow"); perm = randperm(10000,20); for i = 1:20 nexttile imshow(imds.Files{perm(i)}); end
各カテゴリのイメージの数を計算します。labelCount
は、ラベル、およびそれぞれのラベルが付いているイメージの数を格納する table です。データストアには 0 ~ 9 の数字それぞれについて 1000 個のイメージ、合計で 10000 個のイメージが含まれます。ニューラル ネットワークの最後の全結合層のクラス数を引数 OutputSize
として指定できます。
classNames = categories(imds.Labels); 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
は、データストア imds
を 2 つの新しいデータストア imdsTrain
と imdsValidation
に分割します。
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];
イメージ入力層 imageInputLayer
にはイメージ サイズを指定します。ここでは 28 x 28 x 1 です。これらの数値は、高さ、幅、およびチャネル サイズに対応します。数字データはグレースケール イメージで構成されるため、チャネル サイズ (カラー チャネル) は 1 です。カラー イメージの場合、RGB 値に対応してチャネル サイズは 3 になります。データは、trainnet
により既定で学習の開始時にシャッフルされるため、シャッフルの必要はありません。学習時の各エポックの開始時にも、trainnet
によりデータは自動的にシャッフルされます。
畳み込み層 畳み込み層の最初の引数は 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
を使用してソフトマックス層を作成します。
学習オプションの指定
学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、Experiment Managerアプリを使用できます。
初期学習率を 0.01 としたモーメンタム項付き確率的勾配降下法 (SGDM) を使用して、ニューラル ネットワークに学習させます。
エポックの最大数を 4 に設定します。エポックとは、学習データ セット全体の完全な学習サイクルのことです。
すべてのエポックでデータをシャッフルします。
検証データと検証頻度を指定して、学習中にニューラル ネットワークの精度を監視します。学習データでニューラル ネットワークに学習させ、学習中に一定の間隔で検証データに対してその精度を計算します。検証データは、ニューラル ネットワークの重みの更新には使用されません。
学習の進行状況をプロットで表示し、精度を監視します。
詳細出力を無効にします。
options = trainingOptions("sgdm", ... InitialLearnRate=0.01, ... MaxEpochs=4, ... Shuffle="every-epoch", ... ValidationData=imdsValidation, ... ValidationFrequency=30, ... Plots="training-progress", ... Metrics="accuracy", ... Verbose=false);
学習データを使用したニューラル ネットワークの学習
layers
、学習データ、および学習オプションによって定義されたアーキテクチャを使用して、ニューラル ネットワークに学習させます。既定では、trainnet
は利用可能な GPU があればそれを使用し、そうでない場合は CPU を使用します。GPU で学習を行うには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。trainingOptions
の名前と値の引数 ExecutionEnvironment
を使用して、実行環境を指定することもできます。
学習の進行状況プロットには、ミニバッチの損失と精度、および検証の損失と精度が表示されます。学習の進行状況プロットの詳細は、深層学習における学習の進行状況の監視を参照してください。損失はクロスエントロピー損失です。精度は、ニューラル ネットワークによって正しく分類されるイメージの割合です。
net = trainnet(imdsTrain,layers,"crossentropy",options);
検証イメージの分類と精度の計算
テスト イメージを分類します。複数の観測値を使用して予測を行うには、関数minibatchpredict
を使用します。予測スコアをラベルに変換するには、関数 scores2label
を使用します。関数 minibatchpredict
は利用可能な GPU がある場合に自動的にそれを使用します。そうでない場合、関数は CPU を使用します。
scores = minibatchpredict(net,imdsValidation); YValidation = scores2label(scores,classNames);
分類精度を計算します。精度は、正しく予測されたラベルの割合です。
TValidation = imdsValidation.Labels; accuracy = mean(YValidation == TValidation)
accuracy = 0.9928
参考
trainnet
| trainingOptions
| dlnetwork
| analyzeNetwork
| ディープ ネットワーク デザイナー