回帰用畳み込みニュー​ラルネットワークを用​いて2次元数値配列を​入力とした時に、出力​も2次元数値配列にす​ることは不可能でしょ​うか?

12 views (last 30 days)
Tamu
Tamu on 28 Jul 2019
Commented: Tamu on 29 Jul 2019
回帰用畳み込みニューラルネットワークを使って、
2次元数値配列を入力した時に、2次元数値配列を出力として予測することを考えています。
(例)入力:[1,1,1;0,1,0;0,1,0] ⇒ 出力:[1,1,1;0,0,0;0,0,0]
「回帰問題を解くには、ネットワークの最後の回帰層の前に全結合層を配置する必要がある」と記述されているのですが、
この場合回帰用のネットワークでは出力のタイプとして2次元数値配列を設定することは不可能でしょうか?
ご教示ください。
よろしくお願いいたします。

Accepted Answer

Kenta
Kenta on 29 Jul 2019
こんにちは、可能です。以下のように全結合層の出力を9つに定義して、かつラベルを9つの出力×(データ数)あるものを用意すれば学習可能と思います。
fullyConnectedLayer(9)
  3 Comments
Kenta
Kenta on 29 Jul 2019
Edited: Kenta on 29 Jul 2019
9つの出力×データ数です。
例えば、手書き数字イメージが1)どれだけ回転しているか2)0でないピクセル値をもつ、ピクセル数はいくつか、という2つの項目を回帰するものは添付のようになります。このコードを走らせてみるとイメージがつくかと思います。そちらのほうを試していただけますか。
close all;clear;clc
[XTrain,~,YTrain] = digitTrain4DArrayData;
[XValidation,~,YValidation] = digitTest4DArrayData;
non_zero_idx=squeeze(XTrain(:,:,1,:)>0);
non_zero_num=squeeze(sum(non_zero_idx,[1 2]));
YTrain2=[YTrain,non_zero_num];
non_zero_idx2=squeeze(XValidation(:,:,1,:)>0);
non_zero_num2=squeeze(sum(non_zero_idx2,[1 2]));
YValidation2=[YValidation,non_zero_num2];
layers = [
imageInputLayer([28 28 1])
convolution2dLayer(3,8,'Padding','same')
batchNormalizationLayer
reluLayer
averagePooling2dLayer(2,'Stride',2)
convolution2dLayer(3,16,'Padding','same')
batchNormalizationLayer
reluLayer
averagePooling2dLayer(2,'Stride',2)
convolution2dLayer(3,32,'Padding','same')
batchNormalizationLayer
reluLayer
convolution2dLayer(3,32,'Padding','same')
batchNormalizationLayer
reluLayer
dropoutLayer(0.2)
fullyConnectedLayer(2)
regressionLayer];
miniBatchSize = 128;
validationFrequency = floor(numel(YTrain)/miniBatchSize);
options = trainingOptions('sgdm', ...
'MiniBatchSize',miniBatchSize, ...
'MaxEpochs',10, ...
'InitialLearnRate',1e-3, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropFactor',0.1, ...
'LearnRateDropPeriod',20, ...
'Shuffle','every-epoch', ...
'ValidationData',{XValidation,YValidation2}, ...
'ValidationFrequency',validationFrequency, ...
'Plots','training-progress', ...
'Verbose',false);
net = trainNetwork(XTrain,YTrain2,layers,options);
YPredicted = predict(net,XValidation);
predictionError = YValidation2 - YPredicted;
squares = predictionError.^2;
rmse = sqrt(mean(squares))
Tamu
Tamu on 29 Jul 2019
ご丁寧な対応ありがとうございます!
添付して頂いたコードを試したいと思います。

Sign in to comment.

More Answers (0)

Products


Release

R2019a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!