Main Content

イメージ データおよび特徴データにおけるネットワークの学習

この例では、イメージと特徴の両方の入力データを使用して、手書きの数字を分類するネットワークの学習を行う方法について説明します。

学習データの読み込み

数字のイメージ、ラベル、時計回りの回転角度を読み込みます。

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

ネットワーク アーキテクチャの定義

次のネットワークを定義します。

image1.png

  • イメージ入力用に、入力データと一致するサイズのイメージ入力層を指定します。

  • 特徴入力用に、入力特徴の数と一致するサイズの特徴入力層を指定します。

  • イメージ入力分岐用に、畳み込み層、バッチ正規化層、および 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

参考

| | | | | | | |

関連する例

詳細