繁体   English   中英

如何从字符串加载python模块?

[英]How to load a python module from a string?

给定字符串

optimizer = "tensorflow.train.ProximalAdagradOptimizer"

如何实现以下目标:

import tensorflow
optimizer = tensorflow.train.ProximalAdagradOptimizer()

语境

要将上下文添加到我的特定用例中(以解决其中的一条评论):我正在尝试创建一个基于文本的配置,该配置描述了我的模型(具体而言是estimator)的配置方式。 这样,如果我想更多地训练或与他们一起做其他事情,我可以在训练后轻松地重新实例化它们。 我还没有找到一种简单的方法来做到这一点。 我不是为此寻找一个saved_model。 我的用例是在将模型提交到save_model状态之前,轻松地重新加载模型。 配置看起来像这样:

model_config = {
  "type": "DNNClassifier",
  "n_classes": 10,
  "feature_columns": [
    {
      "numeric_column": [
        {
          "key": "x"
        },
        {
          "key": "y"
        }
      ]
    }
  ],
  "optimizer": {
    "AdamOptimizer": {
      "learning_rate": 1.0
    }
  }
}

有了“ config”,我可以使用以下方法实例化估算器:

estimator = load_estimator(model_config, model_dir=model_dir)

type的值将解析为tensorflow.estimator.DNNClassifier feature_column[0].<key>将解析为tensorflow.feature_column.numeric_column 最后, optimizer.<key>的值将解析为tensorflow.train.AdamOptimizer

您可以使用功能eval并不是最佳答案,但可以完成工作

if "tensorflow" in optimizer:
    import tensorflow
    optimizer = eval(optimizer + '()')

你不能这样做: eval("import tensorflow")

您可以执行以下操作:

import importlib

def get_object_by_name(qualname):
    module, _, object = qualname.rpartition(".")
    if module:
        # package parameter is only necessary for relative imports
        # (here relative to this package)
        vs = vars(importlib.import_module(module, package=__package__))
    else:
        # If no module name we assume it is from the current module
        vs = globals()
    return vs[object]

optimizer_qualname = "tensorflow.train.AdamOptimizer"
optimizer_class = get_object_by_name(optimizer_qualname)
optimizer = optimizer_class()

我更改了优化器,以避免由于示例中缺少学习率参数而导致错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM