2017-08-22 9 views
2

私はこのような入力データを有する:列車LSTMを用いたモデルとkeras

x_train = [ 
    [0,0,0,1,-1,-1,1,0,1,0,...,0,1,-1], 
    [-1,0,0,-1,-1,0,1,1,1,...,-1,-1,0] 
    ... 
    [1,0,0,1,1,0,-1,-1,-1,...,-1,-1,0] 
] 
y_train = [1,1,1,0,-1,-1,-1,0,1...,0,1] 

それは各アレイは83 のサイズを有し、y_train、これらのそれぞれについてlableあるarryasのアレイでありますアレイ。 だからlen(x_train)len(y_train)と同じです。 私はこのコードのようなデータの訓練のためにkerasとtheanoバックエンドから使用:

def train(x, y, x_test, y_test): 
    x_train = np.array(x) 
    y_train = np.array(y) 
    print x_train.shape 
    print y_train.shape 
    model = Sequential() 
    model.add(Embedding(x_train.shape[0], output_dim=256)) 
    model.add(LSTM(128)) 
    model.add(Dropout(0.5)) 
    model.add(Dense(1, activation='sigmoid')) 
    model.compile(loss='binary_crossentropy', 
      optimizer='rmsprop', 
      metrics=['accuracy']) 
    model.fit(x_train, y_train, batch_size=16) 
    score = model.evaluate(x_test, y_test, batch_size=16) 
    print score 

が、私のネットワークが合わなかったと結果は次のとおりです。

Epoch 1/10 
1618/1618 [==============================] - 4s - loss: -1.6630 - acc: 0.0043  
Epoch 2/10 
1618/1618 [==============================] - 4s - loss: -2.5033 - acc: 0.0012   
Epoch 3/10 
1618/1618 [==============================] - 4s - loss: -2.6150 - acc: 0.0012   
Epoch 4/10 
1618/1618 [==============================] - 4s - loss: -2.6297 - acc: 0.0012   
Epoch 5/10 
1618/1618 [==============================] - 4s - loss: -2.5731 - acc: 0.0012    
Epoch 6/10 
1618/1618 [==============================] - 4s - loss: -2.6042 - acc: 0.0012   
Epoch 7/10 
1618/1618 [==============================] - 4s - loss: -2.6257 - acc: 0.0012   
Epoch 8/10 
1618/1618 [==============================] - 4s - loss: -2.6303 - acc: 0.0012   
Epoch 9/10 
1618/1618 [==============================] - 4s - loss: -2.6296 - acc: 0.0012   
Epoch 10/10 
1618/1618 [==============================] - 4s - loss: -2.6298 - acc: 0.0012   
283/283 [==============================] - 0s  
[-2.6199024279631482, 0.26501766742328875] 

私はこのトレーニングを行うと、取得したいです良い結果。

+0

10回の短いエポックを練習します。もっと訓練すればどうなりますか? –

+0

@JonasAdlerでも100エポックと同じ結果が得られます。 –

+0

@JonasAdlerどうやってテンソルフローで列車を走らせることができますか? –

答えて

1

負の損失は、巨大な赤い旗を投げるべきです。損失は​​常にゼロに近い正数でなければなりません。あなたは、あなたの損失は、私は目的が2クラス、分類問題であると仮定しなければならないbinary_crossentropyあるので、あなたのyの

y_train = [1,1,1,0,-1,-1,-1,0,1...,0,1] 

あると述べました。 yの値を見ると、-1,0と1があります。これは3つのクラスを示唆しています。大きな問題は、1と0しか持たないことです。データを修正する必要があります。私はデータについて何も知らないので、私はそれを2つのクラスに凝縮することはできません。 -1が負の損失の理由です。シグモイドアクティベーションは、0〜1の範囲のCDFに基づいているため、クラスはこの関数のいずれかの端に適合しなければなりません。


EDIT

以下のコメントで記述から、私は3クラス構造を示唆しています。以下今各可能な出力が別の列に格納されているカテゴリ値

from keras.utils import to_categorical 

y_train = np.random.randint(-1,2,(10)) 

print(y_train) 

[-1 0 -1 -1 -1 0 -1 1 1 0] 

print(to_categorical(y_train,num_classes=3)) 

[[ 0. 0. 1.] 
[ 1. 0. 0.] 
[ 0. 0. 1.] 
[ 0. 0. 1.] 
[ 0. 0. 1.] 
[ 1. 0. 0.] 
[ 0. 0. 1.] 
[ 0. 1. 0.] 
[ 0. 1. 0.] 
[ 1. 0. 0.]] 

に変換された出力データのサンプルです。あなたは、-1,0および1は-1 = [0. 0. 1.]0 = [1. 0. 0.]すなわちバイナリ値を割り当てられているかを確認することができ、かつ1 = [0. 1. 0.]

は今、あなただけの損失関数、出力ノードの数、および出力層

の活性化を更新する必要があります
model.add(Dense(3, activation='softmax')) 
model.compile(loss='categorical_crossentropy', 
     optimizer='rmsprop', 
     metrics=['accuracy']) 
+0

あなたの答えをありがとう。 1、0、-1は増加していないため、一部のメトリックでは減少し、yは1つのメトリックで83個のメトリックの結果となります。メトリックxの増加、メトリックyとzの減少、特定の単一のメトリックへの影響。どの損失関数を使用すべきですか? –

+0

私は@ EmadHelmiを更新しました – DJK

+0

私はあなたのノートを適用し、私はy_trainをカテゴリデータに変換し、自分の入力を変更しません。 'RMSprop'を私のオプティマイザとして、' 0.5 'を '学習率'として、上のコードで他のすべてのオプションを使って、私は損失率9を得ます!精度45% –

関連する問題