将自定义学习速率应用于Tensorflow中的变量

时间:2017-10-09 12:41:40

标签: python tensorflow deep-learning

在Tensorflow中,在我获得损失项之后,我将其提供给优化器,并将必要的区分和更新项添加到计算图中:

global_counter = tf.Variable(0, dtype=DATA_TYPE, trainable=False)
learning_rate = tf.train.exponential_decay(
    INITIAL_LR,  # Base learning rate.
    global_counter,  # Current index into the dataset.
    DECAY_STEP,  # Decay step.
    DECAY_RATE,  # Decay rate.
    staircase=True)
optimizer = tf.train.MomentumOptimizer(learning_rate, 0.9).minimize(network.finalLoss, global_step=global_counter)
feed_dict = {TRAIN_DATA_TENSOR: samples, TRAIN_LABEL_TENSOR: labels}
results = sess.run([optimizer], feed_dict=feed_dict)

我想对此过程进行一些小修改。我想以不同的方式缩放learning_rate我网络中的每个不同参数。例如,在网络中设置AB两个不同的可训练参数,并让dL/dAdL/dB参数的偏导数与损失相关。动量优化器将变量更新为:

   Ma <- 0.9*Ma + learning_rate*dL/dA
   A <- A - Ma

   Mb <- 0.9*Mb + learning_rate*dL/dB
   B <- B - Mb

我想将其修改为:

   Ma <- 0.9*Ma + ca*learning_rate*dL/dA
   A <- A - Ma

   Mb <- 0.9*Mb + cb*learning_rate*dL/dB
   B <- B - Mb

cacb是不同参数的特殊学习率表。据我了解,Tensorflow有compute_gradientsapply_gradients方法,我们可以调用这些方法,但文档不清楚如何使用它们。任何帮助将非常感激。

2 个答案:

答案 0 :(得分:2)

计算渐变:

 self.gradients = tf.gradients(self.loss, tf.trainable_variables())

现在,您可以使用sess.run([model.gradients], feed_dict)

访问渐变

假设您已将learning_rate声明为tf.Variable(),您可以使用以下代码分配学习率:

sess.run(tf.assign(model.lr, args.learning_rate * (args.decay_rate ** epoch)))

以上代码只是一个例子。您可以修改它以用于您的目的。

答案 1 :(得分:0)

自定义学习率, tensorflow 非常容易处理。

learning_rate = tf.Variable(INITIAL_LR,trainable = False,name =&#34; lr&#34;)

并说l1和l2是两种不同的学习率:

l1 = ca * learning_rate
l2 = cb * learning_rate

你可以对学习率做任何类型的数学操作,并以这种方式应用它:

optimizer=tf.train.MomentumOptimizer(l1,0.9).minimize(network.finalLoss, global_step=global_counter)

关于你的问题:你想要的是不同层的实际不同的渐变,例如 L1层(包含Ma的可训练变量) L2 (包含Mb的可训练变量)

global_counter = tf.Variable(0, dtype=DATA_TYPE, trainable=False)

learning_rate = tf.train.exponential_decay(
INITIAL_LR,  # Base learning rate.
global_counter,  # Current index into the dataset.
DECAY_STEP,  # Decay step.
DECAY_RATE,  # Dec
staircase=True)

optimizer1 = tf.train.MomentumOptimizer(ca * learning_rate, 0.9).minimize(network.finalLoss, global_step=global_counter , var_list= L1)
optimizer2 = tf.train.MomentumOptimizer(cb * learning_rate, 0.9).minimize(network.finalLoss, global_step=global_counter , var_list= L2)
optimizer  = tf.group(optimizer1 , optimizer2)

feed_dict = {TRAIN_DATA_TENSOR: samples, TRAIN_LABEL_TENSOR: labels}
results = sess.run([optimizer], feed_dict=feed_dict)

您可以找到上述代码here

的优化版本

请注意,如果您可以通过 tf.assign 指定学习率,则返回学习率的参考,而优化器需要一个浮动学习值类型,可能/应该抛出错误