加速度・ジャイロを回転行列で計算し、xyzの3次元で出力したデータを、ravel()で時間軸なしで1次元にしたデータで分類器を作成したく、機械学習を行なっています。
特徴量Xとしてkerasで機械学習を行いました。xyzデータを累積和としてdfデータに入れています。
python
1 2import keras 3from keras.models import Sequential 4from keras.layers import Dense,Activation,Dropout 5from sklearn import datasets 6import numpy as np 7import matplotlib.pyplot as plt 8 9df=[] 10#測定データをnpyデータで呼び出し、dfに格納 11for i in range(40): 12 acgydata=np.load(f"acgydata{i}.npy") 13 onedata=[] 14 x=[d[0] for d in acgydata] 15 x=np.array(x).ravel() 16 x=np.cumsum(x) 17 y=[d[1] for d in acgydata] 18 y=np.array(y).ravel() 19 y=np.cumsum(y) 20 z=[d[2] for d in acgydata] 21 z=np.array(z).ravel() 22 z=np.cumsum(z) 23 onedata.append(x) 24 onedata.append(y) 25 onedata.append(z) 26 onedata=np.ravel(onedata) 27 df.append(onedata) 28#特徴量とターゲットデータを設定 29X=np.array(df) 30(n_samples,n_features)=X.shape 31y=np.array([0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3]) 32n_classes=len(np.unique(y)) 33y_keras=keras.utils.to_categorical(y,n_classes) 34model=Sequential() 35model.add(Dense(units=200,activation="relu",input_shape=(n_features,))) 36model.add(Dropout(0.1)) 37model.add(Dense(units=100,activation="relu")) 38model.add(Dropout(0.1)) 39model.add(Dense(units=n_classes,activation="softmax")) 40model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=["accuracy"]) 41 42history=model.fit(X,y_keras,epochs=4000,validation_split=0.1,batch_size=n_samples,verbose=2) 43result=model.predict_classes(X,verbose=0) 44 45 46#以下で損失関数のグラフを描画 47val_loss,=plt.plot(history.history["val_loss"],c="orange") 48loss,=plt.plot(history.history["loss"],c="blue") 49plt.legend([loss,val_loss],["loss","val_loss"]) 50plt.show() 51#accuracyをグラフ化 52val_acc,=plt.plot(history.history["val_acc"],c="yellowgreen") 53acc,=plt.plot(history.history["acc"],c="red") 54plt.legend([loss,val_acc],["acc","val_acc"]) 55plt.show() 56
損失係数のグラフを作成したのですが、lossは低下しているのですが、val_lossが一度も変動していないような直線を描くグラフになってしまっています。
accuracyにおいてもaccは0.7前後まで上昇するときもあるのですが,val_accは0の部分で直線を描いてしまっています。
これはプログラムの記載ミスから起こっているのか、サンプル数が少ないために起こる問題なのか、それとも中間層の設定の問題なのか、アドバイスをいただけますと幸いです。
svmなども色々試したのですが、ランダムフォレストにおける分類を行うとpredictは100%近くでるテストデータを用いています。
追記
アドバイスをいただきまして中間層のunits、batchsize=1などに変更した結果を追記いたします。
様々なアドバイスでval_loss,accに振幅がみられるようになってきました。やはりサンプルが少なすぎるのが問題の根本なのかもしれません。
python
1model=Sequential() 2#設定値は適当 3model.add(Dense(units=20,activation="relu",input_shape=(n_features,))) 4model.add(Dropout(0.1)) 5model.add(Dense(units=10,activation="relu")) 6model.add(Dropout(0.1)) 7model.add(Dense(units=n_classes,activation="softmax")) 8model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=["accuracy"]) 9#学習を行う 10history=model.fit(X,y_keras,epochs=4000,validation_split=0.5,batch_size=1,verbose=2) 11コード
6/17 Dropoutをの代わりにregurlarizationを導入
python3
1#neuralnetworkの以下に変更定義を変更 Dropoutを中止し、l2による正則化をを中間層に設定 2from keras import regularizers 3model=Sequential() 4model.add(Dense(units=20,activation="relu",input_shape=(n_features,))) 5model.add(Dense(10, input_dim=20, 6 kernel_regularizer=regularizers.l2(0.01), 7 activity_regularizer=regularizers.l2(0.01))) 8model.add(Dense(units=10,activation="relu")) 9model.add(Dense(units=n_classes,activation="softmax")) 10model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=["accuracy"]) 11history=model.fit(X,y_keras,epochs=6000,validation_split=0.5,batch_size=20,verbose=2) 12 13コード
いただいたアドバイスをもとに中間層の設定にDropoutをなくし、l2によるregularlizationを導入した結果を追記しました。regularizationとactivity_regularizerの引数については調べているものの数値の理解がまだ曖昧ですので適切かどうか不明瞭です。正しいかどうかはわかりませんがloss,val_loss共に低下し、accracyについても変動はみられています。ありがとうございます。
python3
1#l2_lossを定義 2def l2_loss(w): 3return 0.5 * np.sum(w ** 2) 4 5w1 = np.array([1.0, 2.0, 3.0]) 6w2 = np.array([4.0, 5.0, 6.0]) 7#aを欠損値とする 8a=3.0 9loss = a + l2_loss(w1) + l2_loss(w2) 10を設定しまして,中間層の正則化に自己で導入したパラメータを導入 11kernel_regularizer=l2_loss 12コード
で中間層を変更するとエラーがでてきてしまうため、解決致しましたら追記いたします。

回答2件
あなたの回答
tips
プレビュー