我正使用TensorFlow來訓練一個神經網絡。我初始化GradientDescentOptimizer的方式如下:
init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) mse = tf.reduce_mean(tf.square(out - out_)) train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
問題是我不知道如何為學習速率或衰減值設置更新規則。
如何在這里使用自適應學習率呢?
最佳解決辦法
首先,tf.train.GradientDescentOptimizer旨在對所有步驟中的所有變量使用恆定的學習率。 TensorFlow還提供現成的自適應優化器,包括tf.train.AdagradOptimizer和tf.train.AdamOptimizer,這些可以作為隨時可用的替代品。
但是,如果要通過其他普通漸變下降控制學習速率,則可以利用以下事實:tf.train.GradientDescentOptimizer構造函數的learning_rate參數可以是Tensor對象。這允許您在每個步驟中為學習速率計算不同的值,例如:
learning_rate = tf.placeholder(tf.float32, shape=[]) # ... train_step = tf.train.GradientDescentOptimizer( learning_rate=learning_rate).minimize(mse) sess = tf.Session() # Feed different values for learning rate to each training step. sess.run(train_step, feed_dict={learning_rate: 0.1}) sess.run(train_step, feed_dict={learning_rate: 0.1}) sess.run(train_step, feed_dict={learning_rate: 0.01}) sess.run(train_step, feed_dict={learning_rate: 0.01})
或者,您可以創建一個標量tf.Variable
來保存學習率,並在每次要更改學習率時進行分配
次佳解決辦法
Tensorflow提供了一種自動將指數衰減應用於學習速率張量的操作:tf.train.exponential_decay。有關正在使用的示例,請參閱this line in the MNIST convolutional model example。然后使用前文中的建議將此變量作為learning_rate參數提供給您的優化器。
要看的關鍵部分是:
# Optimizer: set up a variable that's incremented once per batch and # controls the learning rate decay. batch = tf.Variable(0) learning_rate = tf.train.exponential_decay( 0.01, # Base learning rate. batch * BATCH_SIZE, # Current index into the dataset. train_size, # Decay step. 0.95, # Decay rate. staircase=True) # Use simple momentum for the optimization. optimizer = tf.train.MomentumOptimizer(learning_rate, 0.9).minimize(loss, global_step=batch)
注意最小化global_step=batch
參數。這會告訴優化器在每次訓練時都會幫助您增加'batch'參數。