イメージ データおよび特徴データにおけるネットワークの学習
この例では、イメージと特徴の両方の入力データを使用して、手書きの数字を分類するネットワークの学習を行う方法について説明します。
学習データの読み込み
数字のイメージ、ラベル、時計回りの回転角度を読み込みます。
load DigitsDataTrain
関数 trainnet
を使用して複数の入力をもつネットワークに学習させるには、学習予測子と応答を含む単一のデータストアを作成します。数値配列をデータストアに変換するには、arrayDatastore
を使用します。次に、関数 combine
を使用し、それらを組み合わせて単一のデータストアにします。
dsX1Train = arrayDatastore(XTrain,IterationDimension=4); dsX2Train = arrayDatastore(anglesTrain); dsTTrain = arrayDatastore(labelsTrain); dsTrain = combine(dsX1Train,dsX2Train,dsTTrain);
ランダムに選ばれた 20 個の学習イメージを表示します。
numObservationsTrain = numel(labelsTrain); idx = randperm(numObservationsTrain,20); figure tiledlayout("flow"); for i = 1:numel(idx) nexttile imshow(XTrain(:,:,:,idx(i))) title("Angle: " + anglesTrain(idx(i))) end
ネットワーク アーキテクチャの定義
次のネットワークを定義します。
イメージ入力用に、入力データと一致するサイズのイメージ入力層を指定します。
特徴入力用に、入力特徴の数と一致するサイズの特徴入力層を指定します。
イメージ入力分岐用に、畳み込み層、バッチ正規化層、および ReLU 層のブロックを指定します。ここで畳み込み層には 5 行 5 列のフィルターが 16 個あります。
バッチ正規化層の出力を特徴ベクトルに変換するために、サイズが 50 の全結合層を含めます。
最初の全結合層の出力を特徴入力と連結するために、フラット化層を使用し、全結合層の
"SSCB"
(spatial、spatial、channel、batch) 出力をフラットにして"CB"
の形式にします。フラット化層の出力を、最初の次元 (チャネル次元) に沿って特徴入力と連結します。
分類出力用に、クラスの数に一致する出力サイズの全結合層と、それに続くソフトマックス層を含めます。
空のニューラル ネットワークを作成します。
net = dlnetwork;
ネットワークの主分岐を含む層配列を作成し、ネットワークに追加します。
[h,w,numChannels,numObservations] = size(XTrain); numFeatures = 1; classNames = categories(labelsTrain); numClasses = numel(classNames); imageInputSize = [h w numChannels]; filterSize = 5; numFilters = 16; layers = [ imageInputLayer(imageInputSize,Normalization="none") convolution2dLayer(filterSize,numFilters) batchNormalizationLayer reluLayer fullyConnectedLayer(50) flattenLayer concatenationLayer(1,2,Name="cat") fullyConnectedLayer(numClasses) softmaxLayer]; net = addLayers(net,layers);
ネットワークに特徴入力層を追加し、それを連結層の 2 番目の入力に結合します。
featInput = featureInputLayer(numFeatures,Name="features"); net = addLayers(net,featInput); net = connectLayers(net,"features","cat/in2");
ネットワークをプロットで可視化します。
figure plot(net)
学習オプションの指定
学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、Experiment Managerアプリを使用できます。
SGDM オプティマイザーを使用して学習させます。
学習を 15 エポック行います。
学習率を 0.01 にして学習を行います。
学習の進行状況をプロットで表示し、精度メトリクスを監視します。
詳細出力を非表示にします。
options = trainingOptions("sgdm", ... MaxEpochs=15, ... InitialLearnRate=0.01, ... Plots="training-progress", ... Metrics="accuracy", ... Verbose=0);
ネットワークの学習
関数trainnet
を使用してニューラル ネットワークに学習させます。分類には、クロスエントロピー損失を使用します。既定では、関数 trainnet
は利用可能な GPU がある場合にそれを使用します。GPU を使用するには、Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。そうでない場合、関数は CPU を使用します。実行環境を指定するには、ExecutionEnvironment
学習オプションを使用します。
net = trainnet(dsTrain,net,"crossentropy",options);
ネットワークのテスト
真のラベルをもつテスト セットで予測を比較して、ネットワークの分類精度をテストします。
テスト データを読み込みます。
load DigitsDataTest
関数minibatchpredict
を使用して予測を行い、関数scores2label
を使用してスコアをラベルに変換します。既定では、関数 minibatchpredict
は利用可能な GPU がある場合にそれを使用します。
scores = minibatchpredict(net,XTest,anglesTest); YTest = scores2label(scores,classNames);
混同チャートで予測を可視化します。
figure confusionchart(labelsTest,YTest)
分類精度を評価します。
accuracy = mean(YTest == labelsTest)
accuracy = 0.9852
一部のイメージと、その予測を表示します。
idx = randperm(size(XTest,4),9); figure tiledlayout(3,3) for i = 1:9 nexttile I = XTest(:,:,:,idx(i)); imshow(I) label = string(YTest(idx(i))); title("Predicted Label: " + label) end
参考
dlnetwork
| dlfeval
| dlarray
| fullyConnectedLayer
| ディープ ネットワーク デザイナー | featureInputLayer
| minibatchqueue
| onehotencode
| onehotdecode