SageMaker训练:如何编写正则表达式正确捕获含指数形式的指标?
解决CloudWatch中metric_definitions正则无法捕获科学计数法(如e-0x)的问题
原Stack Overflow帖子里推荐的metric_definitions正则存在缺陷,没法完整捕获带e-0x这类指数的科学计数法数值——比如loss实际一直在下降,但CloudWatch只抓到了数值的前半部分,导致指标显示上下波动,完全反映不出模型真实的学习状态。
原正则的问题
原正则'loss': ([0-9]+(.|e\-)[0-9]+),?的问题很明显:
- 只能匹配一次小数点或
e-,碰到1.23e-04这种完整的科学计数法,只能抓到1.23e-0,后面的数字直接丢了 - 没考虑纯整数、纯小数的情况,覆盖范围太窄
- 里面的
.没转义,会匹配任意字符,容易误抓无关内容
修正后的正则方案
改用兼容CloudWatch RE2引擎的正则,能完整匹配整数、小数、科学计数法三种数值格式:
metric_definitions = [ {'Name': 'loss', 'Regex': "'loss': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'learning_rate', 'Regex': "'learning_rate': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'eval_loss', 'Regex': "'eval_loss': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'eval_accuracy', 'Regex': "'eval_accuracy': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'eval_f1', 'Regex': "'eval_f1': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'eval_precision', 'Regex': "'eval_precision': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'eval_recall', 'Regex': "'eval_recall': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'eval_runtime', 'Regex': "'eval_runtime': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'eval_samples_per_second', 'Regex': "'eval_samples_per_second': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"}, {'Name': 'epoch', 'Regex': "'epoch': ([+-]?\\d+(\\.\\d*)?|\\.\\d+)([eE][+-]?\\d+)?"} ]
为什么之前的变体在regexr有效但CloudWatch不行?
regexr用的是JavaScript正则引擎,和CloudWatch用的RE2引擎语法不完全兼容——比如你之前试的.*贪婪匹配在RE2里可能会导致捕获逻辑异常,而且RE2对某些语法有严格限制,必须用它支持的标准正则语法才能正常工作。
内容的提问来源于stack exchange,提问作者Yoan B. M.Sc
相关产品推荐
相关产品推荐

