• hook回调函数


    回调函数是一种编程概念,它主要与编程语言的功能和设计模式有关,而不是与算法思想直接相关。许多现代编程语言都支持回调,通常通过高阶函数或函数指针来实现。但并不是所有的编程语言都内置了回调。回调的实现更多地依赖于语言是否支持将函数作为参数传递或存储。例如,JavaScript、Python 和 C++ 都支持回调。

    在很多编程框架和库中,特别是那些涉及事件驱动或生命周期管理的库,"hook" 是一个常见的概念。一个 hook 可以看作是一个回调函数,当某些特定事件或条件满足时,它会被触发执行。

    关于 hook 的要点,以深度学习中一个evaluate过程为例:

    1. # register eval hooks
    2. if validate:
    3. val_dataset = build_dataset(cfg.data.val, dict(test_mode=True))
    4. val_dataloader = build_dataloader(
    5. val_dataset,
    6. samples_per_gpu=1,
    7. workers_per_gpu=cfg.data.workers_per_gpu,
    8. dist=distributed,
    9. shuffle=False)
    10. eval_cfg = cfg.get('evaluation', {})
    11. eval_cfg['by_epoch'] = cfg.runner['type'] != 'IterBasedRunner'
    12. eval_hook = DistEvalHook if distributed else EvalHook
    13. runner.register_hook(eval_hook(val_dataloader, **eval_cfg))
    14. if cfg.resume_from:
    15. runner.resume(cfg.resume_from)
    16. elif cfg.load_from:
    17. runner.load_checkpoint(cfg.load_from)
    18. runner.run(data_loaders, cfg.workflow)
    1. 注册 Hooks:

      • runner.register_hook() 方法允许我们为特定事件或条件注册回调函数(即 hooks)。当这些事件发生或条件满足时,这些回调函数会被自动调用。
    2. 验证 (Validation) Hook:

      • 如果 validateTrue,则会构建一个验证数据集和相应的数据加载器。
      • 根据配置和是否在分布式环境中,选择一个适当的评估 hook(DistEvalHookEvalHook)。
      • 然后,这个评估 hook 被注册到 runner,这意味着在模型训练的某个点,这个 hook 会被调用,以在验证数据集上评估模型。
    3. 加载 Checkpoints:

      • 如果指定了 resume_from,则从该 checkpoint 恢复模型的状态并继续训练。
      • 如果指定了 load_from,则从该 checkpoint 加载模型,但不继续从上次的训练状态开始。
    4. 运行:

      • 使用 runner.run() 开始模型的训练。在此过程中,已注册的 hooks 会在适当的时间点被调用。

    Hook 的工作原理:

    在底层,hook 的工作原理是基于事件驱动的模式。当发生特定的事件(例如,一个 epoch 的结束)或满足某些条件(例如,达到一定的迭代次数)时,框架会自动检查是否有为这些事件或条件注册的回调函数,并按照注册的顺序调用它们。

    这种模式提供了极大的灵活性,因为它允许开发者插入自定义的逻辑,而不必修改框架的内部代码。例如,你可以很容易地为模型的训练过程添加自定义的日志记录、模型保存或其他功能,而不必更改训练循环的实际代码。

  • 相关阅读:
    JVM 第四部分—垃圾回收概念 和 算法 1
    如果手机被偷了,里面的微信和支付宝绑定了银行卡,该怎么办?
    Springcloud笔记(4)-客户端负载均衡Ribbon
    PyScript:让Python在HTML中运行
    【卫朋】IPD | 华为流程体系:如何做好流程管理?
    mysql-4-锁机制
    java spring cloud 企业工程管理系统源码+二次开发+定制化服务
    JVM命令:jsp(找进程),jstack(线程栈),jmap(内存),jinfo(参数)
    Pinia(四)了解和使用getters
    数据可视化【原创】vue+arcgis+threejs 实现立体光圈闪烁效果
  • 原文地址:https://blog.csdn.net/qq_41413211/article/details/133712627