问题描述
所以问题是,为了在 AllenNLP 中使用自动调整(如 optuna),建议的做法是在 jsonnet 脚本中使用对环境变量的引用,然后设置一个研究来修改这些参数。
当值是整数或浮点数时,效果很好。对于整数,您使用 std.parseInt(std.extvar(varname))
,对于浮点数,您使用 std.parseJson(std.extvar(varname))
。
但是如果我想改变,比如说我在“adam”、“sparseadam”、“adamax”、adamw”等之间的测试中的优化技术,或者改变我使用的 RNN 的类型,似乎没有是一个简单的方法来做到这一点。
在这种情况下,您似乎应该能够执行 std.extvar(varname)
而无需将其包装在 parseJson()
或 parseInt()
中,但这会返回错误。有没有其他人遇到过这个问题?您是如何解决的?
补充一点,我正在尝试使用三个不同的字符串参数。这是第一个的 jsonnet,“bert_vocab”:
local bert_vocab=std.extvar('bert_vocab');
错误信息:
486 ext_vars = {**_environment_variables(),**ext_vars}
487
--> 488 file_dict = json.loads(evaluate_file(params_file,ext_vars=ext_vars))
489
490 if isinstance(params_overrides,dict):
RuntimeError: RUNTIME ERROR: field does not exist: extvar
/bigdisk/lax/cox/jupyter/bert_config.jsonnet:28:18-28 thunk <bert_vocab>
/bigdisk/lax/cox/jupyter/bert_config.jsonnet:61:22-32 object <anonymous>
/bigdisk/lax/cox/jupyter/bert_config.jsonnet:(59:16)-(63:12) object <anonymous>
/bigdisk/lax/cox/jupyter/bert_config.jsonnet:(58:21)-(64:10) object <anonymous>
/bigdisk/lax/cox/jupyter/bert_config.jsonnet:(56:19)-(65:8) object <anonymous>
During manifestation
我也尝试过像这里这样的各种“字符串转义函数”(但字符串转义函数都不起作用:
local bert_vocab=std.escapestringBash(std.extvar("bert_vocab"));
我可以执行以下操作来验证是否设置了 os 环境变量:
os.environ['bert_vocab']
返回 'bert-base-uncased'
解决方法
(我不知道 AllenNLP,只知道 Jsonnet。)
ExtVars 可以是任意的 Jsonnet 值(数字、浮点数、字符串、数组、对象、函数或空值)。
从你提出的例子来看,AllenNLP 将参数作为字符串传递,你需要进行解析。在这种情况下,应该可以使用“naked” std.ExtVar 来获取字符串。