1

データセットC50,000(バイナリ)の128のサンプルを持っています。クラスラベルは、1または-1のバイナリです。たとえば、サンプルは[1,0,0,0,1,0, .... , 0,1] [-1]のようになります。私の目標は、バイナリクラス(すなわち、1または-1)に基づいてサンプルを分類することです。私はRecurrent LSTMを使って分類のための良いモデルを生成しようと考えました。そうするために、私はKerasライブラリを使用して、次のコードを書かれている:分類にはSTATEFUL Recurrent NN(LSTM)を使用してもかまいません。

tr_C, ts_C, tr_r, ts_r = train_test_split(C, r, train_size=.8) 
batch_size = 200 

print('>>> Build STATEFUL model...') 
model = Sequential() 
model.add(LSTM(128, batch_input_shape=(batch_size, C.shape[1], C.shape[2]), return_sequences=False, stateful=True)) 
model.add(Dense(1, activation='softmax')) 

print('>>> Training...') 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) 
model.fit(tr_C, tr_r, 
      batch_size=batch_size, epochs=1, shuffle=True, 
      validation_data=(ts_C, ts_r)) 

しかし、私は55%以上、悪い精度を取得していません。私は、精度を向上させることを望む損失関数と共にアクティベーション関数を変更しようとしましたが、何も機能しません。驚いたことに、私が多層パーセプトロンを使用すると、私は約97%の精度を得ることができます。したがって、私は、LSTMが分類に使用できるかどうか、あるいはここに私のコードに何かがないか、間違っているかどうか質問し始めます。親切にも、正確性を向上させるために、コードに何かがないか間違っているかどうかを知りたいです。助けや助言をいただければ幸いです。

答えて

1

出力ユニットが1つだけの場合、softmaxを出力として使用することはできません。出力値は常に1の定数値を出力します。出力のアクティブ化をsigmoidに変更するか、出力ユニット番号を2に設定し、損失をcategorical_crossentropyに設定する必要があります。私は最初のオプションをお勧めします。

+0

ありがとうございます。とても有難い – Kris

関連する問題