イメージ データおよび特徴データにおけるネットワークの学習
この例では、イメージと特徴の両方の入力データを使用して、手書きの数字を分類するネットワークの学習を行う方法について説明します。
学習データの読み込み
数字のイメージ、ラベル、時計回りの回転角度を読み込みます。
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)

学習オプションの指定
学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。
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
dsX1Test = arrayDatastore(XTest,IterationDimension=4);
dsX2Test = arrayDatastore(anglesTest);
dsTTest = arrayDatastore(labelsTest);
dsTest = combine(dsX1Test,dsX2Test,dsTTest);testnet関数を使用してニューラル ネットワークをテストします。単一ラベルの分類では、精度を評価します。精度は、正しい予測の割合です。既定では、testnet 関数は利用可能な GPU がある場合にそれを使用します。実行環境を手動で選択するには、testnet 関数の ExecutionEnvironment 引数を使用します。
accuracy = testnet(net,dsTest,"accuracy")accuracy = 98.4000
混同チャートで予測を可視化します。関数minibatchpredictを使用して予測を行い、関数scores2labelを使用してスコアをラベルに変換します。既定では、関数 minibatchpredict は利用可能な GPU がある場合にそれを使用します。
scores = minibatchpredict(net,XTest,anglesTest); YTest = scores2label(scores,classNames); figure confusionchart(labelsTest,YTest)

一部のイメージと、その予測を表示します。
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