Я использую 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
и это не вызывало проблемы.
Если кто-нибудь мог объяснить, я был бы благодарен.