MATLAB Answers

画像を入力としないC​NNを構築するにはど​うしたらいいでしょう​か?

29 views (last 30 days)
Asuka
Asuka on 9 Jan 2018
Edited: michio on 30 May 2018
CNNでcsvファイル(数値列)を扱いたいのですが,入力層をどのように設定すればいいのか困っています. 現在は画像を扱っているので
layers=[ imageInputLayer([460 175 3]); % RGB convolution2dLayer(3,20); reluLayer(); maxPooling2dLayer(2,'Stride',2); ...
としています. また,データストアも使用しており,
traindigitDataset = imageDatastore(traindigitDatasetPath,... 'IncludeSubfolders',true,'LabelSource','foldernames');
としています. 画像を入力として扱わないCNNを構築するには,これらをどのような設定にすればよいのでしょうか? ご教授頂けたら幸いです. 宜しくお願い致します.

  0 Comments

Sign in to comment.

Accepted Answer

mizuki
mizuki on 9 Jan 2018
Edited: mizuki on 9 Jan 2018
関数名 imageInputLayer や imageDatastore を見ていただいても分かるように、これらは画像に特化した入力層、データストアになります。
数値データ(センサ信号など)の場合、 SequenceInputLayer のような入力層を使用します。また、画像ではなく通常の数値データの場合、 datastore のデータストアを使用します。
なお、データストアの種類は以下にリストされています。
なお、畳み込みニューラルネットワークは、アルゴリズムの性質上、画像やセンサデータのような各サンプル点が近くのサンプル点と関連するような場合にはある程度良い推定モデルを作成できる可能性があります。しかし、そういったデータでない場合はCNNが最適ではないこともあります。もし該当しそうな場合は、他の機械学習のアルゴリズムも検討されることをお勧めします。

  5 Comments

Show 2 older comments
Asuka
Asuka on 11 Jan 2018
ありがとうございます.
分かりました.教えていただいたものを試してみたいと思います.
Asuka
Asuka on 16 Jan 2018
たびたび,すみません. Construct and Train an LSTM Networkの例を基に自分なりにプログラムを書いてみました.
学習データも例題のものに寄せてみたのですが, 学習の段階で「インデックスが行列の次元を超えています.」と出てきます.
学習データを作る段階で特別な工程を必要とするのでしょうか? 教えてください.よろしくお願いいたします.
% データセットのパス
WholeDataSetPath='E:\braindata\experiment_data\csv';
% 使用するデータセットのフォルダの名前
ExperimentFolder='experiment-raw1';
% 学習回数
maxEpochs = 200;
% ミニバッチサイズ
miniBatchSize = 100;
%イメージを設定
MT=cellstr(['calc';'move']); % i
MTNum=[1 2];
%%ニューラルネットワークの定義
layers=[
sequenceInputLayer(14);
convolution2dLayer(3,20);
%leakyReluLayer;
reluLayer();
maxPooling2dLayer(2,'Stride',2);
convolution2dLayer(3,30);
%leakyReluLayer;
reluLayer();
maxPooling2dLayer(2,'Stride',2);
convolution2dLayer(3,20);
%leakyReluLayer;
reluLayer();
maxPooling2dLayer(2,'Stride',2);
fullyConnectedLayer(2);
softmaxLayer();
classificationLayer();
];
%%学習データの準備
%for i=1:7 % 学習データ
i=1;
% 学習データのパス
TrainDigitDatasetPath=fullfile(WholeDataSetPath,ExperimentFolder,...
[num2str(i),'-',ExperimentFolder],'train');
% 学習用行数
TrainRow=0;
for i_MT=MTNum % メンタルタスク
% 入力フォルダの中身の読み込み
FolderInfo=dir(fullfile(TrainDigitDatasetPath,char(MT(i_MT)),'*.csv'));
% 入力フォルダの中身の数を確認
% 中身の数分ループを回す
for a=1:length(FolderInfo)
% 学習用行数の更新
TrainRow=TrainRow+1;
% 学習用特徴量
% ファイル読み込み
TrainData{TrainRow,1}=transpose(csvread(fullfile(TrainDigitDatasetPath,char(MT(i_MT)),FolderInfo(a).name),0,2,[0,2,767,15]));
% 学習用ラベル
%TrainLabel{TrainRow,1}=char(MT(i_MT));
TrainLabel{TrainRow,1}=num2str(i_MT);
end
end
%%学習
% ラベルのカテゴライズ化
CateTrainLabel=categorical(TrainLabel);
% GPUの設定
gpuDevice(1);
% 学習の設定
options=trainingOptions('sgdm','MaxEpochs',maxEpochs,...
'InitialLearnRate',0.001,'MiniBatchSize',miniBatchSize);
% 乱数の種
rng(1);
% CNNの学習
CNNConvnet = trainNetwork(TrainData,CateTrainLabel,layers,options)
mizuki
mizuki on 31 Jan 2018
R2017b のバージョンでは、sequenceInputLayer() に対して convolution2dLayer() を適用することができない状況のようです。
michioさんのコメントにもありますように、時系列データに対しては LSTM がよく使用されますので、こちらもお試ししてみてください。

Sign in to comment.

More Answers (1)

michio
michio on 19 Jan 2018
Edited: michio on 19 Jan 2018
imageInputLayer([1 6000]);
などと、信号を 1xN の"画像"として取り扱った例があります。
layers = [imageInputLayer([1 6000])
convolution2dLayer([1 200],20,'stride',1)]
と構成していきます。英語ですがより具体的な例はこちらも参考にしてください。

  2 Comments

Asuka
Asuka on 19 Jan 2018
ありがとうございます. じっくり読んでみようと思います.
今,計測した脳波データ(14chのセンサからの電位差のデータ)を解析してその時の脳波が何を考えている時の脳波であるか当てるといったことを行っています. 以前は,脳波データにウェーブレット解析を行い画像に変換してCNNを行うことをやっており,そこそこの判別率が得られていました. 今回は,ウェーブレット解析を施さずに時系列脳波データ(生データ)のままでCNNを行うことでより良い判別率が得られるのではないかということで行っていますが,なかなかうまくいかない状況です.
michio
michio on 19 Jan 2018
面白そうなトピックですね。
分類問題であれば LSTM も試す価値があると思いますので、ぜひ。
***
追記:R2018aからLSTMは回帰にも対応しています。

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!