احفظ التاريخ! يعود مؤتمر Google I / O من 18 إلى 20 مايو. سجل الآن
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

SAC minitaur مع واجهة برمجة تطبيقات Actor-Learner

حقوق الطبع والنشر 2021 The TF-Agents Authors.

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

مقدمة

يوضح هذا المثال كيفية تدريب وكيل Soft Actor Critic على بيئة Minitaur .

إذا كنت قد عملت من خلال DQN Colab ، فمن المفترض أن يكون هذا مألوفًا جدًا. تشمل التغييرات الملحوظة ما يلي:

  • تغيير الوكيل من DQN إلى SAC.
  • التدريب على Minitaur وهي بيئة أكثر تعقيدًا بكثير من CartPole. تهدف بيئة Minitaur إلى تدريب روبوت رباعي الحركة على المضي قدمًا.
  • استخدام واجهة برمجة تطبيقات TF-Agents Actor-Learner للتعلم المعزز الموزع.

تدعم واجهة برمجة التطبيقات (API) كلاً من جمع البيانات الموزعة باستخدام تجربة إعادة تشغيل المخزن المؤقت والحاوية المتغيرة (خادم المعلمات) والتدريب الموزع عبر أجهزة متعددة. تم تصميم واجهة برمجة التطبيقات لتكون بسيطة جدًا ومعيارية. نحن نستخدم Reverb لكل من المخزن المؤقت لإعادة التشغيل والحاوية المتغيرة و TF DistributionStrategy API للتدريب الموزع على وحدات معالجة الرسومات (GPU) و TPU.

إذا لم تكن قد قمت بتثبيت التبعيات التالية ، فقم بتشغيل:

sudo apt-get update
sudo apt-get install -y xvfb ffmpeg
pip install -q 'imageio==2.4.0'
pip install -q matplotlib
pip install -q tf-agents[reverb]
pip install -q pybullet

يثبت

أولاً سنقوم باستيراد الأدوات المختلفة التي نحتاجها.

import base64
import imageio
import IPython
import matplotlib.pyplot as plt
import os
import reverb
import tempfile
import PIL.Image

import tensorflow as tf

from tf_agents.agents.ddpg import critic_network
from tf_agents.agents.sac import sac_agent
from tf_agents.agents.sac import tanh_normal_projection_network
from tf_agents.environments import suite_pybullet
from tf_agents.metrics import py_metrics
from tf_agents.networks import actor_distribution_network
from tf_agents.policies import greedy_policy
from tf_agents.policies import py_tf_eager_policy
from tf_agents.policies import random_py_policy
from tf_agents.replay_buffers import reverb_replay_buffer
from tf_agents.replay_buffers import reverb_utils
from tf_agents.train import actor
from tf_agents.train import learner
from tf_agents.train import triggers
from tf_agents.train.utils import spec_utils
from tf_agents.train.utils import strategy_utils
from tf_agents.train.utils import train_utils

tempdir = tempfile.gettempdir()

Hyperparameters

env_name = "MinitaurBulletEnv-v0" # @param {type:"string"}

# Use "num_iterations = 1e6" for better results (2 hrs)
# 1e5 is just so this doesn't take too long (1 hr)
num_iterations = 100000 # @param {type:"integer"}

initial_collect_steps = 10000 # @param {type:"integer"}
collect_steps_per_iteration = 1 # @param {type:"integer"}
replay_buffer_capacity = 10000 # @param {type:"integer"}

batch_size = 256 # @param {type:"integer"}

critic_learning_rate = 3e-4 # @param {type:"number"}
actor_learning_rate = 3e-4 # @param {type:"number"}
alpha_learning_rate = 3e-4 # @param {type:"number"}
target_update_tau = 0.005 # @param {type:"number"}
target_update_period = 1 # @param {type:"number"}
gamma = 0.99 # @param {type:"number"}
reward_scale_factor = 1.0 # @param {type:"number"}

actor_fc_layer_params = (256, 256)
critic_joint_fc_layer_params = (256, 256)

log_interval = 5000 # @param {type:"integer"}

num_eval_episodes = 20 # @param {type:"integer"}
eval_interval = 10000 # @param {type:"integer"}

policy_save_interval = 5000 # @param {type:"integer"}

بيئة

تمثل البيئات في RL المهمة أو المشكلة التي نحاول حلها. يمكن إنشاء البيئات القياسية بسهولة في TF-Agents باستخدام suites . لدينا suites مختلفة لبيئات التحميل من مصادر مثل OpenAI Gym و Atari و DM Control وما إلى ذلك ، مع إعطاء اسم بيئة سلسلة.

لنقم الآن بتحميل بيئة Minituar من مجموعة Pybullet.

env = suite_pybullet.load(env_name)
env.reset()
PIL.Image.fromarray(env.render())
current_dir=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_envs/bullet
urdf_root=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_data
/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/gym/logger.py:30: UserWarning: WARN: Box bound precision lowered by casting to float32
  warnings.warn(colorize('%s: %s'%('WARN', msg % args), 'yellow'))

بي إن جي

في هذه البيئة ، الهدف هو أن يقوم الوكيل بتدريب سياسة من شأنها التحكم في روبوت Minitaur وجعله يتحرك للأمام بأسرع ما يمكن. الحلقات تدوم 1000 خطوة وسيكون العائد هو مجموع المكافآت طوال الحلقة.

لنلقِ نظرة على المعلومات التي توفرها البيئة observation ستستخدمها السياسة لتوليد actions .

print('Observation Spec:')
print(env.time_step_spec().observation)
print('Action Spec:')
print(env.action_spec())
Observation Spec:
BoundedArraySpec(shape=(28,), dtype=dtype('float32'), name='observation', minimum=[  -3.1515927   -3.1515927   -3.1515927   -3.1515927   -3.1515927
   -3.1515927   -3.1515927   -3.1515927 -167.72488   -167.72488
 -167.72488   -167.72488   -167.72488   -167.72488   -167.72488
 -167.72488     -5.71        -5.71        -5.71        -5.71
   -5.71        -5.71        -5.71        -5.71        -1.01
   -1.01        -1.01        -1.01     ], maximum=[  3.1515927   3.1515927   3.1515927   3.1515927   3.1515927   3.1515927
   3.1515927   3.1515927 167.72488   167.72488   167.72488   167.72488
 167.72488   167.72488   167.72488   167.72488     5.71        5.71
   5.71        5.71        5.71        5.71        5.71        5.71
   1.01        1.01        1.01        1.01     ])
Action Spec:
BoundedArraySpec(shape=(8,), dtype=dtype('float32'), name='action', minimum=-1.0, maximum=1.0)

كما نرى ، فإن الملاحظة معقدة إلى حد ما. نتلقى 28 قيمة تمثل الزوايا والسرعات وعزم الدوران لجميع المحركات. في المقابل تتوقع البيئة 8 قيم للإجراءات بين [-1, 1] . هذه هي الزوايا الحركية المرغوبة.

عادة نقوم بإنشاء بيئتين: واحدة لجمع البيانات أثناء التدريب والأخرى للتقييم. تمت كتابة البيئات بلغة بيثون نقية وتستخدم المصفوفات غير المعقدة ، والتي يستهلكها Actor Learner API مباشرة.

collect_env = suite_pybullet.load(env_name)
eval_env = suite_pybullet.load(env_name)
urdf_root=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_data
urdf_root=/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/pybullet_data

أستراتيجية التوزيع

نحن نستخدم DistributionStrategy API لتمكين تشغيل حساب خطوة القطار عبر أجهزة متعددة مثل وحدات معالجة الرسومات المتعددة أو وحدات المعالجة المركزية باستخدام توازي البيانات. خطوة القطار:

  • يتلقى دفعة من بيانات التدريب
  • يقسمها عبر الأجهزة
  • يحسب الخطوة إلى الأمام
  • يجمع ويحسب متوسط ​​الخسارة
  • يحسب الخطوة الخلفية ويقوم بتحديث متغير التدرج

مع TF-Agents Learner API و DistributionStrategy API ، من السهل جدًا التبديل بين تشغيل خطوة القطار على وحدات معالجة الرسومات (باستخدام MirroredStrategy) إلى TPU (باستخدام TPUStrategy) دون تغيير أي من منطق التدريب أدناه.

تمكين GPU

إذا كنت ترغب في تجربة التشغيل على وحدة معالجة الرسومات ، فستحتاج أولاً إلى تمكين وحدات معالجة الرسومات للكمبيوتر الدفتري:

  • انتقل إلى تحرير ← إعدادات الكمبيوتر المحمول
  • حدد GPU من قائمة مسرع الأجهزة المنسدلة

اختيار استراتيجية

استخدم strategy_utils لإنشاء إستراتيجية. تحت غطاء محرك السيارة ، تمرير المعلمة:

  • use_gpu = False إرجاع use_gpu = False tf.distribute.get_strategy() ، والذي يستخدم وحدة المعالجة المركزية
  • use_gpu = True إرجاع use_gpu = True tf.distribute.MirroredStrategy() ، والذي يستخدم جميع وحدات معالجة الرسومات المرئية لـ TensorFlow على جهاز واحد
use_gpu = True

strategy = strategy_utils.get_strategy(tpu=False, use_gpu=use_gpu)
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)

يجب إنشاء جميع المتغيرات والوكلاء في إطار strategy.scope() ، كما سترى أدناه.

وكيل

لإنشاء وكيل SAC ، نحتاج أولاً إلى إنشاء الشبكات التي سيقوم بتدريبها. SAC هي وكيل ممثل وناقد ، لذلك سنحتاج إلى شبكتين.

سيعطينا الناقد تقديرات القيمة لـ Q(s,a) . أي أنها ستتلقى كمدخل ملاحظة وإجراء ، وستعطينا تقديرًا لمدى جودة هذا الإجراء بالنسبة إلى حالة معينة.

observation_spec, action_spec, time_step_spec = (
      spec_utils.get_tensor_specs(collect_env))

with strategy.scope():
  critic_net = critic_network.CriticNetwork(
        (observation_spec, action_spec),
        observation_fc_layer_params=None,
        action_fc_layer_params=None,
        joint_fc_layer_params=critic_joint_fc_layer_params,
        kernel_initializer='glorot_uniform',
        last_kernel_initializer='glorot_uniform')

سنستخدم هذا الناقد لتدريب شبكة actor التي ستسمح لنا بتوليد الإجراءات عند الملاحظة.

ActorNetwork بمعلمات لتوزيع متعدد المتغيرات ActorNetwork . سيتم بعد ذلك أخذ عينات من هذا التوزيع ، بشرط الملاحظة الحالية ، كلما احتجنا إلى إنشاء إجراءات.

with strategy.scope():
  actor_net = actor_distribution_network.ActorDistributionNetwork(
      observation_spec,
      action_spec,
      fc_layer_params=actor_fc_layer_params,
      continuous_projection_net=(
          tanh_normal_projection_network.TanhNormalProjectionNetwork))

مع وجود هذه الشبكات في متناول اليد ، يمكننا الآن إنشاء مثيل للوكيل.

with strategy.scope():
  train_step = train_utils.create_train_step()

  tf_agent = sac_agent.SacAgent(
        time_step_spec,
        action_spec,
        actor_network=actor_net,
        critic_network=critic_net,
        actor_optimizer=tf.compat.v1.train.AdamOptimizer(
            learning_rate=actor_learning_rate),
        critic_optimizer=tf.compat.v1.train.AdamOptimizer(
            learning_rate=critic_learning_rate),
        alpha_optimizer=tf.compat.v1.train.AdamOptimizer(
            learning_rate=alpha_learning_rate),
        target_update_tau=target_update_tau,
        target_update_period=target_update_period,
        td_errors_loss_fn=tf.math.squared_difference,
        gamma=gamma,
        reward_scale_factor=reward_scale_factor,
        train_step_counter=train_step)

  tf_agent.initialize()

إعادة العازلة

من أجل تتبع البيانات التي تم جمعها من البيئة ، سوف نستخدم Reverb ، وهو نظام إعادة تشغيل فعال وقابل للتوسيع وسهل الاستخدام بواسطة Deepmind. يقوم بتخزين بيانات الخبرة التي يجمعها الفاعلون ويستهلكها المتعلم أثناء التدريب.

في هذا البرنامج التعليمي ، هذا أقل أهمية من max_size - ولكن في إعداد موزع مع مجموعة غير max_size وتدريب ، قد ترغب في تجربة rate_limiters.SampleToInsertRatio ، باستخدام sample_per_insert في مكان ما بين 2 و 1000. على سبيل المثال:

rate_limiter=reverb.rate_limiters.SampleToInsertRatio(samples_per_insert=3.0, min_size_to_sample=3, error_buffer=3.0))
table_name = 'uniform_table'
table = reverb.Table(
    table_name,
    max_size=replay_buffer_capacity,
    sampler=reverb.selectors.Uniform(),
    remover=reverb.selectors.Fifo(),
    rate_limiter=reverb.rate_limiters.MinSize(1))

reverb_server = reverb.Server([table])

يتم إنشاء المخزن المؤقت لإعادة التشغيل باستخدام مواصفات تصف الموترات التي سيتم تخزينها ، والتي يمكن الحصول عليها من الوكيل باستخدام tf_agent.collect_data_spec .

نظرًا لأن وكيل SAC يحتاج إلى كل من الملاحظة الحالية والتالية لحساب الخسارة ، فقد قمنا بتعيين sequence_length=2 .

reverb_replay = reverb_replay_buffer.ReverbReplayBuffer(
    tf_agent.collect_data_spec,
    sequence_length=2,
    table_name=table_name,
    local_server=reverb_server)

نقوم الآن بإنشاء مجموعة بيانات TensorFlow من المخزن المؤقت لإعادة تشغيل Reverb. سنقوم بتمرير هذا إلى المتعلم لأخذ عينات من الخبرات للتدريب.

dataset = reverb_replay.as_dataset(
      sample_batch_size=batch_size, num_steps=2).prefetch(50)
experience_dataset_fn = lambda: dataset

سياسات

في TF-Agents ، تمثل السياسات المفهوم القياسي للسياسات في RL: نظرًا time_step تنتج إجراءً أو توزيعًا على الإجراءات. الطريقة الرئيسية هي policy_step = policy.step(time_step) حيث تعد policy_step عبارة عن tuple PolicyStep(action, state, info) . و policy_step.action هو action ليتم تطبيقها على البيئة، و state تمثل الدولة لسياسات جليل (RNN) و info قد تحتوي على معلومات المساعدة مثل الاحتمالات سجل من الإجراءات.

يحتوي الوكلاء على سياستين:

  • agent.policy - السياسة الرئيسية المستخدمة في التقييم والنشر.
  • agent.collect_policy - سياسة ثانية تُستخدم لجمع البيانات.
tf_eval_policy = tf_agent.policy
eval_policy = py_tf_eager_policy.PyTFEagerPolicy(
  tf_eval_policy, use_tf_function=True)
tf_collect_policy = tf_agent.collect_policy
collect_policy = py_tf_eager_policy.PyTFEagerPolicy(
  tf_collect_policy, use_tf_function=True)

يمكن إنشاء السياسات بشكل مستقل عن الوكلاء. على سبيل المثال ، استخدم tf_agents.policies.random_py_policy لإنشاء سياسة ستحدد بشكل عشوائي إجراءً لكل مرة_خطوة.

random_policy = random_py_policy.RandomPyPolicy(
  collect_env.time_step_spec(), collect_env.action_spec())

ممثلين

الفاعل يدير التفاعلات بين السياسة والبيئة.

  • تحتوي على مكونات ممثل مثيل للبيئة (كما py_environment ) ونسخة من متغيرات السياسة.
  • يدير كل عامل فاعل سلسلة من خطوات جمع البيانات بالنظر إلى القيم المحلية لمتغيرات السياسة.
  • يتم إجراء التحديثات المتغيرة بشكل صريح باستخدام مثيل عميل الحاوية المتغيرة في البرنامج النصي للتدريب قبل استدعاء actor.run() .
  • تتم كتابة التجربة التي تمت ملاحظتها في المخزن المؤقت لإعادة التشغيل في كل خطوة من خطوات جمع البيانات.

أثناء تشغيل الممثلين لخطوات جمع البيانات ، يقومون بتمرير مسارات (الحالة ، الإجراء ، المكافأة) إلى المراقب ، الذي يخزنها مؤقتًا ويكتبها إلى نظام إعادة تشغيل Reverb.

نقوم بتخزين مسارات الإطارات [(t0، t1) (t1، t2) (t2، t3)، ...] لأن stride_length=1 .

rb_observer = reverb_utils.ReverbAddTrajectoryObserver(
  reverb_replay.py_client,
  table_name,
  sequence_length=2,
  stride_length=1)

ننشئ ممثلًا بسياسة عشوائية ونجمع الخبرات لبذر المخزن المؤقت لإعادة التشغيل.

initial_collect_actor = actor.Actor(
  collect_env,
  random_policy,
  train_step,
  steps_per_run=initial_collect_steps,
  observers=[rb_observer])
initial_collect_actor.run()

قم بإنشاء ممثل مع سياسة التجميع لجمع المزيد من الخبرات أثناء التدريب.

env_step_metric = py_metrics.EnvironmentSteps()
collect_actor = actor.Actor(
  collect_env,
  collect_policy,
  train_step,
  steps_per_run=1,
  metrics=actor.collect_metrics(10),
  summary_dir=os.path.join(tempdir, learner.TRAIN_DIR),
  observers=[rb_observer, env_step_metric])

قم بإنشاء ممثل يتم استخدامه لتقييم السياسة أثناء التدريب. نمرر actor.eval_metrics(num_eval_episodes) لتسجيل المقاييس لاحقًا.

eval_actor = actor.Actor(
  eval_env,
  eval_policy,
  train_step,
  episodes_per_run=num_eval_episodes,
  metrics=actor.eval_metrics(num_eval_episodes),
  summary_dir=os.path.join(tempdir, 'eval'),
)

المتعلمين

يحتوي مكون المتعلم على العامل ويقوم بإجراء تحديثات خطوة التدرج لمتغيرات السياسة باستخدام بيانات الخبرة من المخزن المؤقت لإعادة التشغيل. بعد خطوة تدريب واحدة أو أكثر ، يمكن للمتعلم دفع مجموعة جديدة من القيم المتغيرة إلى الحاوية المتغيرة.

saved_model_dir = os.path.join(tempdir, learner.POLICY_SAVED_MODEL_DIR)

# Triggers to save the agent's policy checkpoints.
learning_triggers = [
    triggers.PolicySavedModelTrigger(
        saved_model_dir,
        tf_agent,
        train_step,
        interval=policy_save_interval),
    triggers.StepPerSecondLogTrigger(train_step, interval=1000),
]

agent_learner = learner.Learner(
  tempdir,
  train_step,
  tf_agent,
  experience_dataset_fn,
  triggers=learning_triggers)
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/linalg/linear_operator_diag.py:175: calling LinearOperator.__init__ (from tensorflow.python.ops.linalg.linear_operator) with graph_parents is deprecated and will be removed in a future version.
Instructions for updating:
Do not pass `graph_parents`.  They will  no longer be used.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/ops/linalg/linear_operator_diag.py:175: calling LinearOperator.__init__ (from tensorflow.python.ops.linalg.linear_operator) with graph_parents is deprecated and will be removed in a future version.
Instructions for updating:
Do not pass `graph_parents`.  They will  no longer be used.
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fba420077b8>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7fba41dabbe0>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fba420077b8>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7fba300cdc18>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fba420077b8>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7fba30046390>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fba420077b8>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7fb9d4205940>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/policies/collect_policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/collect_policy/assets
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/policies/greedy_policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/greedy_policy/assets
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fba420077b8>". Calling saved_model.distribution() will raise the following assertion error: Unable to make a CompositeTensor for "<tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag object at 0x7fb9c4762780>" of type `<class 'tensorflow.python.ops.linalg.linear_operator_diag.LinearOperatorDiag'>`. Email `tfprobability@tensorflow.org` or file an issue on github if you would benefit from this working. (Unable to serialize: No encoder for object [Tensor("ActorDistributionNetwork/TanhNormalProjectionNetwork/Exp:0", shape=(None, 8), dtype=float32)] of type [<class 'tensorflow.python.framework.ops.Tensor'>].)
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
WARNING:absl:Found untraced functions such as ActorDistributionNetwork_layer_call_fn, ActorDistributionNetwork_layer_call_and_return_conditional_losses, EncodingNetwork_layer_call_fn, EncodingNetwork_layer_call_and_return_conditional_losses, TanhNormalProjectionNetwork_layer_call_fn while saving (showing 5 of 35). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: /tmp/policies/policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/policy/assets
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tf_agents/train/learner.py:122: StrategyBase.experimental_distribute_datasets_from_function (from tensorflow.python.distribute.distribute_lib) is deprecated and will be removed in a future version.
Instructions for updating:
rename to distribute_datasets_from_function
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tf_agents/train/learner.py:122: StrategyBase.experimental_distribute_datasets_from_function (from tensorflow.python.distribute.distribute_lib) is deprecated and will be removed in a future version.
Instructions for updating:
rename to distribute_datasets_from_function

المقاييس والتقييم

قمنا بإنشاء مثيل لـ actor.eval_metrics Actor actor.eval_metrics أعلاه ، مما يؤدي إلى إنشاء المقاييس الأكثر استخدامًا أثناء تقييم السياسة:

  • متوسط ​​العائد. العائد هو مجموع المكافآت التي تم الحصول عليها أثناء تشغيل سياسة في بيئة للحلقة ، وعادةً ما نقوم بتوسيط هذا على عدة حلقات.
  • متوسط ​​طول الحلقة.

نقوم بتشغيل الممثل لتوليد هذه المقاييس.

def get_eval_metrics():
  eval_actor.run()
  results = {}
  for metric in eval_actor.metrics:
    results[metric.name] = metric.result()
  return results

metrics = get_eval_metrics()
def log_eval_metrics(step, metrics):
  eval_results = (', ').join(
      '{} = {:.6f}'.format(name, result) for name, result in metrics.items())
  print('step = {0}: {1}'.format(step, eval_results))

log_eval_metrics(0, metrics)
step = 0: AverageReturn = -0.124731, AverageEpisodeLength = 78.800003

تحقق من وحدة المقاييس للتطبيقات القياسية الأخرى للمقاييس المختلفة.

تدريب الوكيل

تتضمن حلقة التدريب كلاً من جمع البيانات من البيئة وتحسين شبكات الوكيل. على طول الطريق ، سنقوم من حين لآخر بتقييم سياسة الوكيل لنرى كيف نفعل ذلك.

try:
  %%time
except:
  pass

# Reset the train step
tf_agent.train_step_counter.assign(0)

# Evaluate the agent's policy once before training.
avg_return = get_eval_metrics()["AverageReturn"]
returns = [avg_return]

for _ in range(num_iterations):
  # Training.
  collect_actor.run()
  loss_info = agent_learner.run(iterations=1)

  # Evaluating.
  step = agent_learner.train_step_numpy

  if eval_interval and step % eval_interval == 0:
    metrics = get_eval_metrics()
    log_eval_metrics(step, metrics)
    returns.append(metrics["AverageReturn"])

  if log_interval and step % log_interval == 0:
    print('step = {0}: loss = {1}'.format(step, loss_info.loss.numpy()))

rb_observer.close()
reverb_server.stop()
step = 5000: loss = -55.60306167602539
step = 10000: AverageReturn = -0.559712, AverageEpisodeLength = 184.300003
step = 10000: loss = -58.32197189331055
step = 15000: loss = -33.5698356628418
step = 20000: AverageReturn = -0.601861, AverageEpisodeLength = 182.399994
step = 20000: loss = -20.54125213623047
step = 25000: loss = -14.193719863891602
step = 30000: AverageReturn = -0.766069, AverageEpisodeLength = 390.250000
step = 30000: loss = -8.151270866394043
step = 35000: loss = -2.292053461074829
step = 40000: AverageReturn = -1.541966, AverageEpisodeLength = 543.200012
step = 40000: loss = -0.7120634317398071
step = 45000: loss = -0.8187105655670166
step = 50000: AverageReturn = -2.137582, AverageEpisodeLength = 658.900024
step = 50000: loss = -1.6897233724594116
step = 55000: loss = 0.31548842787742615
step = 60000: AverageReturn = -1.671840, AverageEpisodeLength = 547.500000
step = 60000: loss = 1.0235921144485474
step = 65000: loss = -2.057915449142456
step = 70000: AverageReturn = -0.573561, AverageEpisodeLength = 499.000000
step = 70000: loss = 3.6143574714660645
step = 75000: loss = 2.144657850265503
step = 80000: AverageReturn = -0.081639, AverageEpisodeLength = 178.750000
step = 80000: loss = 4.465636253356934
step = 85000: loss = -1.0079187154769897
step = 90000: AverageReturn = 0.034075, AverageEpisodeLength = 57.250000
step = 90000: loss = 0.1975386142730713
step = 95000: loss = -1.4605472087860107
step = 100000: AverageReturn = 0.134377, AverageEpisodeLength = 60.900002
step = 100000: loss = 3.8075790405273438

التصور

المؤامرات

يمكننا رسم متوسط ​​العائد مقابل الخطوات العالمية لمعرفة أداء وكيلنا. في Minitaur ، تعتمد وظيفة المكافأة على المدى الذي يمشي فيه minitaur في 1000 خطوة وتعاقب على إنفاق الطاقة.

steps = range(0, num_iterations + 1, eval_interval)
plt.plot(steps, returns)
plt.ylabel('Average Return')
plt.xlabel('Step')
plt.ylim()
(-2.2511795192956923, 0.2479749947786331)

بي إن جي

أشرطة فيديو

من المفيد تصور أداء الوكيل عن طريق عرض البيئة في كل خطوة. قبل أن نفعل ذلك ، دعنا أولاً ننشئ وظيفة لتضمين مقاطع الفيديو في هذا الكولاب.

def embed_mp4(filename):
  """Embeds an mp4 file in the notebook."""
  video = open(filename,'rb').read()
  b64 = base64.b64encode(video)
  tag = '''
  <video width="640" height="480" controls>
    <source src="data:video/mp4;base64,{0}" type="video/mp4">
  Your browser does not support the video tag.
  </video>'''.format(b64.decode())

  return IPython.display.HTML(tag)

يوضح الكود التالي سياسة الوكيل لبضع حلقات:

num_episodes = 3
video_filename = 'sac_minitaur.mp4'
with imageio.get_writer(video_filename, fps=60) as video:
  for _ in range(num_episodes):
    time_step = eval_env.reset()
    video.append_data(eval_env.render())
    while not time_step.is_last():
      action_step = eval_actor.policy.action(time_step)
      time_step = eval_env.step(action_step.action)
      video.append_data(eval_env.render())

embed_mp4(video_filename)