MATLAB Answers

1

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

Jo Sasaki さんによって質問されました 2018 年 6 月 1 日
最新アクティビティ michio
さんによって コメントされました 2018 年 6 月 4 日
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の入力層に対応するデータ処理はどう行えばよいのでしょうか?

  0 件のコメント

サインイン to comment.

1 件の回答

michio
回答者: michio
2018 年 6 月 1 日

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 件のコメント

michio
2018 年 6 月 4 日
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 2018 年 6 月 4 日
全てのデータをチェックしたところ複数の音データがサンプリング周波数の違うものを含んでいたためエラーが出ていました。 データのサイズを合わせたところ実行に成功しました。 丁寧な対応ありがとうございます。
michio
2018 年 6 月 4 日
それは良かったです。 面白い結果がでたらぜひまた教えてください。

サインイン to comment.