Hinweise zur Verwendung von TensorFlow unter Bash unter Ubuntu unter Windows Ich kann also TensorFlow verwenden, weiß aber nicht, wie ich es verwenden soll.
Es gibt eine Bibliothek namens TFLearn, die die Verwendung von TensorFlow erleichtert, daher habe ich diese ebenfalls aufgenommen.
$ pip install tflearn
Beim Betrachten des Beispielcodes gab es ein Programm namens logisch.py, das logische Operationen zu lernen scheint, also habe ich es dieses Mal versucht.
Da logisch.py eine Sammlung des Lernens mehrerer logischer Operationen ist, habe ich versucht, nur die relevanten Teile zu extrahieren.
import tensorflow as tf
import tflearn
# Logical OR operator
X = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
Y = [[0.], [1.], [1.], [1.]]
# Graph definition
with tf.Graph().as_default():
g = tflearn.input_data(shape=[None, 2])
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 1, activation='sigmoid')
g = tflearn.regression(g, optimizer='sgd', learning_rate=2.,
loss='mean_square')
# Model training
m = tflearn.DNN(g)
m.fit(X, Y, n_epoch=100, snapshot_epoch=False)
# Test model
print("Testing OR operator")
print("0 or 0:", m.predict([[0., 0.]]))
print("0 or 1:", m.predict([[0., 1.]]))
print("1 or 0:", m.predict([[1., 0.]]))
print("1 or 1:", m.predict([[1., 1.]]))
Es ist mein erster Blick, aber irgendwie verstehe ich die Bedeutung. Als dies getan wurde, war das Ergebnis wie folgt.
--
Training Step: 100 | total loss: 0.00227
| SGD | epoch: 100 | loss: 0.00227 -- iter: 4/4
--
Testing OR operator
0 or 0: [[0.031054211780428886]]
0 or 1: [[0.9823662638664246]]
1 or 0: [[0.9786670207977295]]
1 or 1: [[0.9999874830245972]]
Wenn Sie es digital als 0 oder 1 betrachten, haben Sie OR gelernt.
Übrigens sind im ersten Code 128 Zwischenschichten durch zwei Schichten verbunden. Ich habe versucht, die mittlere Ebene zu löschen, weil ich die mittlere Ebene nicht wie Lernen ODER brauche. Stattdessen habe ich die Anzahl der Lernvorgänge auf 2000 erhöht.
import tensorflow as tf
import tflearn
# Logical OR operator
X = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
Y = [[0.], [1.], [1.], [1.]]
# Graph definition
with tf.Graph().as_default():
g = tflearn.input_data(shape=[None, 2])
g = tflearn.fully_connected(g, 1, activation='sigmoid')
g = tflearn.regression(g, optimizer='sgd', learning_rate=2., loss='mean_square')
# Model training
m = tflearn.DNN(g)
m.fit(X, Y, n_epoch=2000, snapshot_epoch=False)
# Test model
print("Testing OR operator")
print("0 or 0:", m.predict([[0., 0.]]))
print("0 or 1:", m.predict([[0., 1.]]))
print("1 or 0:", m.predict([[1., 0.]]))
print("1 or 1:", m.predict([[1., 1.]]))
Das Ergebnis davon.
--
Training Step: 2000 | total loss: 0.00098
| SGD | epoch: 2000 | loss: 0.00098 -- iter: 4/4
--
Testing OR operator
0 or 0: [[0.041201911866664886]]
0 or 1: [[0.9756871461868286]]
1 or 0: [[0.9764388799667358]]
1 or 1: [[0.9999741315841675]]
Es scheint, dass ich ODER richtig lernen konnte.
Dann habe ich versucht UND zu lernen. Der Code ist der gleiche wie das Ändern des Lehrersignals in UND.
import tensorflow as tf
import tflearn
# Logical AND operator
X = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
Y = [[0.], [0.], [0.], [1.]]
# Graph definition
with tf.Graph().as_default():
g = tflearn.input_data(shape=[None, 2])
g = tflearn.fully_connected(g, 1, activation='sigmoid')
g = tflearn.regression(g, optimizer='sgd', learning_rate=2., loss='mean_square')
# Model training
m = tflearn.DNN(g)
m.fit(X, Y, n_epoch=2000, snapshot_epoch=False)
# Test model
print("Testing AND operator")
print("0 and 0:", m.predict([[0., 0.]]))
print("0 and 1:", m.predict([[0., 1.]]))
print("1 and 0:", m.predict([[1., 0.]]))
print("1 and 1:", m.predict([[1., 1.]]))
Das Ergebnis davon.
--
Training Step: 2000 | total loss: 0.00137
| SGD | epoch: 2000 | loss: 0.00137 -- iter: 4/4
--
Testing AND operator
0 and 0: [[8.591794176027179e-05]]
0 and 1: [[0.04014528915286064]]
1 and 0: [[0.03964542970061302]]
1 and 1: [[0.9525935053825378]]
Sicher wurde es UND.
Da OR und AND linear getrennt werden können, ist eine Zwischenschicht nicht erforderlich, XOR kann jedoch nicht linear getrennt werden, sodass eine Zwischenschicht erforderlich ist. Im Beispielcode werden jedoch NAND und OR trainiert und kombiniert und verwendet, anstatt XOR direkt zu trainieren.
Ich wusste nicht, warum ich es nicht direkt trainierte, also schrieb ich einen Code, um XOR direkt zu trainieren.
import tensorflow as tf
import tflearn
# Logical XOR operator
X = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
Y = [[0.], [1.], [1.], [0.]]
# Graph definition
with tf.Graph().as_default():
g = tflearn.input_data(shape=[None, 2])
g = tflearn.fully_connected(g, 2, activation='sigmoid')
g = tflearn.fully_connected(g, 1, activation='sigmoid')
g = tflearn.regression(g, optimizer='sgd', learning_rate=2., loss='mean_square')
# Model training
m = tflearn.DNN(g)
m.fit(X, Y, n_epoch=2000, snapshot_epoch=False)
# Test model
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.]]))
Dies ließ den Lehrer nur XOR signalisieren und fügte zwei Zwischenschichten hinzu. Als ich das tat, stellte sich heraus, dass es so war.
--
Training Step: 2000 | total loss: 0.25000
| SGD | epoch: 2000 | loss: 0.25000 -- iter: 4/4
--
Testing XOR operator
0 xor 0: [[0.5000224709510803]]
0 xor 1: [[0.5000009536743164]]
1 xor 0: [[0.49999910593032837]]
1 xor 1: [[0.4999775290489197]]
Das kann ich nicht lernen Als ich googelte, wurde die nächste Seite abgefangen. Es ist die übliche Stack Overflow-Site.
tflearn / tensorflow does not learn xor
Demnach scheint bei der Standardeinstellung der Anfangswert des Gewichts mit einer Standardabweichung von 0,02 ziemlich eng zu sein. Daher scheint es besser, den Bereich der Anfangsgewichtswerte von -1 bis 1 zu erweitern.
import tensorflow as tf
import tflearn
# Logical XOR operator
X = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]
Y = [[0.], [1.], [1.], [0.]]
# Graph definition
with tf.Graph().as_default():
tnorm = tflearn.initializations.uniform(minval=-1.0, maxval=1.0)
g = tflearn.input_data(shape=[None, 2])
g = tflearn.fully_connected(g, 2, activation='sigmoid', weights_init=tnorm)
g = tflearn.fully_connected(g, 1, activation='sigmoid', weights_init=tnorm)
g = tflearn.regression(g, optimizer='sgd', learning_rate=2., loss='mean_square')
# Model training
m = tflearn.DNN(g)
m.fit(X, Y, n_epoch=2000, snapshot_epoch=False)
# Test model
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.]]))
Das Ergebnis der Ausführung durch Ändern der Einstellung des Anfangswertes des Gewichts auf diese Weise.
--
Training Step: 2000 | total loss: 0.00131
| SGD | epoch: 2000 | loss: 0.00131 -- iter: 4/4
--
Testing XOR operator
0 xor 0: [[0.03527239337563515]]
0 xor 1: [[0.9663047790527344]]
1 xor 0: [[0.9607295393943787]]
1 xor 1: [[0.03082425333559513]]
Ich konnte XOR sicher lernen.
Es ist leicht zu verstehen, da der Code der Idee des neuronalen Netzwerks entspricht. Es ist möglicherweise nicht möglich, TensorFlow zu optimieren, aber für diejenigen, die nicht wissen, was TensorFlow überhaupt kann, warum nicht mit TF Learn beginnen?
Recommended Posts