2017-08-01 5 views
1

J'ai une liste de valeurs, allant de 15000 à 25000. Je dois les séparer en deux catégories, de sorte que (environ) 20000 finira dans la catégorie 1 et le reste dans la catégorie 2. J'ai compris que l'activation du sigmoïde devrait fonctionner pour cela. J'utilise les couches suivantes dans keras pour que:Couche sigmoïde dans Keras

modèle

= séquentiel()

model.add(Dense(1 , input_dim =1)) 
model.add(Activation('sigmoid')) 
model.add(Dense(2 , init='normal' , activation = 'softmax')) 
model.compile(loss='mean_absolute_error', optimizer='rmsprop') 
model.fit(X_train, y_train, validation_data=(X_test, y_test),epochs=10,batch_size=200,verbose=2) 

Cependant, quand je lance le modèle pour mes affaires d'échantillons, toutes les valeurs se retrouvent dans la catégorie 2. Comment puis-je améliorer cela?

+0

Avez-vous entraîné votre modèle? –

+0

Il serait utile si vous postez votre code entier. –

+0

besoin de voir 'model.complie()', 'model.fit()', et un échantillon des données pour vos valeurs X et Y – DJK

Répondre

1

Si vous avez une liste de valeurs comprises entre 15 000 et 25 000, alors sigmoid va vous donner près de 1,0 pour toutes ces valeurs. sigmoïde tout squashes pour s'adapter entre 0 et 1 donc de très grandes valeurs comme qui vont asymptotiquement approche 1. rapide et essai sale montre ceci:

>>> import math 
>>> def s(x): 
...  return 1.0/(1.0+math.exp(-x)) 
... 
>>> s(15000) 
1.0 
>>> s(25000) 
1.0 

Soit normaliser les valeurs, qui ne devrait pas être difficile puisque vous savez la plage ou utilisez une autre fonction d'activation. Question ambiguë quand vous indiquez que 20000 d'entre eux finiront dans une catégorie et le reste dans l'autre, donc si vous voulez dire que vous avez entre 15000 et 25000 valeurs (ne pas se référer aux valeurs des valeurs) qui doivent être classés, puis Nevermind

0

commentaire de LucidMonkey n'explique pas pourquoi, même après la descente de gradient en cours d'exécution, tous vos exemples sont la catégorie 2.

Le problème est que pour les nombres de magnitude très grand (comme vôtre), la dérivée de sigmoïde est effectivement nulle. En descente en dégradé, vous faites des pas vers le minimum global dont les tailles sont régies par la taille des dérivées dans votre modèle. Si les dérivées sont nulles, les étapes seront également nulles et votre modèle sera bloqué. Ainsi, même après la descente du dégradé, vous resterez dans la région où la fonction sigmoïde est évaluée à ~ 1 sur chaque exemple. Normaliser vos données pour signifier 1 et la variance 0 avant que la couche sigmoïde ne mette l'entrée dans une plage où la dérivée de sigmoïde est non-nulle, et votre algorithme de descente de gradient sera en mesure d'optimiser.