2017-08-22 4 views
2

J'ai une donnée d'entrée comme ceci:train un modèle en utilisant LSTM et 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] 

est un tableau de arryas qui chaque tableau a une taille de 83 et y_train est le lable pour chacun de ces tableaux. alors len(x_train) est égal à len(y_train). i d'occasion à partir keras et backend Théano pour la formation sur ces données avec ce code:

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 

mais mon réseau ne correspondait pas et le résultat est:

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] 

que je veux faire cette formation et obtenir un bon résultat.

+0

Vous ne vous entraînez que pendant 10 courtes époques. Que se passe-t-il si vous vous entraînez plus? –

+0

@JonasAdler même avec 100 époques je reçois le même résultat. –

+0

@JonasAdler Comment puis-je faire ce train avec tensorflow seulement? –

Répondre

1

Une perte négative devrait jeter un drapeau rouge ÉNORME. La perte devrait toujours être un nombre positif, approchant zéro. Vous avez déclaré votre de y sont

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

Depuis votre perte est binary_crossentropy Je dois supposer que l'objectif est une classe 2, problème de classification. Quand vous regardez les valeurs de y que vous avez -1,0, et 1. Qui suggère 3 classes. Gros problème, vous ne devriez avoir que 1 et 0. Vous devez corriger vos données. Je ne sais rien sur les données, donc je ne peux pas aider à le condenser en deux classes. Les -1 sont la raison de la perte négative. L'activation du sigmoïde est basée sur un CDF allant de 0 à 1, donc vos classes doivent s'adapter à chaque extrémité de cette fonction.


EDIT

de la description dans les commentaires ci-dessous, je suggère une structure 3 de classe. Voici un exemple de données de sortie converties en valeurs catégoriques

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.]] 

maintenant chaque sortie possible est mémorisée dans une colonne séparée. Vous pouvez voir comment -1,0 et 1 sont affectées d'une valeur binaire c.-à--1 = [0. 0. 1.], 0 = [1. 0. 0.] et 1 = [0. 1. 0.]

Maintenant, vous avez juste besoin de mettre à jour la fonction de perte, le nombre de noeuds de sortie, et l'activation de la couche de sortie

model.add(Dense(3, activation='softmax')) 
model.compile(loss='categorical_crossentropy', 
     optimizer='rmsprop', 
     metrics=['accuracy']) 
+0

Merci pour votre réponse. 1, 0, -1 dans mes données sont pour l'augmentation non modifiée et diminuer dans certaines métriques et le y est le résultat de ces 83 mesures sur une seule mesure. Je veux dire que l'augmentation de la métrique x et la diminution de la métrique y et z pas changé en métrique t, m comment l'effet sur une mesure unique spécifique. quelle fonction de perte devrais-je utiliser? –

+0

J'ai mis à jour @EmadHelmi – DJK

+0

J'ai obtenu ma réponse J'applique vos notes et je convertis mon y_train en données catégoriques et je ne change pas mon entrée. avec 'RMSprop' comme optimiseur et avec' 0.5' comme 'taux d'apprentissage 'et toutes les autres options dans mon code ci-dessus, j'obtiens le taux de perte 9 !!! et précision 45% –