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

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

採用された回答

Kenta
Kenta 2019 年 7 月 29 日
こんにちは、可能です。以下のように全結合層の出力を9つに定義して、かつラベルを9つの出力×(データ数)あるものを用意すれば学習可能と思います。
fullyConnectedLayer(9)
  3 件のコメント
Kenta
Kenta 2019 年 7 月 29 日
編集済み: Kenta 2019 年 7 月 29 日
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 2019 年 7 月 29 日
ご丁寧な対応ありがとうございます!
添付して頂いたコードを試したいと思います。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeイメージを使用した深層学習 についてさらに検索

製品


リリース

R2019a

Community Treasure Hunt

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

Start Hunting!