CNNを使って波形か​ら回帰を行うことはで​きますか?

7 ビュー (過去 30 日間)
Kengo Atomi
Kengo Atomi 2017 年 12 月 19 日
編集済み: mizuki 2018 年 1 月 31 日
https://jp.mathworks.com/help/nnet/examples/train-a-convolutional-neural-network-for-regression.html 上記では,たたみ込みニューラル ネットワークを使用して回帰モデルにあてはめ、画像の回転角度を予測する方法を 説明していますが,この入力を波形にして音声の距離を推定する回帰をしたいです. 具体的には,波形は1×4500の行列になっています.一つの波形に正解値(距離)は1つです. CNNを使って波形から回帰を行うことは可能でしょうか?方法もできれば教えていただきたいです. ちなみにAutoencoderを使って特徴量を抽出し,重回帰分析にて推定を行うことはできました.

採用された回答

michio
michio 2018 年 1 月 19 日
編集済み: michio 2018 年 1 月 19 日
imageInputLayer([1 6000]);
などと、信号を 1xN の"画像"として取り扱った例があります。
layers = [imageInputLayer([1 6000])
convolution2dLayer([1 200],20,'stride',1)]
と構成していきます。英語ですがより具体的な例はこちらも参考にしてください。
  4 件のコメント
Kengo Atomi
Kengo Atomi 2018 年 1 月 28 日
何度も申し訳ございません.使用しているデータ100セットをmatファイルで共有させていただきます.実際に使用しているデータの数値とは異なりますが,このような形で8000セット(8000*4500)用意しています. よろしくお願い致します.
michio
michio 2018 年 1 月 29 日
データ助かりました。ありがとうございます。
まず、下記のページで紹介している中で
trainedNet = trainNetwork(X,Y,layers,options)
の構文を使うことを想定します。 https://jp.mathworks.com/help/nnet/ref/trainnetwork.html
「入力引数」の項目を見ると、入力引数 X (train_x に対応)は
4 次元数値配列として指定します。最初の 3 つの次元は高さ、幅、およびチャネルとし、最後の次元は個々のイメージにインデックスを付けるものでなければなりません。
との記載がある通り、4次元数値配列である必要があります。(もともと画像を想定したものなので・・)
ですので、
train_x = reshape(train_x', 1,4500,1,100);
と、もともとの 100x4500 の配列を 1x4500x1x100 に修正した上で trainNetwork 関数に入力してください。train_t の方はそのままでOKかと思います。
ちなみに、
train_x'
と一旦転置しているのは、MATLABの配列はコラムメジャーであるから、、ですがデータの並び順を正しく意図通りに変形するための措置です。
X = [1,2,3;4,5,6;7,8,9]
reshape(X, 1, 9)
reshape(X', 1, 9)
と実行していただけるとなんとなくイメージがわくと思います。

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

その他の回答 (1 件)

mizuki
mizuki 2017 年 12 月 24 日
> CNNを使って波形から回帰を行うことは可能でしょうか?
はい、可能です。
例にも含まれていますが、回帰用の層 regressionLayer が用意されていますのでこれでCNN回帰をすることができます。また、入力が画像ではなく信号とのことですので、入力層を SequenceInputLayer にします。層の定義はだいたいこんな感じです。
layers = [ ...
sequenceInputLayer(*)
convolution2dLayer(*)
reluLayer
maxPooling2dLayer(*)
fullyConnectedLayer(*)
softmaxLayer
regressionLayer]
なお、時系列データですと、CNN ではなく LSTM のアルゴリズムもよく使用されます。こちらも MATLAB で使用できます(ドキュメントに例もあります)ので、使えそうでしたらどうぞ。
  4 件のコメント
Kengo Atomi
Kengo Atomi 2018 年 1 月 4 日
回答ありがとうございます.train_xをセル配列で,i行目(i=1:8000)に4500x1の波形を入れてみても,
エラー: trainNetwork (line 140) インデックスが行列の次元を超えています。
原因: インデックスが行列の次元を超えています。 とエラーが出ます.
layers = [ ... sequenceInputLayer(4500)
convolution2dLayer(12,25)
reluLayer
fullyConnectedLayer(1)
regressionLayer]
のfullyConnectedLayer(1)は,回帰なので1で合っているのでしょうか?たびたび質問してすみません.
mizuki
mizuki 2018 年 1 月 31 日
編集済み: mizuki 2018 年 1 月 31 日
R2017b のバージョンでは、sequenceInputLayer() に対して convolution2dLayer() を適用することができない状況のようです。誤情報ですみませんでした。
LSTMと回帰を組み合わせて使用する方法については将来のバージョンで検討がされているということです。

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

カテゴリ

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

Community Treasure Hunt

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

Start Hunting!