Je veux utiliser Chainer. Mais je ne suis pas sur. Oui, commençons par apprendre XOR avec un Perceptron multicouche.
** * Cet article est écrit sur l'hypothèse que l'environnement dans lequel Chainer peut être utilisé est en place. ** **
** Code utilisé dans cet article **
# Prepare dataset
source = [[0, 0], [1, 0], [0, 1], [1, 1]]
target = [[0], [1], [1], [0]]
dataset = {}
dataset['source'] = np.array(source, dtype=np.float32)
dataset['target'] = np.array(target, dtype=np.float32)
Le modèle utilisé cette fois est de 2 entrées et 1 sortie.
N = len(source) # train data size
in_units  = 2   #Nombre d'unités dans la couche d'entrée
n_units   = 2   #Nombre d'unités de calque masquées
out_units = 1   #Nombre d'unités dans la couche de sortie
#Définition du modèle
model = chainer.Chain(l1=L.Linear(in_units, n_units),
                      l2=L.Linear(n_units , out_units))
def forward(x, t):
    h1 = F.sigmoid(model.l1(x))
    return model.l2(h1)
Répétez jusqu'à ce que l'erreur d'apprentissage soit inférieure à 0,00001 ou que l'époque soit supérieure ou égale à n_epoch.
# Setup optimizer
optimizer = optimizers.Adam()
optimizer.setup(model)
# Learning loop
loss_val = 100
epoch = 0
while loss_val > 1e-5:
    # training
    x = chainer.Variable(xp.asarray(dataset['source'])) #source
    t = chainer.Variable(xp.asarray(dataset['target'])) #target
    
    model.zerograds()       #Zéro initialisation du gradient
    y    = forward(x, t)    #Propagation vers l'avant
    loss = F.mean_squared_error(y, t) #Erreur quadratique moyenne
    
    loss.backward()              #Erreur de propagation de retour
    optimizer.update()           #optimisation
    
    #Afficher le résultat en chemin
    if epoch % 1000 == 0:
        #Calculer l'erreur et corriger le taux de réponse
        loss_val = loss.data
        print 'epoch:', epoch
        print 'x:\n', x.data
        print 't:\n', t.data
        print 'y:\n', y.data
        print('train mean loss={}'.format(loss_val)) #Erreur d'entraînement,Taux de réponse correct
        print ' - - - - - - - - - '
    
    # n_Il se termine quand il devient époque ou plus
    if epoch >= n_epoch:
        break
    epoch += 1
#Enregistrer le modèle et l'optimiseur
print 'save the model'
serializers.save_npz('xor_mlp.model', model)
print 'save the optimizer'
serializers.save_npz('xor_mlp.state', optimizer)
J'apprends comme un problème de régression. Lors d'une prédiction, il est nécessaire de définir un seuil tel que 1 pour 0,5 ou plus et 0 pour moins de 0,5.
$ python train_xor.py --gpu 1
epoch: 0
x:
[[ 0.  0.]
 [ 1.  0.]
 [ 0.  1.]
 [ 1.  1.]]
t:
[[ 0.]
 [ 1.]
 [ 1.]
 [ 0.]]
y:
[[-0.62479508]  #Je veux que tu te rapproche de 0
 [-0.85900736]  #Je veux que tu te rapproche de 1
 [-0.4117983 ]  #Je veux que tu te rapproche de 1
 [-0.62129647]] #Je veux que tu te rapproche de 0
train mean loss=1.55636525154  #Erreur d'entraînement(Je veux que tu sois plus petit)
 - - - - - - - - -
epoch: 1000
x:
[[ 0.  0.]
 [ 1.  0.]
 [ 0.  1.]
 [ 1.  1.]]
t:
[[ 0.]
 [ 1.]
 [ 1.]
 [ 0.]]
y:
[[ 0.39130747]
 [ 0.40636665]
 [ 0.50217605]
 [ 0.52426183]]
train mean loss=0.257050335407
 - - - - - - - - -
...
 - - - - - - - - -
epoch: 8000
x:
[[ 0.  0.]
 [ 1.  0.]
 [ 0.  1.]
 [ 1.  1.]]
t:
[[ 0.]
 [ 1.]
 [ 1.]
 [ 0.]]
y:
[[ 0.00557911]
 [ 0.98262894]
 [ 0.98446763]
 [ 0.02371788]]
train mean loss=0.000284168170765
 - - - - - - - - -
epoch: 9000
x:
[[ 0.  0.]
 [ 1.  0.]
 [ 0.  1.]
 [ 1.  1.]]
t:
[[ 0.]
 [ 1.]
 [ 1.]
 [ 0.]]
y:
[[  5.99622726e-05] #Approché 0
 [  9.99812365e-01] #Approché 1
 [  9.99832511e-01] #Approché 1
 [  2.56299973e-04]] #Approché 0
train mean loss=3.31361960093e-08
 - - - - - - - - -
save the model
save the optimizer

Recommended Posts