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.pswp.cn/web/63454.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63454.shtml
英文地址,請注明出處:http://en.pswp.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;使得高效并發變得輕松。倉頡…