Ich lerne, wie man mit Optimizern ein Modell im Tensor Flow trainiert. Also baute ich ein lineares Modell, erstellte einen Spielzeugdatensatz und trainierte das lineare Modell mit AdamOptimizer
und GradientDescentOptimizer
.Warum funktioniert Adam Optimizer nicht?
Das ist mein Auszug:
# Training a linear model with Adam optimizer
import tensorflow as tf
import numpy as np
# Training dataset
Xs_ = np.random.random(48).reshape(12, 4)
Yt_ = np.random.random(12).reshape(12, 1)
Xs2_ = np.array([1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
13, 14, 15, 16]).reshape(4, 4)
Yt2_ = np.array([1, 2, 3, 4]).reshape(4, 1)
# inference
Xs = tf.placeholder(shape=(None, 4), dtype=tf.float32)
W = tf.Variable(np.zeros((4,1), dtype=np.float32))
b = tf.Variable(np.ones((1, 1), dtype=np.float32))
Ys = tf.add(tf.matmul(Xs, W), b)
Yt = tf.placeholder(shape=(None, 1), dtype=tf.float32)
# loss
loss = tf.reduce_mean(tf.squared_difference(Yt, Ys))
# training
optimizer = tf.train.AdamOptimizer(learning_rate=1e-4, beta1=0.99, epsilon=0.1)
optimizer2 = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(loss)
train2 = optimizer2.minimize(loss)
# Executing the graph with Adam Optimizer
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
feed_dict = {Yt: Yt2_, Xs: Xs2_}
sess.run(train, feed_dict)
print "Adam trained vars (W, b)", sess.run([W, b], feed_dict)
# Executing the graph with Gradient Descent Optimizer
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
feed_dict = {Yt: Yt2_, Xs: Xs2_}
sess.run(train2, feed_dict)
print "GD trained vars (W, b)", sess.run([W, b], feed_dict)
Und hier ist der Ausgang Ich sehe:
Adam trained vars (W, b) [array([[ 9.07433059e-05],
[ 9.14905831e-05],
[ 9.21262108e-05],
[ 9.26734720e-05]], dtype=float32), array([[ 1.00004864]], dtype=float32)]
GD trained vars (W, b) [array([[ 0.31 ],
[ 0.34 ],
[ 0.37 ],
[ 0.39999998]], dtype=float32), array([[ 1.02999997]], dtype=float32)]
ich mit unterschiedlichen Lernraten experimentiert, Betas und Epsilons; aber irgendwie aktualisiert AdamOptimizer nicht die Variablen (W
und b
).
Ich sah auch, dass ein paar Leute Gradienten separat berechnen und dann auf die Variablen anwenden, anstatt direkt AdamOptimizer().minimize(_loss_function_)
zu verwenden.
Ich bin neu bei TensorFlow und bin mir nicht sicher, ob mir etwas fehlt. Bitte geben Sie einige Einblicke. Vielen Dank!
In beiden Fällen führen Sie nur einen Schritt des Gradientenabfalls durch. Adam hat standardmäßig ein großes Momentum (Trägheit), also dauert es eine Weile, um zu beschleunigen. SGD hingegen beschleunigt sofort, da es keine Dynamik hat. Führen Sie weitere Iterationen aus und Sie werden sehen, dass W entsprechend aktualisiert wird. –
Danke, das war hilfreich! Bitte fügen Sie dies als Antwort hinzu. – RahulDamineni