0

所以问题是,对于使用 AllenNLP 的自动调整(如 optuna),建议的做法是在 jsonnet 脚本中使用对环境变量的引用,然后建立一个研究来修改这些参数。

当值是整数或浮点时,这很好。对于整数,您使用std.parseInt(std.extVar(varname)),对于浮点数,您使用std.parseJson(std.extVar(varname))

但是如果我想改变,比如我的测试中的优化技术在“adam”、“sparseadam”、“adamax”、adamw”等之间,或者改变我正在使用的 RNN 的类型,似乎并不容易方法来做到这一点。

在这种情况下,您似乎应该能够std.extVar(varname)在不将其包装在parseJson()or中的情况下执行此操作parseInt(),但这会返回错误。有没有其他人遇到过这个问题,你是如何解决的?

除此之外,我正在尝试使用三个不同的字符串参数。这是第一个“bert_vocab”的 jsonnet:

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'

4

1 回答 1

0

(我不知道 AllenNLP,只知道 Jsonnet。)

ExtVars 可以是任意 Jsonnet 值(数字、浮点数、字符串、数组、对象、函数或空值)。

从您提出的示例来看,AllenNLP 将参数作为字符串传递,您需要进行解析。在这种情况下,应该可以只使用“裸”std.ExtVar 来获取字符串。

于 2021-01-25T14:37:42.987 回答