Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Minitaur SAC dengan Actor-Learner API

Hak Cipta 2021 The TF-Agents Authors.

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

pengantar

Contoh ini menunjukkan cara melatih agen Kritikus Aktor Lunak di lingkungan Minitaur .

Jika Anda telah mengerjakan DQN Colab, ini akan terasa sangat familiar. Perubahan penting termasuk:

  • Mengubah agen dari DQN ke SAC.
  • Pelatihan Minitaur yang merupakan lingkungan yang jauh lebih kompleks daripada CartPole. Lingkungan Minitaur bertujuan untuk melatih robot berkaki empat untuk bergerak maju.
  • Menggunakan TF-Agents Actor-Learner API untuk Reinforcement Learning yang didistribusikan.

API mendukung pengumpulan data terdistribusi menggunakan buffer replay pengalaman dan container variabel (server parameter) serta pelatihan terdistribusi di beberapa perangkat. API dirancang untuk menjadi sangat sederhana dan modular. Kami menggunakan Reverb untuk replay buffer dan variable container serta TF DistributionStrategy API untuk pelatihan terdistribusi pada GPU dan TPU.

Jika Anda belum menginstal dependensi berikut, jalankan:

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

Mendirikan

Pertama kita akan mengimpor alat berbeda yang kita butuhkan.

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()

Hyperparameter

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"}

Lingkungan Hidup

Lingkungan di RL mewakili tugas atau masalah yang kami coba selesaikan. Lingkungan standar dapat dengan mudah dibuat di TF-Agents menggunakan suites . Kami memiliki suites berbeda untuk memuat lingkungan dari sumber seperti OpenAI Gym, Atari, DM Control, dll., Dengan nama lingkungan string.

Sekarang mari memuat lingkungan Minituar dari suite 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'))

png

Dalam lingkungan ini tujuannya adalah agar agen melatih kebijakan yang akan mengendalikan robot Minitaur dan membuatnya bergerak maju secepat mungkin. Episode terakhir 1000 langkah dan hasilnya akan menjadi jumlah hadiah sepanjang episode.

Mari kita lihat informasi yang diberikan lingkungan sebagai observation yang akan digunakan oleh kebijakan untuk menghasilkan 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)

Seperti yang bisa kita lihat, observasi ini cukup kompleks. Kami menerima 28 nilai yang mewakili sudut, kecepatan dan torsi untuk semua motor. Sebagai imbalannya lingkungan mengharapkan 8 nilai untuk tindakan antara [-1, 1] . Ini adalah sudut motor yang diinginkan.

Biasanya kami membuat dua lingkungan: satu untuk mengumpulkan data selama pelatihan dan satu lagi untuk evaluasi. Lingkungan ditulis dalam python murni dan menggunakan larik numpy, yang digunakan langsung oleh 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

Strategi Distribusi

Kami menggunakan DistributionStrategy API untuk mengaktifkan penghitungan train step di beberapa perangkat seperti beberapa GPU atau TPU menggunakan paralelisme data. Langkah kereta:

  • Menerima sekumpulan data pelatihan
  • Membaginya di seluruh perangkat
  • Menghitung langkah maju
  • Mengumpulkan dan menghitung MEAN dari kerugian
  • Menghitung langkah mundur dan melakukan pembaruan variabel gradien

Dengan TF-Agents Learner API dan DistributionStrategy API, cukup mudah untuk beralih antara menjalankan train step pada GPU (menggunakan MirroredStrategy) ke TPU (menggunakan TPUStrategy) tanpa mengubah logika pelatihan apa pun di bawah ini.

Mengaktifkan GPU

Jika Anda ingin mencoba menjalankan GPU, Anda harus mengaktifkan GPU untuk notebook terlebih dahulu:

  • Arahkan ke Edit → Pengaturan Notebook
  • Pilih GPU dari drop-down Hardware Accelerator

Memilih strategi

Gunakan strategy_utils untuk menghasilkan strategi. Di bawah tenda, meneruskan parameter:

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',)

Semua variabel dan Agen perlu dibuat di strategy.scope() , seperti yang akan Anda lihat di bawah.

Agen

Untuk membuat Agen SAC, pertama-tama kita perlu membuat jaringan yang akan dilatihnya. SAC adalah agen kritikus aktor, jadi kita membutuhkan dua jaringan.

Kritikus akan memberi kita perkiraan nilai untuk Q(s,a) . Artinya, itu akan menerima masukan observasi dan tindakan, dan itu akan memberi kita perkiraan seberapa baik tindakan itu untuk keadaan tertentu.

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')

Kami akan menggunakan kritik ini untuk melatih jaringan actor yang akan memungkinkan kami menghasilkan tindakan dengan pengamatan.

ActorNetwork akan memprediksi parameter untuk distribusi MultivariateNormalDiag yang ActorNetwork tanh. Distribusi ini kemudian akan diambil sampelnya, dikondisikan pada pengamatan saat ini, kapan pun kita perlu menghasilkan tindakan.

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))

Dengan jaringan ini di tangan, kami sekarang dapat memberi contoh agen.

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()
.dll

Putar Ulang Buffer

Untuk melacak data yang dikumpulkan dari lingkungan, kami akan menggunakan Reverb , sistem replay yang efisien, dapat diperluas, dan mudah digunakan oleh Deepmind. Ini menyimpan data pengalaman yang dikumpulkan oleh Aktor dan dikonsumsi oleh Pelajar selama pelatihan.

Dalam tutorial ini, ini kurang penting daripada max_size - tetapi dalam pengaturan terdistribusi dengan async collection dan training, Anda mungkin ingin bereksperimen dengan rate_limiters.SampleToInsertRatio , menggunakan sample_per_insert di antara 2 dan 1000. Misalnya:

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])

Buffer replay dibangun menggunakan spesifikasi yang menjelaskan tensor yang akan disimpan, yang dapat diperoleh dari agen menggunakan tf_agent.collect_data_spec .

Karena Agen SAC membutuhkan observasi saat ini dan selanjutnya untuk menghitung kerugian, kami menetapkan 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)

Sekarang kami membuat set data TensorFlow dari buffer replay Reverb. Kami akan meneruskan ini kepada Pelajar untuk mencicipi pengalaman untuk pelatihan.

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

Kebijakan

Di TF-Agents, kebijakan mewakili gagasan standar kebijakan di RL: jika time_step menghasilkan tindakan atau distribusi tindakan. Metode utamanya adalah policy_step = policy.step(time_step) mana policy_step adalah tuple PolicyStep(action, state, info) . policy_step.action adalah action akan diterapkan ke lingkungan, state mewakili status kebijakan stateful (RNN) dan info mungkin berisi informasi tambahan seperti probabilitas log tindakan.

Agen berisi dua kebijakan:

  • agent.policy - Kebijakan utama yang digunakan untuk evaluasi dan penyebaran.
  • agent.collect_policy - Kebijakan kedua yang digunakan untuk pengumpulan data.
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)

Kebijakan dapat dibuat secara independen dari agen. Misalnya, gunakan tf_agents.policies.random_py_policy untuk membuat kebijakan yang akan memilih tindakan secara acak untuk setiap langkah_waktu.

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

Aktor

Aktor mengelola interaksi antara kebijakan dan lingkungan.

  • Komponen Actor berisi instance dari lingkungan (sebagai py_environment ) dan salinan variabel kebijakan.
  • Setiap pekerja Aktor menjalankan urutan langkah pengumpulan data berdasarkan nilai lokal dari variabel kebijakan.
  • Pembaruan variabel dilakukan secara eksplisit menggunakan instance klien penampung variabel dalam skrip pelatihan sebelum memanggil actor.run() .
  • Pengalaman yang diamati ditulis ke dalam buffer pemutaran ulang di setiap langkah pengumpulan data.

Saat Aktor menjalankan langkah pengumpulan data, mereka meneruskan lintasan (status, tindakan, penghargaan) ke pengamat, yang menyimpan dan menuliskannya ke sistem replay Reverb.

Kami menyimpan lintasan untuk bingkai [(t0, t1) (t1, t2) (t2, t3), ...] karena stride_length=1 .

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

Kami membuat Aktor dengan kebijakan acak dan mengumpulkan pengalaman untuk menyemai buffer replay.

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

Buat instance Aktor dengan kebijakan kumpulkan untuk mengumpulkan lebih banyak pengalaman selama pelatihan.

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])

Buat Aktor yang akan digunakan untuk mengevaluasi kebijakan selama pelatihan. Kami meneruskan actor.eval_metrics(num_eval_episodes) untuk mencatat metrik nanti.

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'),
)

Peserta didik

Komponen Pelajar berisi agen dan melakukan pembaruan langkah gradien ke variabel kebijakan menggunakan data pengalaman dari buffer pemutaran ulang. Setelah satu atau beberapa langkah pelatihan, Peserta dapat mendorong sekumpulan nilai variabel baru ke penampung variabel.

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 0x7f1dff58ef60>". 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 0x7f1dff33efd0>" 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 0x7f1dff58ef60>". 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 0x7f1dff217cc0>" 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 0x7f1dff58ef60>". 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 0x7f1dff139e80>" 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 0x7f1dff58ef60>". 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 0x7f1d8b16ea90>" 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 0x7f1dff58ef60>". 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 0x7f1d8af23be0>" 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

Metrik dan Evaluasi

Kami membuat instance eval Actor dengan actor.eval_metrics atas, yang membuat metrik yang paling umum digunakan selama evaluasi kebijakan:

  • Pengembalian rata-rata. Imbalannya adalah jumlah hadiah yang diperoleh saat menjalankan kebijakan di lingkungan untuk sebuah episode, dan kami biasanya menghitung rata-rata ini selama beberapa episode.
  • Durasi episode rata-rata.

Kami menjalankan Aktor untuk menghasilkan metrik ini.

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.346627, AverageEpisodeLength = 86.349998

Lihat modul metrik untuk implementasi standar lainnya dari metrik yang berbeda.

Melatih agen

Loop pelatihan melibatkan pengumpulan data dari lingkungan dan mengoptimalkan jaringan agen. Dalam prosesnya, kami sesekali akan mengevaluasi kebijakan agen untuk melihat kinerja kami.

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 = -56.69059753417969
step = 10000: AverageReturn = -0.472410, AverageEpisodeLength = 164.899994
step = 10000: loss = -54.17033004760742
step = 15000: loss = -28.52847671508789
step = 20000: AverageReturn = -0.172086, AverageEpisodeLength = 93.349998
step = 20000: loss = -20.480314254760742
step = 25000: loss = -12.228870391845703
step = 30000: AverageReturn = -0.775230, AverageEpisodeLength = 251.449997
step = 30000: loss = -7.371895790100098
step = 35000: loss = -5.757593154907227
step = 40000: AverageReturn = -1.189717, AverageEpisodeLength = 330.600006
step = 40000: loss = -2.23077654838562
step = 45000: loss = -2.0682435035705566
step = 50000: AverageReturn = -1.436991, AverageEpisodeLength = 592.700012
step = 50000: loss = 2.793757438659668
step = 55000: loss = 0.9165877103805542
step = 60000: AverageReturn = -1.421196, AverageEpisodeLength = 630.849976
step = 60000: loss = -1.5204321146011353
step = 65000: loss = 1.119447112083435
step = 70000: AverageReturn = -0.937966, AverageEpisodeLength = 574.400024
step = 70000: loss = 4.193424224853516
step = 75000: loss = 4.100306034088135
step = 80000: AverageReturn = 0.252701, AverageEpisodeLength = 527.799988
step = 80000: loss = -1.2829862833023071
step = 85000: loss = -3.3187692165374756
step = 90000: AverageReturn = 1.051066, AverageEpisodeLength = 614.000000
step = 90000: loss = -0.4716823101043701
step = 95000: loss = 0.616091251373291
step = 100000: AverageReturn = 0.888614, AverageEpisodeLength = 376.600006
step = 100000: loss = -0.057090915739536285

Visualisasi

Plot

Kami dapat merencanakan pengembalian rata-rata vs langkah global untuk melihat kinerja agen kami. Di Minitaur , fungsi penghargaan didasarkan pada seberapa jauh minitaur berjalan dalam 1000 langkah dan menghukum pengeluaran energi.

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

png

Video

Sangat membantu untuk memvisualisasikan kinerja agen dengan merender lingkungan di setiap langkah. Sebelum kita melakukan itu, mari kita buat dulu fungsi untuk menyematkan video di colab ini.

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)

Kode berikut memvisualisasikan kebijakan agen untuk beberapa episode:

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)