Как загрузить модуль python из строки?

#python #python-3.x #tensorflow #module

#python #python-3.x #тензорный поток #модуль

Вопрос:

Учитывая строку

 optimizer = "tensorflow.train.ProximalAdagradOptimizer"
 

Как я могу добиться следующего:

 import tensorflow
optimizer = tensorflow.train.ProximalAdagradOptimizer()
 

Контекст

Чтобы добавить контекст к моему конкретному варианту использования (для решения одного из комментариев): я пытаюсь создать текстовую конфигурацию, которая описывает, как была настроена моя модель (в частности: оценщик). Таким образом, я могу легко повторно создать их экземпляр после обучения, если захочу обучить его больше или сделать с ними что-то другое. Я не нашел простого способа сделать это; Я не ищу saved_model для этого. Мой вариант использования — легко перезагружать модели перед их переводом в состояние saved_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 равно .

Комментарии:

1. вы не объяснили, как вы хотите использовать эту строку во втором коде. В вашем коде нет строки. Может быть, вам нужно только optimizer = tensorflow.train.ProximalAdagradOptimizer без () , а позже вы можете выполнить optimizer() .

Ответ №1:

Вы можете сделать что-то вроде этого:

 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()
 

Я изменил оптимизатор, чтобы избежать ошибки из-за отсутствия параметра скорости обучения в примере.

Ответ №2:

вы могли бы с помощью функции eval это не лучший ответ, но он выполняет свою работу

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

ты не можешь этого сделать : eval("import tensorflow")