2017-01-11 1 views
1

J'ai de la difficulté à essayer d'enseigner à un réseau de neurones la fonction logique XOR. J'ai déjà formé le réseau avec des résultats réussis en utilisant la tangente hyperbolique et ReLU comme fonctions d'activation (en ce qui concerne le ReLU, je sais que ce n'est pas approprié pour ce genre de problème, mais je voulais quand même le tester). Pourtant, je ne peux pas le faire fonctionner avec le logistic function. Ma définition de la fonction est:Mauvaise classification des fonctions logistiques

def logistic(data): 
    return 1.0/(1.0 + np.exp(-data)) 

et son dérivé:

def logistic_prime(data): 
    output = logistic(data) 
    return output * (1.0 - output) 

np est le nom donné au package importé NumPy. Comme la logique XOR utilise des 0 et des 1, la fonction logistique devrait être une fonction d'activation appropriée. Cependant, les résultats obtenus sont proches de 0,5 dans tous les cas, c'est-à-dire que toute combinaison d'entrée de 0 et de 1 produit une valeur proche de 0,5. Y a-t-il une erreur dans ce que je dis?

N'hésitez pas à me demander plus de contexte ou plus de code. Merci d'avance.

+2

Vous pouvez affecter la sortie de 'logistic (data)' à une variable locale dans 'logistic_prime' et l'utiliser deux fois, plutôt que d'appeler deux fois la fonction. Cela n'a rien à voir avec votre problème, mais au moins l'entraînement échouerait plus rapidement. – jez

Répondre

1

J'ai eu le même problème que vous. Le problème se produit lorsque les données ne peuvent pas être divisées par un hyperplan linéaire. Essayez de former les données:

X = [[-1,0],[0,1],[1,0],[0,-1]] 
Y = [1,0,1,0] 

si vous dessinez cela sur une coordonnée, alors vous infliger une amende n'est pas linéaire divisibles. Entraînez-vous à la logistique, les paramètres sont tous proches de 0 et le résultat est proche de 0.5.

Un autre exemple linéairement divisible est l'utilisation Y = [1,1,0,0] et le travail logistique.