این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

رانندگان

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub بارگیری نوت بوک

مقدمه

یک الگوی رایج در یادگیری تقویت ، اجرای یک سیاست در یک محیط برای تعداد مشخصی از مراحل یا قسمت ها است. این اتفاق می افتد ، به عنوان مثال ، در هنگام جمع آوری داده ها ، ارزیابی و تولید یک فیلم از عامل.

در حالی که این نوشتن در پایتون نسبتاً ساده است ، نوشتن و اشکال زدایی در tf.while بسیار پیچیده تر است زیرا این کار شامل حلقه های tf.cond ، tf.cond و tf.control_dependencies . بنابراین ما این مفهوم حلقه اجرا را در کلاس به نام driver انتزاع می کنیم و پیاده سازی های خوبی را هم در Python و TensorFlow آزمایش می کنیم.

علاوه بر این ، داده هایی که راننده در هر مرحله با آن روبرو می شود ، در یک tuple نامگذاری شده به نام Trajectory ذخیره می شود و برای مجموعه ای از ناظران مانند بافرهای پخش مجدد و اندازه گیری ها پخش می شود. این داده ها شامل مشاهده از محیط ، عملی که توصیه می شود با سیاست ، پاداش به دست آمده ، نوع جریان و مرحله بعدی و غیره باشد.

برپایی

اگر هنوز فاکتورهای بدنسازی یا سالن ورزشی را نصب نکردید ، اجرا کنید:

pip install -q tf-agents
pip install -q gym
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import tensorflow as tf


from tf_agents.environments import suite_gym
from tf_agents.environments import tf_py_environment
from tf_agents.policies import random_py_policy
from tf_agents.policies import random_tf_policy
from tf_agents.metrics import py_metrics
from tf_agents.metrics import tf_metrics
from tf_agents.drivers import py_driver
from tf_agents.drivers import dynamic_episode_driver

tf.compat.v1.enable_v2_behavior()

رانندگان پایتون

کلاس PyDriver از یک محیط پایتون ، یک خط مشی پایتون و یک لیست از ناظران برای بروزرسانی در هر مرحله استفاده می کند. روش اصلی run() ، که محیط را با استفاده از اقدامات از خط مشی خارج می کند تا حداقل یکی از معیارهای خاتمه زیر را برآورده کند: تعداد مراحل به max_steps می رسد یا تعداد قسمت ها به max_episodes می رسد.

اجرای تقریباً به شرح زیر است:

class PyDriver(object):

  def __init__(self, env, policy, observers, max_steps=1, max_episodes=1):
    self._env = env
    self._policy = policy
    self._observers = observers or []
    self._max_steps = max_steps or np.inf
    self._max_episodes = max_episodes or np.inf

  def run(self, time_step, policy_state=()):
    num_steps = 0
    num_episodes = 0
    while num_steps < self._max_steps and num_episodes < self._max_episodes:

      # Compute an action using the policy for the given time_step
      action_step = self._policy.action(time_step, policy_state)

      # Apply the action to the environment and get the next step
      next_time_step = self._env.step(action_step.action)

      # Package information into a trajectory
      traj = trajectory.Trajectory(
         time_step.step_type,
         time_step.observation,
         action_step.action,
         action_step.info,
         next_time_step.step_type,
         next_time_step.reward,
         next_time_step.discount)

      for observer in self._observers:
        observer(traj)

      # Update statistics to check termination
      num_episodes += np.sum(traj.is_last())
      num_steps += np.sum(~traj.is_boundary())

      time_step = next_time_step
      policy_state = action_step.state

    return time_step, policy_state

اکنون ، اجازه دهید نمونه ای از اجرای یک خط مشی تصادفی در محیط CartPole را اجرا کنیم ، و نتایج را در یک بافر پخش مجدد ذخیره کنیم و برخی از معیارها را محاسبه کنیم.

env = suite_gym.load('CartPole-v0')
policy = random_py_policy.RandomPyPolicy(time_step_spec=env.time_step_spec(), 
                                         action_spec=env.action_spec())
replay_buffer = []
metric = py_metrics.AverageReturnMetric()
observers = [replay_buffer.append, metric]
driver = py_driver.PyDriver(
    env, policy, observers, max_steps=20, max_episodes=1)

initial_time_step = env.reset()
final_time_step, _ = driver.run(initial_time_step)

print('Replay Buffer:')
for traj in replay_buffer:
  print(traj)

print('Average Return: ', metric.result())
Replay Buffer:
Trajectory(step_type=array(0, dtype=int32), observation=array([ 0.04572451,  0.02109156, -0.03040793, -0.03130549], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.04614634, -0.17358142, -0.03103404,  0.25163046], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.04267471, -0.3682468 , -0.02600143,  0.53436536], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.03530978, -0.56299365, -0.01531413,  0.8187433 ], dtype=float32), action=array(1), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.0240499 , -0.36766544,  0.00106074,  0.5212832 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.0166966, -0.5628023,  0.0114864,  0.8143002], dtype=float32), action=array(1), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([ 0.00544055, -0.36783955,  0.02777241,  0.5252522 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.00191624, -0.5633411 ,  0.03827745,  0.8265555 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.01318306, -0.75896496,  0.05480856,  1.1310272 ], dtype=float32), action=array(1), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.02836236, -0.5646018 ,  0.07742911,  0.85602593], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.0396544 , -0.7606886 ,  0.09454963,  1.1720163 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.05486817, -0.956904  ,  0.11798995,  1.4927809 ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.07400625, -1.1532475 ,  0.14784557,  1.819857  ], dtype=float32), action=array(0), policy_info=(), next_step_type=array(1, dtype=int32), reward=array(1., dtype=float32), discount=array(1., dtype=float32))
Trajectory(step_type=array(1, dtype=int32), observation=array([-0.0970712 , -1.3496711 ,  0.18424271,  2.1545868 ], dtype=float32), action=array(1), policy_info=(), next_step_type=array(2, dtype=int32), reward=array(1., dtype=float32), discount=array(0., dtype=float32))
Average Return:  14.0

رانندگان TensorFlow

ما همچنین به رانندگان در TensorFlow که کارکردی شبیه به رانندگان پایتون داشته باشد، اما محیط استفاده TF، سیاست TF، ناظران TF و غیره ما در حال حاضر رانندگان 2 TensorFlow: DynamicStepDriver ، که ها پس از یک عدد داده شده از مراحل (معتبر) محیط زیست و DynamicEpisodeDriver ، که پس از تعداد مشخصی از قسمت ها خاتمه می یابد. بگذارید نمونه ای از DynamicEpisode را در عمل بررسی کنیم.

env = suite_gym.load('CartPole-v0')
tf_env = tf_py_environment.TFPyEnvironment(env)

tf_policy = random_tf_policy.RandomTFPolicy(action_spec=tf_env.action_spec(),
                                            time_step_spec=tf_env.time_step_spec())


num_episodes = tf_metrics.NumberOfEpisodes()
env_steps = tf_metrics.EnvironmentSteps()
observers = [num_episodes, env_steps]
driver = dynamic_episode_driver.DynamicEpisodeDriver(
    tf_env, tf_policy, observers, num_episodes=2)

# Initial driver.run will reset the environment and initialize the policy.
final_time_step, policy_state = driver.run()

print('final_time_step', final_time_step)
print('Number of Steps: ', env_steps.result().numpy())
print('Number of Episodes: ', num_episodes.result().numpy())
final_time_step TimeStep(step_type=<tf.Tensor: shape=(1,), dtype=int32, numpy=array([0], dtype=int32)>, reward=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([0.], dtype=float32)>, discount=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>, observation=<tf.Tensor: shape=(1, 4), dtype=float32, numpy=
array([[ 0.04983833,  0.00221694, -0.04754572,  0.03050179]],
      dtype=float32)>)
Number of Steps:  46
Number of Episodes:  2

# Continue running from previous state
final_time_step, _ = driver.run(final_time_step, policy_state)

print('final_time_step', final_time_step)
print('Number of Steps: ', env_steps.result().numpy())
print('Number of Episodes: ', num_episodes.result().numpy())
final_time_step TimeStep(step_type=<tf.Tensor: shape=(1,), dtype=int32, numpy=array([0], dtype=int32)>, reward=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([0.], dtype=float32)>, discount=<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>, observation=<tf.Tensor: shape=(1, 4), dtype=float32, numpy=
array([[-0.01266267, -0.01962714, -0.03140591, -0.04742253]],
      dtype=float32)>)
Number of Steps:  82
Number of Episodes:  4