自定义学习率调度器TF2和Keras

丹尼尔·科尼欣(Danil Kononyhin)

我正在尝试编写自定义学习速率调度程序:余弦退火和预热。但是我既不能在Keras中使用它,也不能在Tensorflow中使用它。下面是代码:

import tensorflow as tf
import numpy as np


def make_linear_lr(min_lr, max_lr, number_of_steps):
    def gen_lr(step):
        return (max_lr - min_lr) / number_of_steps * step + min_lr
    return gen_lr

def make_cosine_anneal_lr(learning_rate, alpha, decay_steps):
    def gen_lr(global_step):
        global_step = min(global_step, decay_steps)
        cosine_decay = 0.5 * (1 + np.cos(np.pi * global_step / decay_steps))
        decayed = (1 - alpha) * cosine_decay + alpha
        decayed_learning_rate = learning_rate * decayed
        return decayed_learning_rate
    return gen_lr

def make_cosine_annealing_with_warmup(min_lr, max_lr, number_of_steps, alpha, decay_steps):
    gen_lr_1 = make_linear_lr(min_lr, max_lr, number_of_steps)
    gen_lr_2 = make_cosine_anneal_lr(max_lr, alpha, decay_steps)
    def gen_lr(global_step):
        if global_step < number_of_steps:
            return gen_lr_1(global_step)
        else:
            return gen_lr_2(global_step - number_of_steps)
        
    return gen_lr

class CosineAnnealingWithWarmUP(tf.keras.optimizers.schedules.LearningRateSchedule):
  def __init__(self, min_lr, max_lr, number_of_steps, alpha, decay_steps):
    super(CosineAnnealingWithWarmUP, self).__init__()
    self.gen_lr_ca =  make_cosine_annealing_with_warmup(min_lr, max_lr, number_of_steps, alpha, decay_steps)
  def __call__(self, step):
    return tf.cast(self.gen_lr_ca(step), tf.float32)

learning_rate_fn = CosineAnnealingWithWarmUP(.0000001, 0.01, 10_000, 0, 150_000)
optimizer=tf.keras.optimizers.SGD(
    learning_rate=learning_rate_fn, 
    momentum=0.95)

我在TensorFlow中使用此功能来训练我的模型:

def get_model_train_step_function(model, optimizer, vars_to_fine_tune, batch_size):
  @tf.function
  def train_step_fn(image_tensors,
                    groundtruth_boxes_list,
                    groundtruth_classes_list):
    shapes = tf.constant(batch_size * [[640, 640, 3]], dtype=tf.int32)
    model.provide_groundtruth(
        groundtruth_boxes_list=groundtruth_boxes_list,
        groundtruth_classes_list=groundtruth_classes_list)
    with tf.GradientTape() as tape:
      preprocessed_images = tf.concat(
          [model.preprocess(
              image_tensor
           )[0]
           for image_tensor in image_tensors], axis=0)
      prediction_dict = model.predict(preprocessed_images, shapes)
      losses_dict = model.loss(prediction_dict, shapes)
      total_loss = losses_dict['Loss/localization_loss'] + losses_dict['Loss/classification_loss']
      gradients = tape.gradient(total_loss, vars_to_fine_tune)
      optimizer.apply_gradients(zip(gradients, vars_to_fine_tune))
    return total_loss

  return train_step_fn 

当我尝试将其与TensorFlow一起使用时,在get_model_train_step_function中传递优化器-如果删除@ tf.function装饰器,则它可以工作。但它不适用于@ tf.function,错误显示:OperatorNotAllowedInGraphError:不允许将atf.Tensor用作Python bool:AutoGraph确实转换了此函数。这可能表明您正在尝试使用不受支持的功能。

我应该如何编写自定义学习率计划程序?另外,我想将此时间表与Keras一起使用。但这根本不起作用。

安德烈

您需要排除numpy调用,并用tensorflow运算符替换python条件(“ if”,“ min”):

def make_cosine_anneal_lr(learning_rate, alpha, decay_steps):
    def gen_lr(global_step):

        #global_step = min(global_step, decay_steps)

        global_step = tf.minimum(global_step, decay_steps)
        cosine_decay = 0.5 * (1 + tf.cos(3.1415926 * global_step / decay_steps)) # changed np.pi to 3.14
        decayed = (1 - alpha) * cosine_decay + alpha
        decayed_learning_rate = learning_rate * decayed
        return decayed_learning_rate
    return gen_lr

def make_cosine_annealing_with_warmup(min_lr, max_lr, number_of_steps, alpha, decay_steps):
    gen_lr_1 = make_linear_lr(min_lr, max_lr, number_of_steps)
    gen_lr_2 = make_cosine_anneal_lr(max_lr, alpha, decay_steps)
    def gen_lr(global_step):

      #if global_step < number_of_steps:
      #    return gen_lr_1(global_step)
      #else:
      #    return gen_lr_2(global_step - number_of_steps)

      a = global_step < number_of_steps
      a = tf.cast(a, tf.float32)
      b = 1. - a
      return a * gen_lr_1(global_step) + b * gen_lr_2(global_step - number_of_steps)
        
    return gen_lr

此类时间表来自Keras。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在具有多个Keras模型的TF2自定义训练循环中应用渐变的正确方法

来自分类Dev

如何使用tf2为seq2seq构建自定义双向编码器?

来自分类Dev

如何在TF2中建立具有公差的自定义精度度量?

来自分类Dev

Symfony2自定义事件调度程序和侦听器

来自分类Dev

在Highcharts中设置自定义学分

来自分类Dev

张量流2.0自定义训练循环的学习率

来自分类Dev

使用XCFE和TightVNC在Ubuntu服务器上自定义分辨率

来自分类Dev

Scikit学习CountVectorizer:自定义预处理器,令牌生成器和分析器

来自分类Dev

未添加 TF2 指标的 Keras

来自分类Dev

angulardart组件-调度自定义事件

来自分类Dev

Wix调度自定义操作

来自分类Dev

自定义事件调度程序 - JavaFX

来自分类Dev

使用tf.Module创建的自定义训练循环不会学习

来自分类Dev

Keras-正则化和自定义丢失

来自分类Dev

在TF Summit 2020中实施``学习使用Tensorflow进行阅读''演讲-Tensorflow 2.1 / 2.2中的EncoderDecoder Seq2Seq模型-自定义火车步骤

来自分类Dev

在keras(深度学习库)中,可以自定义嵌入层吗?

来自分类Dev

在keras(深度学习库)中,可以自定义嵌入层吗?

来自分类Dev

自定义keras损失

来自分类Dev

自定义ImageDataGenerator keras

来自分类Dev

更改Flask和自定义装饰器的顺序会破坏自定义装饰器

来自分类Dev

您如何在Polymer中调度和侦听自定义事件?

来自分类Dev

akka自定义fork-join-executor调度程序在OSX和RHEL上的行为不同

来自分类Dev

如何通过useReducer和useContext调度自定义挂钩中的动作?

来自分类Dev

结构中的自定义获取器和设置器

来自分类Dev

Laravel中的自定义设置器和获取器

来自分类Dev

Keras 2如何汇总自定义指标的结果?

来自分类Dev

自定义Log4j2包装器和输出

来自分类Dev

自定义Log4j2包装器和输出

来自分类Dev

如何在自定义训练循环中使用tf.keras.layers.BatchNormalization()?

Related 相关文章

  1. 1

    在具有多个Keras模型的TF2自定义训练循环中应用渐变的正确方法

  2. 2

    如何使用tf2为seq2seq构建自定义双向编码器?

  3. 3

    如何在TF2中建立具有公差的自定义精度度量?

  4. 4

    Symfony2自定义事件调度程序和侦听器

  5. 5

    在Highcharts中设置自定义学分

  6. 6

    张量流2.0自定义训练循环的学习率

  7. 7

    使用XCFE和TightVNC在Ubuntu服务器上自定义分辨率

  8. 8

    Scikit学习CountVectorizer:自定义预处理器,令牌生成器和分析器

  9. 9

    未添加 TF2 指标的 Keras

  10. 10

    angulardart组件-调度自定义事件

  11. 11

    Wix调度自定义操作

  12. 12

    自定义事件调度程序 - JavaFX

  13. 13

    使用tf.Module创建的自定义训练循环不会学习

  14. 14

    Keras-正则化和自定义丢失

  15. 15

    在TF Summit 2020中实施``学习使用Tensorflow进行阅读''演讲-Tensorflow 2.1 / 2.2中的EncoderDecoder Seq2Seq模型-自定义火车步骤

  16. 16

    在keras(深度学习库)中,可以自定义嵌入层吗?

  17. 17

    在keras(深度学习库)中,可以自定义嵌入层吗?

  18. 18

    自定义keras损失

  19. 19

    自定义ImageDataGenerator keras

  20. 20

    更改Flask和自定义装饰器的顺序会破坏自定义装饰器

  21. 21

    您如何在Polymer中调度和侦听自定义事件?

  22. 22

    akka自定义fork-join-executor调度程序在OSX和RHEL上的行为不同

  23. 23

    如何通过useReducer和useContext调度自定义挂钩中的动作?

  24. 24

    结构中的自定义获取器和设置器

  25. 25

    Laravel中的自定义设置器和获取器

  26. 26

    Keras 2如何汇总自定义指标的结果?

  27. 27

    自定义Log4j2包装器和输出

  28. 28

    自定义Log4j2包装器和输出

  29. 29

    如何在自定义训练循环中使用tf.keras.layers.BatchNormalization()?

热门标签

归档