据我所知,没有办法在 AllenNLP 配置文件中参数化字符串---只有整数或浮点数

问题描述

所以问题是,为了在 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 来获取字符串。