IPython / Spyder - автозагрузка tenorflow. python .keras.layers.core не удалось - PullRequest
0 голосов
/ 27 марта 2020

Я использую IDE Spyder и сталкиваюсь с проблемой, в которой я пытаюсь вызвать конкретную c функцию в другом файле .py, например:

from rl import RLAgent
model = RLAgent(data)
model.run_model()

И я получаю следующую ошибку :

[autoreload of tensorflow.python.keras.layers.core failed: Traceback (most recent call last):
  File "/anaconda3/lib/python3.7/site-packages/IPython/extensions/autoreload.py", line 245, in check
    superreload(m, reload, self.old_objects)
  File "/anaconda3/lib/python3.7/site-packages/IPython/extensions/autoreload.py", line 394, in superreload
    module = reload(module)
  File "/anaconda3/lib/python3.7/imp.py", line 314, in reload
    return importlib.reload(module)
  File "/anaconda3/lib/python3.7/importlib/__init__.py", line 148, in reload
    raise ImportError(msg.format(name), name=name)
ImportError: module rl not in sys.modules
]

Однако, если я переместу строки, чтобы создать и запустить модель в файл rl и запустить оттуда, проблем не будет. Метод run_model вызывает другую функцию build_rl_model, которая является источником проблемы. По любой причине, всякий раз, когда я пытаюсь вызвать эту функцию откуда-то, кроме файла, который ее содержит, я получаю нечто, похожее на эту ошибку. Я переместил функцию в другие файлы, и появляется сообщение об ошибке, за исключением того, что модуль, указанный в ImportError в конце, изменяется, чтобы отразить файл, в котором находится функция.

Я могу обойти это, запустить del sys.modules['rl'] перед импортом rl. Модуль rl обновлен и работает правильно, но я все равно получаю сообщение об ошибке каждый раз.

Вот функция build_rl_model. Я подтвердил, что функция build_functional, вызываемая build_rl_model, не вызывает проблемы. На самом деле не имеет значения, сколько я пытаюсь урезать

def build_rl_model(model):
    features_input, features_layer = build_functional(model, model.units, model.x_train, model.activation)

    features_layer = layers.Dense(len(model.classes), activation="linear", use_bias=False)(features_layer)
    trading_cost = model.class_threshold
    position_input = layers.Input(shape=(1,))
    position_layer = layers.Lambda(lambda x: embed_trading_cost(x, trading_cost))(position_input)

    out = layers.Add()([features_layer, position_layer])

    tf_model = models.Model(inputs=[features_input, position_input], outputs=out)
    tf_model.compile(optimizer="adam", loss="mse", metrics=["mse"])
    return tf_model    

Итак, опять же, проблема в том, что функция прекрасно работает при вызове в своем собственном файле, но нарушает процесс импорта / автозагрузки в Spyder. В дополнение к вышесказанному, я попытался переустановить Tensorflow, а также использовать более старую фиксацию, которая определенно работала ранее, но ни одна не исправила проблему.

Обновление:

Это странно, но я использовал метод Tensorflow clone_model для клонирования структуры модели, возвращенной build_rl_model, в другую модель. Затем я звонил get_weights и set_weights, чтобы перевести веса во вторую модель. Однако, когда я заменил models.clone_model вторым вызовом build_rl_model, проблема исчезла.

Я действительно понятия не имею, почему это решило проблему, особенно потому, что я ранее использовал clone_model и это не вызывало проблемы.

Если кто-нибудь мог объяснить, я был бы благодарен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...