Наличие метода класса в качестве одного обратного вызова param - PullRequest
0 голосов
/ 04 октября 2019

Я работаю с мелодией , чтобы обучить какую-то модель обучения усилению. Мне нужно использовать пользовательский обратный вызов , который должен быть функцией с одним параметром. Я хотел бы иметь метод из пользовательского класса в качестве обратного вызова, но я не совсем понимаю, как мне передать параметр info без использования self .

Это мой класс прямо сейчас:

import json
from collections import Counter

import termcolor
from ray import tune


class Evaluation:



    def configure_callbacks(self,config):

        config["callbacks"]["on_episode_step"] = self.on_episode_step

        return config

    def log(self,msg, color="white"):
        termcolor.cprint(msg,color)

    @tune.function
    def on_episode_step(self,info):

         self.log(info)



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

ray.exceptions.RayTaskError: /Users/giulia/anaconda3/envs/dmas/bin/python /Users/giulia/Desktop/mas_traffic/FlowMas/simulation.py (pid=25935, host=Giulias-MacBook-Pro.local)
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/local_mode_manager.py", line 55, in execute
    results = function(*copy.deepcopy(args))
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/agents/trainer.py", line 415, in train
    raise e
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/agents/trainer.py", line 401, in train
    result = Trainable.train(self)
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/tune/trainable.py", line 171, in train
    result = self._train()
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/agents/trainer_template.py", line 129, in _train
    fetches = self.optimizer.step()
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/optimizers/sync_batch_replay_optimizer.py", line 66, in step
    batches = [self.workers.local_worker().sample()]
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/evaluation/rollout_worker.py", line 472, in sample
    batches = [self.input_reader.next()]
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/evaluation/sampler.py", line 56, in next
    batches = [self.get_data()]
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/evaluation/sampler.py", line 99, in get_data
    item = next(self.rollout_provider)
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/evaluation/sampler.py", line 319, in _env_runner
    soft_horizon, no_done_at_end)
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/evaluation/sampler.py", line 364, in _process_observations
    episode = active_episodes[env_id]
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/rllib/evaluation/sampler.py", line 294, in new_episode
    "episode": episode,
  File "/Users/giulia/anaconda3/envs/dmas/lib/python3.6/site-packages/ray-0.7.4-py3.6-macosx-10.7-x86_64.egg/ray/tune/sample.py", line 45, in __call__
    return self.func(*args, **kwargs)
TypeError: on_episode_step() missing 1 required positional argument: 'info'

Что очевидно, поскольку я предполагаю передать два параметра.

Мне бы очень хотелось, чтобы прогресс процесса оценки время от времени обновлял атрибуты класса.

Есть ли обходной путь для этого?

...