2017-06-19 6 views
0

J'ai implémenté ce modèle simple pour apprendre les réseaux neuronaux, il s'entraîne bien et donne la sortie qui a été donnée initialement.Python simple neurale forward XOR fonction

C'est là que je suis en quelque sorte perdu, dans l'exemple de la reconnaissance de la fonction XOR je voudrais juste pouvoir le tester, pas l'entraîner. Il semble que toutes les lectures en ligne concernent la formation et s'arrêtent là. Cela signifie-t-il que pour chaque nouvelle entrée, le modèle doit recalculer et entraîner l'ensemble? Y a-t-il quelque chose à voir avec les poids? Comment procéderiez-vous pour que le modèle fonctionne «en direct» et que vous preniez de nouveaux commentaires dans le cadre de ses commentaires en direct et de sa formation périodique continue?

Merci

import numpy as np 

def nonlin(x, deriv=False): 
    if(deriv==True): 
     return x*(1-x) 

    return 1/(1+np.exp(-x)) 

#4x2 
x = np.array([[0,0],[0,1],[1,0],[1,1]]) 
print (x) 

#1x4 
y = np.array([[0],[1],[1],[0]]) 

np.random.seed(1) 

syn0 = 2*np.random.random((2,4))-1 
print (syn0) 

syn1 = 2*np.random.random((4,1))-1 

for j in range(60000): 

    l0 = x; 
    l1 = nonlin(np.dot(l0,syn0)) 
    l2 = nonlin(np.dot(l1,syn1)) 

    l2_error = y - l2 

    l2_delta = l2_error*nonlin(l2, deriv=True) 

    l1_error = l2_delta.dot(syn1.T) 

    l1_delta = l1_error * nonlin(l1,deriv=True) 

    syn1 += l1.T.dot(l2_delta) 
    syn0 += l0.T.dot(l1_delta) 

    if(j % 10000) ==0: 
     print ("Error:" + str(np.mean(np.abs(l2_error)))) 

print ("Output after training") 
print (syn0) 
print (syn1) 
print (l2) 
+1

Je ne comprends pas quel est le problème? Vous pouvez facilement tester le réseau en fournissant une entrée (par exemple (0,1)) et voir ce qui s'écoule du réseau (quelque chose près de 1). –

+1

Peut-être que certains exemples/pseudo-code nous aideraient à comprendre ce que vous essayez d'accomplir? – matt2000

+0

Cela peut sembler stupide mais c'est exactement ce que je n'arrive pas à comprendre ... Dois-je utiliser le poids donné par le réseau, je ne vois pas ce qu'il y a dans la fonction qui va prendre une entrée et la tester dans le réseau ? – matel

Répondre

0

Il vous suffit de prendre en compte le code qui en fait le calcul Neural Network, voici votre code modifié ainsi:

import numpy as np 

def nonlin(x, deriv=False): 
    if(deriv==True): 
     return x*(1-x) 

    return 1/(1+np.exp(-x)) 


#4x2 
x = np.array([[0,0],[0,1],[1,0],[1,1]]) 
print ("x=",x) 

#1x4 
y = np.array([[0],[1],[1],[0]]) 
print ("y=",y) 

np.random.seed(1) 

syn0 = 2*np.random.random((2,4))-1 
print (syn0) 

syn1 = 2*np.random.random((4,1))-1 

def NN(x): 
    l0 = x; 
    l1 = nonlin(np.dot(l0,syn0)) 
    l2 = nonlin(np.dot(l1,syn1)) 
    return (l0,l1,l2) 

for j in range(60000): 

    l0,l1,l2 = NN(x) 

    l2_error = y - l2 

    l2_delta = l2_error*nonlin(l2, deriv=True) 

    l1_error = l2_delta.dot(syn1.T) 

    l1_delta = l1_error * nonlin(l1,deriv=True) 

    syn1 += l1.T.dot(l2_delta) 
    syn0 += l0.T.dot(l1_delta) 

    if(j % 10000) ==0: 
     print ("Error:" + str(np.mean(np.abs(l2_error)))) 

print ("Output after training") 
print ("trained l0 weights:",syn0) 
print ("trained l1 weights:",syn1) 
l0,l1,l2 = NN(x) 
print ("NN(",x,") == ",l2) 

Ici NN (x) est le fonction qui effectue un calcul net neuronal. Il retourne le vecteur d'entrée, la couche cachée et les valeurs de la couche de sortie dans un tuple. Vous pouvez coder une fonction distincte pour l'interface de nettoyage:

def NNout(x,syn0,syn1): 
    l0 = x; 
    l1 = nonlin(np.dot(l0,syn0)) 
    l2 = nonlin(np.dot(l1,syn1)) 
    return l2