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

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

採用された回答

mizuki
mizuki 2018 年 1 月 9 日
編集済み: mizuki 2018 年 1 月 9 日
関数名 imageInputLayer や imageDatastore を見ていただいても分かるように、これらは画像に特化した入力層、データストアになります。
数値データ(センサ信号など)の場合、 SequenceInputLayer のような入力層を使用します。また、画像ではなく通常の数値データの場合、 datastore のデータストアを使用します。
なお、データストアの種類は以下にリストされています。
なお、畳み込みニューラルネットワークは、アルゴリズムの性質上、画像やセンサデータのような各サンプル点が近くのサンプル点と関連するような場合にはある程度良い推定モデルを作成できる可能性があります。しかし、そういったデータでない場合はCNNが最適ではないこともあります。もし該当しそうな場合は、他の機械学習のアルゴリズムも検討されることをお勧めします。
  5 件のコメント
Asuka
Asuka 2018 年 1 月 16 日
たびたび,すみません. 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 2018 年 1 月 31 日
R2017b のバージョンでは、sequenceInputLayer() に対して convolution2dLayer() を適用することができない状況のようです。
michioさんのコメントにもありますように、時系列データに対しては LSTM がよく使用されますので、こちらもお試ししてみてください。

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

その他の回答 (1 件)

michio
michio 2018 年 1 月 19 日
編集済み: michio 2018 年 1 月 19 日
imageInputLayer([1 6000]);
などと、信号を 1xN の"画像"として取り扱った例があります。
layers = [imageInputLayer([1 6000])
convolution2dLayer([1 200],20,'stride',1)]
と構成していきます。英語ですがより具体的な例はこちらも参考にしてください。
  2 件のコメント
Asuka
Asuka 2018 年 1 月 19 日
ありがとうございます. じっくり読んでみようと思います.
今,計測した脳波データ(14chのセンサからの電位差のデータ)を解析してその時の脳波が何を考えている時の脳波であるか当てるといったことを行っています. 以前は,脳波データにウェーブレット解析を行い画像に変換してCNNを行うことをやっており,そこそこの判別率が得られていました. 今回は,ウェーブレット解析を施さずに時系列脳波データ(生データ)のままでCNNを行うことでより良い判別率が得られるのではないかということで行っていますが,なかなかうまくいかない状況です.
michio
michio 2018 年 1 月 19 日
編集済み: michio 2018 年 5 月 30 日
面白そうなトピックですね。
分類問題であれば LSTM も試す価値があると思いますので、ぜひ。
***
追記:R2018aからLSTMは回帰にも対応しています。

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

カテゴリ

Help Center および File Exchange時系列、シーケンス、およびテキストを使用した深層学習 についてさらに検索

Community Treasure Hunt

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

Start Hunting!