MatConvNet代码梳理3--vl_argparse()

本文介绍MATLAB中的VL_ARGPARSE函数,用于解析参数值对列表,更新结构体字段,并支持递归处理。文中详细阐述了函数的工作原理、参数处理流程及使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VL_ARGPARSE解析参数值对的列表。OPTS = VL_ARGPARSE(OPTS,ARGS)基于指定的参数 - 值对ARGS = {PAR1,VAL1,… PARN,VALN}更新结构OPTS。如果参数PAR不能与OPTS中的任何字段匹配,则函数会生成错误。

在OPTS中具有struct值的参数以递归方式处理,更新各个子字段。可以通过使用VL_ARGPARSE(OPTS,ARGS,’nonrecursive’)抑制此行为,在这种情况下直接复制struct值(因此删除OPTS中存在的任何现有子字段)。 如果OPTS中的struct值是没有字段的结构,也会发生直接复制。当处理时间是关注时,非递归模式是特别有用的。

参数列表中的一个或多个(PAR,VAL)对可以是替换为结构; 在这种情况下,结构的字段用作参数名称,字段值用作参数值。 这种行为,虽然与结构值参数正交,也在“非递归”模式中禁用。

[OPTS,ARGS] = VL_ARGPARSE(OPTS,ARGS)将ARGS中与OPTS不匹配的任何参数复制回ARGS,而不是产生错误。 指定为结构的选项将作为(PAR,VAL)对的列表传回。

例:该函数可用于解析参数列表,传递给一个MATLAB函数:

function myFunction(x,y,z,varargin)
    opts.parameterName = defaultValue ;
    opts = vl_argparse(opts, varargin)

如果只解析一部分选项,例如,因为其他选项由子例程解释,然后使用形式

[opts, varargin] = vl_argparse(opts, varargin)

将任何未知参数复制回VARARGIN。
参见:VL_HELP()

if ~isstruct(opts) && ~isobject(opts), error('OPTS must be a structure') ; end %OPTS必须是一个结构体
if ~iscell(args), args = {args} ; end %iscell函数功能:判断给定数组是否是元胞数组.
recursive = true ;
if numel(varargin) == 1
  if strcmp(lower(varargin{1}), 'nonrecursive') ; %strcmp函数功能:比较字符串s1和s2
    recursive = false ;
  else
    error('Unknown option specified.') ; %未指定选项
  end
end
if numel(varargin) > 1
  error('There can be at most one option.') ; %最多只能有一个选项。
end
optNames = fieldnames(opts)' ; %fieldnames,获得结构数组opts的域名[matlab中结构体使用方法 - 学习记录 - 博客频道 - youkuaiyun.com](http://blog.youkuaiyun.com/littlestonelj/article/details/7564711)
%将ARGS转换为结构体
ai = 1 ;
keep = false(size(args)) ; %false()函数,生成逻辑0的矩阵,也就是“非”,false(m,n).
while ai <= numel(args)  %args的元素总量大于等于1
     % 检查参数是(param,value)对还是结构。
     if recursive && isstruct(args{ai})
         params = fieldnames(args{ai})' ;
         values = struct2cell(args{ai})' ;
         if nargout == 1
             opts = vl_argparse(opts, vertcat(params,values)) ;
         else
             [opts, rest] = vl_argparse(opts, reshape(vertcat(params,values), 1, [])) ;
             args{ai} = cell2struct(rest(2:2:end), rest(1:2:end), 2) ;
             keep(ai) = true ;
         end
         ai = ai + 1 ;
         continue ;
     end
     if ~isstr(args{ai})
         error('Expected either a param-value pair or a structure.') ; %预期要么是参数值对,要么是结构
     end

     param = args{ai} ;
     value = args{ai+1} ;

     p = find(strcmpi(param, optNames)) ;
     if numel(p) ~= 1
         if nargout == 1
             error('Unknown parameter ''%s''', param) ;
         else
             keep([ai,ai+1]) = true ;
             ai = ai + 2 ;
             continue ;
         end
     end
     field = optNames{p} ;


     if ~recursive
         opts.(field) = value ;
     else
         if isstruct(opts.(field)) && numel(fieldnames(opts.(field))) > 0
         %参数在OPTS中有一个非空的结构体值:
         %递归进程
             if ~isstruct(value)
                 error('Cannot assign a non-struct value to the struct parameter ''%s''.', field) ; %无法为结构参数字段分配非结构化值
             end
             if nargout > 1
                 [opts.(field), args{ai+1}] = vl_argparse(opts.(field), value) ;
             else
                 opts.(field) = vl_argparse(opts.(field), value) ;
             end
         else
         % 该参数在OPTS中没有结构值:copy as is。
         opts.(field) = value ;
         end
     end

     ai = ai + 2 ;
 end
 args = args(keep) ;
<think>我们遇到了一个错误:`train_qwen_vl_safety.py: error: unrecognized arguments: --lora_rank 64 --lora_alpha 128` 这个错误表示在运行`train_qwen_vl_safety.py`脚本时,传入了两个不被识别的参数:`--lora_rank`和`--lora_alpha`。 可能的原因: 1. 脚本本身不支持这些参数(即脚本的代码中没有定义这些参数)。 2. 参数名称拼写错误(但这里看起来是正确的)。 3. 使用的脚本版本较旧,尚未添加对LoRA参数的支持。 解决方案: 1. 检查脚本是否支持LoRA训练:查看脚本的源代码,确认是否定义了`--lora_rank`和`--lora_alpha`参数(通常在`argparse.ArgumentParser`部分)。 2. 如果脚本不支持,考虑更新脚本到支持LoRA的版本,或者手动添加这些参数3. 如果不需要使用LoRA,则移除这两个参数。 如何查看脚本支持的参数? 可以运行:`python train_qwen_vl_safety.py -h` 或 `python train_qwen_vl_safety.py --help` 来查看帮助信息。 如果确实需要添加LoRA支持,而当前脚本没有,那么可能需要修改脚本。 但是,根据问题描述,我们只是遇到了这个错误,所以首先需要移除这两个参数或者确保脚本支持它们。 因此,建议: 1. 移除`--lora_rank`和`--lora_alpha`参数再运行。 2. 或者,更新脚本到支持LoRA的版本。 注意:如果脚本原本就支持LoRA,那么可能是拼写错误或者参数位置错误(比如放在不被识别的位置),但错误信息明确指出了这两个参数不被识别,所以最可能的原因是脚本不支持。 所以,请检查脚本的版本和参数定义。</think>问题出在命令行参数不被识别。错误信息 `unrecognized arguments: --lora_rank 64 --lora_alpha 128` 表明: 1. **脚本不支持这些参数**:`train_qwen_vl_safety.py` 未定义 `--lora_rank` 和 `--lora_alpha` 参数 2. **可能原因**: - 脚本版本过旧,不支持 LoRA 微调参数 - 参数名称拼写错误(但此处拼写正确) - 需要先安装 LoRA 相关依赖库 ### 解决方案: 1. **检查可用参数**: ```bash python train_qwen_vl_safety.py -h ``` 查看帮助文档确认支持的参数列表 2. **更新脚本**: 获取最新版脚本,可能新增了 LoRA 支持: ```bash git clone https://github.com/QwenLM/Qwen-VL.git cp Qwen-VL/scripts/train_qwen_vl_safety.py ./ ``` 3. **添加参数支持**(高级): 手动修改脚本,在 `argparse` 部分添加: ```python parser.add_argument("--lora_rank", type=int, default=64) parser.add_argument("--lora_alpha", type=int, default=128) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值