Il seguente codice è stato scritto per imparare la funzione XOR, ma circa la metà delle volte che la rete non apprende e la perdita dopo ogni epoca rimane la stessa.tflearn/tensorflow non apprende xor
train_f = [[0, 0], [0, 1], [1, 0], [1, 1]]
train_c = [[0], [1], [1], [0]]
test_f = train_f
test_c = train_c
import tensorflow as tf
import tflearn
X = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
Y_xor = [[0.], [1.], [1.], [0.]]
# Graph definition
with tf.Graph().as_default():
# Building a network with 2 optimizers
net = tflearn.input_data(shape=[None, 2])
# Nand operator definition
net = tflearn.fully_connected(net, 2, activation='relu')
net = tflearn.fully_connected(net, 2, activation='relu')
net = tflearn.fully_connected(net, 1, activation='sigmoid')
regressor = tflearn.regression(net, optimizer='adam', learning_rate=0.005, loss="mean_square",)
# Training
m = tflearn.DNN(regressor)
m.fit(X, Y_xor, n_epoch=256, snapshot_epoch=False)
# Testing
print("Testing XOR operator")
print("0 xor 0:", m.predict([[0., 0.]]))
print("0 xor 1:", m.predict([[0., 1.]]))
print("1 xor 0:", m.predict([[1., 0.]]))
print("1 xor 1:", m.predict([[1., 1.]]))
A volte ottengo risultati corretti come questo:
Testing XOR operator
0 xor 0: [[0.1487255096435547]]
0 xor 1: [[0.9297153949737549]]
1 xor 0: [[0.9354135394096375]]
1 xor 1: [[0.1487255096435547]]
Ma spesso questo:
Testing XOR operator
0 xor 0: [[0.4999997615814209]]
0 xor 1: [[0.5000002384185791]]
1 xor 0: [[0.4999997615814209]]
1 xor 1: [[0.5000001788139343]]
La mia rete 2x2x1 dovrebbe essere in grado di eseguire XOR, e c'è anche una certa prova che suggerisce che questa rete dovrebbe sempre convergere http://www.ncbi.nlm.nih.gov/pubmed/12662805
Ho anche provato a cambiare i livelli relu in sigmoid, eseguire le iterazioni 2048 e creare reti 4x4x1 e 6x6x1, ma a volte lo stesso problema si verifica ancora.
Potrebbe esserci qualcosa di sbagliato nel modo in cui i pesi sono inizializzati? Come posso usare tflearn per avere una rete neurale per imparare la funzione xor?
Prova semplice SGD (invece di Adam), gioca con il tasso di apprendimento ... – sascha
Sfortunatamente, SGD non aiuta (con nessuna delle funzioni di attivazione) – rdezbolcom