1. 背景
在模型训练中,如果参数设置有误,可能会出现报错:
ValueError: False is not a valid IntervalStrategy, please select one of ['no', 'steps', 'epoch']
本文介绍如何解决此类报错问题。
2. 原因
如果你的代码是从 YAML 配置文件解析传递过来的,那么你需要注意 no
这个字段。
在 YAML(YAML Ain’t Markup Language)中,有几种不同的布尔值表示方式,通常用于表示真假值。这些表示方式包括不同的大小写和一些别名。
-
true/false: YAML 中可以直接使用
true
和false
来表示布尔值,它们是区分大小写的,分别表示真和假。key1: true key2: false
-
yes/no: 同样,YAML 中也可以使用
yes
和no
表示布尔值,也是区分大小写的。它们与true
和false
是等价的。key1: yes key2: no
因此,对于训练中的参数,例如:evaluation_strategy
,如果希望设置为 no
,一定要加上双引号,否则在解析 yaml 后 no
会被解析成 python 的 False
,而加上双引号则会被解析成字符串。下面是正确的用法:
evaluation_strategy: "no"
3. 引申:YAML双引号的作用
在 YAML 中,双引号 " "
和不带双引号的字符串表示有一些重要的区别,这主要涉及到如何处理特殊字符、空格、以及字符串的解析方式。
3.1 字符串带双引号
(1)处理特殊字符和转义序列
如果字符串中包含特殊字符(如换行符 \n
、制表符 \t
),双引号可以正确识别并解析这些特殊字符,而不是将其作为字面文本处理。
with_quotes: "Hello\nWorld"
在上面的例子中,\n
被正确解析为换行符,而不是作为字符串中的两个字符 "\n"
。
(2)保留字符串中的空格
如果字符串中包含空格或其他空白字符,双引号可以确保整个字符串被视为一个单独的值,并保留其中的空格。
with_quotes: "Hello World"
在上面的例子中,字符串 "Hello World"
中的多个空格会被保留。
(3)保留特定格式
双引号可以确保字符串按照原始格式进行解析,不会被 YAML 解析器自动转换为其他类型,例如保留字符串 "true"
作为字符串,而不是布尔值 true
。
with_quotes: "true"
在上面的例子中,字符串 "true"
会被视为字符串类型,而不是布尔值。
3.2 字符串不带双引号的情况:
(1)简洁性
如果字符串中没有特殊字符、空格或其他需要转义的内容,可以不使用双引号。这样可以使 YAML 文档更加简洁。
without_quotes: Hello World
在上面的例子中,Hello World
是一个普通的字符串,不需要额外的引号来标识。
(2)隐式类型转换:
不带双引号的字符串可能会根据其内容被 YAML 解析器隐式地转换为其他数据类型,例如 true
可能被解析为布尔值。
implicit_bool: true
在上面的例子中,true
可能会被解析为布尔值 true
,而不是字符串 "true"
。
4. 参考
https://github.com/huggingface/transformers/issues/14051
欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;
欢迎关注知乎/CSDN:SmallerFL
也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤