Flag 验证器

Flag 验证器使用教程

Flag 验证器 是一种常用工具,用来验证命令行参数或配置文件中的标志(flag)是否符合预期规则。这些工具可以帮助开发者确保传入的参数满足一定的条件,避免因参数错误而导致程序运行失败。以下是对各个验证器功能的中文说明以及使用示例。


功能解释

1. register_validator

用于注册一个验证函数,该函数用来验证某个特定 flag 的值是否有效。

  • 用法
    register_validator("learning_rate", lambda lr: lr > 0, message="学习率必须为正数。")
    
    • 第一个参数是 flag 的名称,例如 "learning_rate"
    • 第二个参数是一个验证函数,接收 flag 的值作为输入,返回 True 表示合法,抛出异常或返回 False 表示非法。
    • message 参数是可选的,用于在验证失败时输出提示信息。

2. validator

这是一个装饰器,用来定义并注册验证器函数。它和 register_validator 类似,但更简洁。

  • 用法
    @validator
    def validate_positive_learning_rate(value):return value > 0  # 学习率必须为正数
    

3. register_multi_flags_validator

用于验证多个 flags 之间的关系。适用于当多个 flag 需要满足某种依赖关系或约束时。

  • 用法
    register_multi_flags_validator(["learning_rate", "batch_size"],lambda lr, bs: lr < 1 and bs > 0,message="学习率必须小于 1 且批量大小必须大于 0。"
    )
    
    • 第一个参数是 flag 名称的列表。
    • 第二个参数是验证函数,接收多个 flag 的值作为输入。
    • message 参数用于验证失败时的提示。

4. multi_flags_validator

这是 register_multi_flags_validator 的装饰器版本,用来简化验证器的定义。

  • 用法
    @multi_flags_validator(["flag_a", "flag_b"])
    def validate_flags(flag_a, flag_b):return flag_a != flag_b  # 确保 flag_a 和 flag_b 的值不同
    

5. mark_flag_as_required

标记某个 flag 为必需。如果运行程序时未提供该 flag,则会报错。

  • 用法
    mark_flag_as_required("model_path")  # 模型路径是必需的
    

6. mark_flags_as_required

标记多个 flag 为必需。如果这些 flag 中的任意一个未提供,则会报错。

  • 用法
    mark_flags_as_required(["input_path", "output_path"])  # 输入路径和输出路径都是必需的
    

7. mark_flags_as_mutual_exclusive

确保多个 flag 是互斥的,即只能设置其中一个。如果多个 flag 同时被设置,则会报错。

  • 用法
    mark_flags_as_mutual_exclusive(["use_gpu", "use_tpu"])  # GPU 和 TPU 不能同时使用
    

8. mark_bool_flags_as_mutual_exclusive

这是 mark_flags_as_mutual_exclusive 的专门版本,用于布尔类型的 flag。确保多个布尔 flag 中最多只有一个为 True

  • 用法
    mark_bool_flags_as_mutual_exclusive(["debug", "production"])  # debug 和 production 模式不能同时开启
    

这些工具如何协同使用

这些验证器通常用于框架(如 TensorFlow、PyTorch)或自定义的命令行工具中,用来确保传入的参数符合要求。以下是一个示例,展示如何结合使用这些验证器。


示例代码

以下代码展示了如何使用这些验证器来定义和验证命令行 flag。

from _validators import (register_validator,register_multi_flags_validator,mark_flag_as_required,mark_flags_as_mutual_exclusive,mark_bool_flags_as_mutual_exclusive,
)# 定义 flags
flags.DEFINE_float("learning_rate", 0.01, "优化器的学习率。")
flags.DEFINE_integer("batch_size", 32, "训练的批量大小。")
flags.DEFINE_boolean("use_gpu", False, "是否使用 GPU 进行训练。")
flags.DEFINE_boolean("use_tpu", False, "是否使用 TPU 进行训练。")
flags.DEFINE_string("output_dir", None, "保存训练结果的目录。")# 注册验证器
# 确保学习率为正数
register_validator("learning_rate", lambda lr: lr > 0, message="学习率必须为正数!")# 确保批量大小大于 0
register_validator("batch_size", lambda bs: bs > 0, message="批量大小必须大于 0!")# 确保输出目录是必需的
mark_flag_as_required("output_dir")# 确保 GPU 和 TPU 是互斥的
mark_bool_flags_as_mutual_exclusive(["use_gpu", "use_tpu"])# 确保学习率和批量大小满足一定的关系
register_multi_flags_validator(["learning_rate", "batch_size"],lambda lr, bs: lr * bs < 1,message="学习率和批量大小的乘积必须小于 1!"
)

运行结果

  1. 如果未提供 output_dir

    错误:output_dir 是必需的,请指定保存路径。
    
  2. 如果同时启用了 use_gpuuse_tpu

    错误:use_gpu 和 use_tpu 是互斥的,请选择其中之一。
    
  3. 如果 learning_rate 为负数:

    错误:学习率必须为正数!
    
  4. 如果 learning_rate * batch_size >= 1

    错误:学习率和批量大小的乘积必须小于 1!
    

总结

通过以上的工具和方法,可以轻松实现以下功能:

  • 验证单个 flag 的合法性,如检查参数范围。
  • 验证多个 flag 的依赖关系,如互斥性或相关性。
  • 确保必需的 flag 被提供,避免缺少关键参数导致程序失败。

因此在jaxpi的代码里:

import os# Deterministic
# os.environ["XLA_FLAGS"] = "--xla_gpu_deterministic_reductions --xla_gpu_autotune_level=0"
os.environ["TF_CUDNN_DETERMINISTIC"] = "1"  # DETERMINISTICfrom absl import app
from absl import flags
from absl import loggingfrom ml_collections import config_flagsimport jax
jax.config.update("jax_default_matmul_precision", "highest")import train
import evalFLAGS = flags.FLAGSflags.DEFINE_string("workdir", ".", "Directory to store model data.")config_flags.DEFINE_config_file("config","./configs/default.py","File path to the training hyperparameter configuration.",lock_config=True,
)def main(argv):if FLAGS.config.mode == "train":train.train_and_evaluate(FLAGS.config, FLAGS.workdir)elif FLAGS.config.mode == "eval":eval.evaluate(FLAGS.config, FLAGS.workdir)if __name__ == "__main__":flags.mark_flags_as_required(["config", "workdir"])app.run(main)
将 config 和 workdir 标记为必需的命令行参数。
如果运行程序时未提供这两个参数,会报错。
作用:config:配置文件的路径,程序需要通过它加载配置。workdir:工作目录,用于保存训练结果、模型检查点等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二进制分析的新兴趋势:塑造安全的移动应用

在当今快速发展的数字世界中&#xff0c;保障移动应用的安全性变得尤为重要。随着移动技术的广泛应用&#xff0c;安全性需求也日益增强。二进制分析作为确保移动应用安全和合规性的重要手段&#xff0c;通过对已编译的应用进行深入分析&#xff0c;能够发现源代码中难以察觉的…

Python:动态粒子爱心

预览 代码结构概述 这段代码使用了 pygame 库来创建一个动态的图形窗口&#xff0c;绘制一个心形图案&#xff0c;并在其中显示闪烁的文本。代码主要分为以下几个部分&#xff1a; 初始化和设置心形曲线的计算粒子类的定义生成粒子文本设置主循环 1. 初始化和设置 import p…

React源码02 - 基础知识 React API 一览

1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串&#xff0c;而组件使用大写开头时&#xff0c;这…

使用DynadotAPI购买域名清仓列表中的过期域名

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

js分页功能

先声明些全局变量方便我们在下面的代码中使用 //一页有多少条数据 let num 10; //页码 let k 0; //总页数 let divide; // 用来判断显示哪几页的页数 let page_num 0; // 声明一个用于接数据的变量 let datas; // 声明一个用于接数据的变量 let data; //一页有多少条数据 l…

CMake Do‘s and Don‘ts (行为准则)

CMake Dos and Donts {行为准则} 1. General2. Modules3. ProjectsReferences Effective Modern CMake https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1 Do’s and Don’ts https://cliutils.gitlab.io/modern-cmake/chapters/intro/dodonot.html dos and …

验证的分类及相关工具

目录 1.验证方法的分类1.1动态验证1.2.静态验证 2.动态验证及相关工具2.1.电路级仿真工具2.2.逻辑仿真工具 3.静态验证及相关工具3.1 形式验证工具3.2 静态时序分析工具 SOC设计中验证包含以下几个方面&#xff1a; 验证原始描述的正确性验证设计的逻辑功能是否符合设计规范的要…

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS&#xff08;Domain Name System&#xff09;是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器…

【Python】pandas库---数据分析

大学毕业那年&#xff0c;你成了社会底层群众里&#xff0c;受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析&#xff0c;没看过的同学可以去看看&#xff1a;【Pyt…

【人工智能学习之HDGCN18关键点修改】

【人工智能学习之HDGCN18关键点修改】 训练部分修改部分 训练部分 请参考文章&#xff1a;【人工智能学习之HDGCN训练自己的数据集】 修改部分 参考源码中25关键点的区域划分&#xff0c;我们将18关键点划分为&#xff1a; 头部&#xff1a; 鼻子左眼和左耳右眼和右耳 上肢…

ARCGIS国土超级工具集1.2更新说明

ARCGIS国土超级工具集V1.2版本&#xff0c;功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG&#xff0c;新增了"矢量分割工具"菜单&#xff0c;同时增加及更新了了若干功能&#xff0c;新工具使用说明如下&#xff1a; 一、勘测定界工具栏更新界址点成果…

华为OD --- 流浪地球

华为OD --- 流浪地球 题目独立实现基本思路代码实现 其他答案实现思路代码实现 题目 独立实现 基本思路 1、首先把题目给出的启动机器初始化成数组, 2、用for循环模拟每隔1s更新这个初始化数组的前后两个机器. (源码中的updateTimeCount函数) 3、for循环每次循环后会检查当前…

DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合&#xff0c;旨在提高数据管道的质量和效率&#xff0c;从而加速数据从源头到消费的过程。白鲸开源科技&#xff0c;作为DataOps领域的领先开源原生公司&#xf…

【硬件IIC】stm32单片机利用硬件IIC驱动OLED屏幕

之前操作OLED屏幕都是用GPIO模拟IIC去驱动&#xff0c;最近打算用硬件IIC去驱动&#xff0c;于是写下这个demo,在这个过程中遇到一点小坑&#xff0c;记录一下&#xff0c;本文章非小白教程&#xff0c;所以只突出踩到的坑点&#xff0c;文章中涉及到的OLED也是网上资料写烂的&…

python如何自动加空格

首先&#xff0c;需要进行打开的一个pycharm的软件&#xff0c;可进行双击的打开该软件。 可以看到的是在当前的打开的文件中&#xff0c;格式相对较乱一下。格式不对会格式错误。 然后点击菜单栏中的“code”。 在弹出的下拉菜单中选择“reformat code”选项。 可以看到的是在…

【开源免费】基于SpringBoot+Vue.JS网上订餐系统(JAVA毕业设计)

本文项目编号 T 018 &#xff0c;文末自助获取源码 \color{red}{T018&#xff0c;文末自助获取源码} T018&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

串口通信和SPI通信详解

0、背景 在现代嵌入式系统中&#xff0c;通信是不同模块之间交换数据的核心。串口通信和 SPI&#xff08;串行外设接口&#xff09;是两种常见的通信方式&#xff0c;它们各自有独特的优势和适用场景。 1、串口通信 1.1、串口通信概念 串口通信是一种常见的异步串行通信协议…

javase-17、API.数学相关

一、Math类 Math类提供了大量的静态方法来便于我们实现数学计算&#xff0c;如求绝对值、取最大或最小值等。 https://doc.qzxdp.cn/jdk/17/zh/api/java.base/java/lang/Math.html 所在模块&#xff1a;java.base所在包&#xff1a; java.lang static double abs(double a)…

答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统&#xff0c;支持多种试题类型、多种试题难度、练题、考试、补考模式&#xff0c;提供全部前后台无加密源代码&#xff0c;支持私有化部署 二.测试环境 系统环境&#xff1a;CentOS、 运行环境&#x…

浅谈仓颉语言的优劣

仓颉语言&#xff0c;作为华为自研的新一代编程语言&#xff0c;以其高效、安全、现代化的特点&#xff0c;引起了广泛的关注。 仓颉语言的优势 高效并发 仓颉语言的一大亮点是其轻松并发的能力。它实现了轻量化用户态线程和并发对象库&#xff0c;使得高效并发变得轻松。仓颉…