質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

970閲覧

pythonのkerasを用いてsin波の2値分類をしたい

fujito

総合スコア2

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

CNN (Convolutional Neural Network)

CNN (Convolutional Neural Network)は、全結合層のみではなく畳み込み層とプーリング層で構成されるニューラルネットワークです。画像認識において優れた性能を持ち、畳み込みニューラルネットワークとも呼ばれています。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/03 14:16

前提

大学の研究において脳波の解析をしています。
実験のシュミレーションデータの解析を行なっているのですが、うまくできません。
研究室の中ではこの分野を行なっているのは自分しかいなくて、先輩方には頼ることができない状況なのでここで質問させていただきます。

実現したいこと

手順1:周波数が10と80のsin波を作成し、合成する。これを訓練データとする。
手順2:周波数が80のsin波を作成し、テストデータとする。

発生している問題

実験結果のaccuracy(判別制度)が100%にならなければいけないのに0%になってしまう。

該当のソースコード

import matplotlib.pyplot as plt import numpy as np #周波数が10のsin波を作成 x1 = np.linspace(0, 10*np.pi, 1600000) x1 = np.array(x1) x1train = np.sin(x1) #周波数が80のsin波を作成 x2 = np.linspace(0, 80*np.pi, 1600000) x2 = np.array(x2) x2train = np.sin(x2) plt.plot(x1,x1train) plt.show() plt.plot(x2,x2train) plt.show() #2つの波を合成 x3 = np.linspace(0, 80*np.pi, 3200000) x_train = np.concatenate([x1train,x2train]) plt.plot(x3,x_train) plt.show() #実験データが(40,5000,16,1)というサイズなので合わせています。 x_train.resize(40,5000,16,1) #訓練データのラベル付け(周波数が10の部分は0、周波数が80の部分は1とする) y_train = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1] y_train = np.asarray(y_train).astype('float32') #テストデータの作成 z = np.linspace(0, 80*np.pi, 800000) z1 = np.sin(z) x_test = np.array(z1) x_test.resize(10,5000,16,1) #テストデータのラベル付け(テストデータは周波数80なので1) y_test = [1,1,1,1,1,1,1,1,1,1] y_test = np.asarray(y_test).astype('float32') import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_circles from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from keras.models import Sequential from keras.layers.core import Dense from keras import optimizers from keras.models import Sequential from keras.layers import Dense, Activation, Flatten, Dropout model = Sequential() model.add(Dense(3, activation='relu',input_shape=(5000, 16, 1))) model.add(Dense(3, activation='relu')) model.add(Flatten()) model.add(Dense(2, activation='softmax')) model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.summary() history = model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=20) metrics = ['loss', 'accuracy'] # 使用する評価関数を指定 plt.figure(figsize=(10, 5)) # グラフを表示するスペースを用意 for i in range(len(metrics)): metric = metrics[i] plt.subplot(1, 2, i+1) # figureを1×2のスペースに分け、i+1番目のスペースを使う plt.title(metric) # グラフのタイトルを表示 plt_train = history.history[metric] # historyから訓練データの評価を取り出す plt_test = history.history['val_' + metric] # historyからテストデータの評価を取り出す plt.plot(plt_train, label='training') # 訓練データの評価をグラフにプロット plt.plot(plt_test, label='test') # テストデータの評価をグラフにプロット plt.legend() # ラベルの表示 plt.show() # グラフの表示

知りたいこと

この2種類の波をうまく判別するためにはどうすれば良いでしょうか。
また、60行目のFlatten層なしでもこのデータを解析することは可能でしょうか。
どなたかご教授いただければ幸いです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/11/03 21:41 編集

> この2種類の波をうまく判別するためにはどうすれば良いでしょうか。 普通のサイン波の識別であればFFTをしてSVMを使えばスパッと行きそうですが、本当のターゲットは脳波なので(そんなにサイン波ほど規則正しいとは言い切れないので)、あえてNNを使う、ということでしょうか? > また、60行目のFlatten層なしでもこのデータを解析することは可能でしょうか。 しなくても動くかもしれませんが、softmaxの前にはflattenをした方が良いと思います。 参考: 波形データを「超浅い独自の全結合のネットワーク」で捌こうとすると、本業(?)の脳波の解析よりも「機械学習エンジニアとして独自のネットワーク構造の探索」のような路線のことに時間を割かないといけなくなりかねません。 --- ゼロから作るのももちろん大事ですが、時間を節約するのとバグを避けるのを考えれば、すでにあるのを使うのも手と思います。特にNNの場合やることが複雑なのでありものを使いまわすのもうまく立ち回るテクニックと思います。 以下のURLでは波形データから話者の認識をするもので実装されています。「話者を特定する」代わりに、「特定のクラス(どの周波数か)を特定する」とすれば、そのままプログラムを挿げ替えられるように思います。 https://github.com/mravanelli/SincNet
fujito

2021/11/04 09:55

fourteenlengthさん、コメントありがとうございます。 >普通のサイン波の識別であればFFTをしてSVMを使えばスパッと行きそうですが、本当のターゲットは脳波なので(そんなにサイン波ほど規則正しいとは言い切れないので)、あえてNNを使う、ということでしょうか? おっしゃる通り、現在私の研究室ではSVMを使ってデータ解析するというのが主流になっています。しかし、他の解析方法でも良い判別制度を得られるのではないかということでNNを使って解析を試みております。 >しなくても動くかもしれませんが、softmaxの前にはflattenをした方が良いと思います。 そういうものなんですね。ありがとうございます。flattenの仕組みがよくわからないのでこの部分が原因なのかなと考えていました。 参考文献についてもありがとうございます。プログラムを拝見させていただきましたが、お恥ずかしながらどのファイルが波形データから話者の認識をするもので実装しているか分かりませんでした。差し支えなければ、こちらについても教えていただけると幸いです。
guest

回答1

0

ベストアンサー

差し支えなければ、こちらについても教えていただけると幸いです。

私もこれは使ったことはありませんが、

  1. Githubでみること

だいたいの場合readme.txtかreadme.mdに使い方があり、License.txtかgithubのライセンス表示に条件が書いてあります。使い方を読んで、ライセンスが使い道と使う側の意図に沿っていれば使ってもOKと思います。ライセンスが書いてないものは(自前の検証くらいならいいのかもしれませんが)発表したり何かしたりしたいのであれば避けた方がイイです。

  1. どうすれば実体がつかめるか?

上記Readmeに大体コマンドラインが書いてあります。上記の場合、python speaker_id.py --cfg=cfg/SincNet_TIMIT.cfgとありますので、speaker_id.pyが親のスクリプトと分かります。
あとはDNN〇_netという記述がザーッとみると見つかるので、それがキモなんだな(たぶん)と、そういう感じで見ていきます。わからないコードはとりあえずDLして、読んでみて、リファレンスのファイルで様子を見るのが一番早いと思っています。

投稿2021/11/04 22:43

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fujito

2021/11/10 02:08

詳しくありがとうございます。理解して自分の実験に活かせるよう頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問