前提
大学の研究において脳波の解析をしています。
実験のシュミレーションデータの解析を行なっているのですが、うまくできません。
研究室の中ではこの分野を行なっているのは自分しかいなくて、先輩方には頼ることができない状況なのでここで質問させていただきます。
実現したいこと
手順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層なしでもこのデータを解析することは可能でしょうか。
どなたかご教授いただければ幸いです。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー