CNNの入力層に対応したcsvデータのデータ処理

csvデータに対し1次元の畳み込みニューラルネットワークを作成する際に、複数のcsvデータを変数に格納しCNNの入力層に対応したデータの次元数を変えたいのですが、
 
wavedata = imageDatastore('C:\Users\MTL\Documents\notebook\matlabpracticecsv\drilldata','IncludeSubfolders',true, 'FileExtensions','.csv')
drilllabel = wavedata.Labels
[drilltrain,drilltest] = splitEachLabel(wavedata,0.8,'randomized');
Train_data = reshape(drilltrain, [1 4800 1 320]);
Test_data = reshape(drilltest, [1 4800 1 80]);
このコードで回すと エラー: reshape 要素数を RESHAPE するために変更してはいけません。 とエラーが出ます。
csvデータをCNNの入力層に対応するデータ処理はどう行えばよいのでしょうか?

Antworten (1)

michio
michio am 1 Jun. 2018

1 Stimme

reshape 関数 は数値配列に対して実行する関数ですので、
Train_data = reshape(drilltrain, [1 4800 1 320]);
と imageDatastore に対しては意味を持ちません。関数の挙動は
doc reshape
と実行するかウェブ上のドキュメンテーションページで確認してみてください。
では、どこで reshape が実行できるかといいますと、imageDatastore の ReadFcn プロパティで指定する読み込み関数内で実行するのがよいのではと。
wavedata = imageDatastore('C:\Users\MTL\Documents\notebook\matlabpracticecsv\drilldata','IncludeSubfolders',true, 'FileExtensions','.csv')
wavedata.ReadFcn = @readDatastoreCSV;
と設定します。readDatastoreCSV 関数は下記のような定義で試してください。
function data = readDatastoreCSV(filename)
data = csvread(filename);
data = reshape(data, [1 4800 1 80]);
何はともあれ、例えば csv ファイル単体で試してみるなどデバッグしやすいサイズでまず試してみることをお勧めします。 例:(test.csv) の読み込み
imds = imageDatastore('test.csv','ReadFcn',@csvread,'FileExtensions','.csv');
imds.ReadFcn = @readDatastoreCSV;
data = read(imds);

4 Kommentare

Jo Sasaki
Jo Sasaki am 4 Jun. 2018
回答ありがとうございます。 いろいろ試してみたのですが
原因:
エラー: matlab.io.datastore.ImageDatastore/read (line 75)
次のファイルの ReadFcn @readDatastoreCSV 関数ハンドルを使用する際にエラーが発生しました:
C:\Users\MTL\Documents\notebook\matlabpracticecsv\drilldata\drilltrainfolder\train_break\sample_051.csv
エラー: reshape
要素数を RESHAPE するために変更してはいけません。
エラー: readDatastoreCSV (line 3)
data = reshape(data, [1 4800 1 1]);
と出てしまいます。 しかしこの記事 https://jp.mathworks.com/matlabcentral/answers/354258-how-do-i-create-a-1d-cnn を見る限りreshape関数を問題なく使用できているように見えるのですが何か良い方法はありますか。
%データ読み込みとラベル格納
wavedata = imageDatastore('C:\Users\MTL\Documents\notebook\matlabpracticecsv\drilldata\drilltrainfolder','Readfcn',@readDatastoreCSV,'IncludeSubfolders',true,'LabelSource','foldernames','FileExtensions','.csv')
drilllabel = wavedata.Labels
%訓練、テストデータ分割
[drilltrain,drilltest] = splitEachLabel(wavedata,0.8,'randomized')
layers=[
imageInputLayer([1 4800]);
convolution2dLayer([1 101],20,'Stride',2);
%leakyReluLayer;
reluLayer();
maxPooling2dLayer([1 9],'Stride',2);
convolution2dLayer([1 51],50,'Stride',1);
%leakyReluLayer;
reluLayer();
maxPooling2dLayer([1 9],'Stride',2);
convolution2dLayer([1 9],100,'Stride',1);
%leakyReluLayer;
reluLayer();
maxPooling2dLayer([1 9],'Stride',2);
fullyConnectedLayer(1000);
fullyConnectedLayer(500);
fullyConnectedLayer(2);
softmaxLayer();
classificationLayer();
];
options = trainingOptions('sgdm');
[drillnet,info] = trainNetwork(drilltrain, layers, options);
こちらはコード全文です。
michio
michio am 4 Jun. 2018
imds = imageDatastore('test.csv','ReadFcn',@csvread,'FileExtensions','.csv');
imds.ReadFcn = @readDatastoreCSV;
data = read(imds);
繰り返しになりますが、例えば上記のように実行すると、read 関数実行時に、readDatastoreCSV 関数を使って test.csv が読み取られます。
この際に、reshape関数がなぜエラーを発するのかは、readDatastoreCSV 関数の reshape を実行している行にブレークポイントを設置して試すのが一番良いかと思います。
readDatastoreCSV関数の reshape を実行してる行の行番号横、"-"の位置をクリックして赤い丸(ブレークポイント)を設置してみてください。
reshape 関数実行時に
要素数を RESHAPE するために変更してはいけません。
というエラーが出るときは、次元変更前後で要素数が合致しなことが原因です。
例えば、 10x1 のベクトルを 5x3 の行列に変更しようとすると要素数が足りないのでエラーを発します。同じことが発生しているはずです。
data = reshape(data, [1 4800 1 1]);
でエラーが発生するということは、csv から読み取った data の要素数が 4800 でないことが原因であるはずです。ご確認ください。
Jo Sasaki
Jo Sasaki am 4 Jun. 2018
全てのデータをチェックしたところ複数の音データがサンプリング周波数の違うものを含んでいたためエラーが出ていました。 データのサイズを合わせたところ実行に成功しました。 丁寧な対応ありがとうございます。
michio
michio am 4 Jun. 2018
それは良かったです。 面白い結果がでたらぜひまた教えてください。

Melden Sie sich an, um zu kommentieren.

Kategorien

Gefragt:

am 1 Jun. 2018

Kommentiert:

am 4 Jun. 2018

Community Treasure Hunt

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

Start Hunting!