Actor-Learner API ile SAC minitaur

Telif Hakkı 2021 The TF-Agents Authors.

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Defteri indirin

Giriş

Bu örnek, Minitaur ortamında bir Soft Actor Critic temsilcisinin nasıl eğitileceğini gösterir.

DQN Colab üzerinde çalıştıysanız, bu size çok tanıdık gelecektir. Önemli değişiklikler şunları içerir:

  • Aracıyı DQN'den SAC'ye değiştirme.
  • CartPole'den çok daha karmaşık bir ortam olan Minitaur ile ilgili eğitim. Minitaur ortamı, ilerlemek için dört ayaklı bir robotu eğitmeyi amaçlamaktadır.
  • Dağıtılmış Takviyeli Öğrenme için TF-Aracıları Aktör-Öğrenci API'sini kullanma.

API, hem bir deneyim yeniden oynatma arabelleği ve değişken kapsayıcı (parametre sunucusu) kullanarak dağıtılmış veri toplamayı hem de birden çok cihaza dağıtılmış eğitimi destekler. API, çok basit ve modüler olacak şekilde tasarlanmıştır. Reverb'i hem yeniden oynatma arabelleği hem de değişken kapsayıcı için ve TF DistributionStrategy API'yi GPU'lar ve TPU'lar üzerinde dağıtılmış eğitim için kullanıyoruz.

Aşağıdaki bağımlılıkları yüklemediyseniz, çalıştırın:

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

Kurulum

Önce ihtiyacımız olan farklı araçları içe aktaracağız.

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

Hiperparametreler

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

Çevre

RL'deki ortamlar, çözmeye çalıştığımız görevi veya sorunu temsil eder. Standart ortamlar, suites kullanılarak TF-Agent'larda kolayca oluşturulabilir. Bir string ortam adı verilen OpenAI Gym, Atari, DM Control vb. Kaynaklardan ortamları yüklemek için farklı suites var.

Şimdi Minituar ortamını Pybullet paketinden yükleyelim.

env = suite_pybullet.load(env_name)
env.reset()
PIL.Image.fromarray(env.render())
current_dir=/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pybullet_envs/bullet
urdf_root=/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/pybullet_data
/tmpfs/src/tf_docs_env/lib/python3.7/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

Bu ortamda, temsilcinin Minitaur robotunu kontrol edecek ve olabildiğince hızlı ilerlemesini sağlayacak bir politika geliştirmesi hedefleniyor. Bölümler 1000 adım sürer ve geri dönüş, bölüm boyunca ödüllerin toplamı olacaktır.

Politikanın actions oluşturmak için kullanacağı bir observation olarak çevrenin sağladığı bilgilere bakalım.

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)

Gördüğümüz gibi, gözlem oldukça karmaşık. Tüm motorlar için açıları, hızları ve torkları temsil eden 28 değer alıyoruz. Buna karşılık ortam [-1, 1] arasındaki eylemler için 8 değer beklemektedir. Bunlar istenen motor açılarıdır.

Genellikle iki ortam yaratırız: biri eğitim sırasında veri toplamak için, diğeri değerlendirme için. Ortamlar saf python ile yazılır ve Actor Learner API'sinin doğrudan tükettiği numpy dizileri kullanır.

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

Dağıtım stratejisi

Veri paralelliği kullanarak birden çok GPU veya TPU gibi birden çok cihazda tren adımı hesaplamasının çalıştırılmasını sağlamak için DistributionStrategy API'sini kullanıyoruz. Tren adımı:

  • Bir grup eğitim verisi alır
  • Cihazlara böler
  • İleri adımı hesaplar
  • Kaybın ORTALAMASINI toplar ve hesaplar
  • Geriye doğru adımı hesaplar ve bir gradyan değişken güncellemesi gerçekleştirir

TF-Agent Learner API ve DistributionStrategy API ile, aşağıdaki eğitim mantığını değiştirmeden GPU'larda (MirroredStrategy kullanarak) TPU'lara (TPUStrategy kullanarak) tren adımını çalıştırma arasında geçiş yapmak oldukça kolaydır.

GPU'yu etkinleştirme

Bir GPU üzerinde çalışmayı denemek istiyorsanız, öncelikle dizüstü bilgisayar için GPU'ları etkinleştirmeniz gerekir:

  • Düzenle → Not Defteri Ayarlarına gidin
  • Donanım Hızlandırıcı açılır menüsünden GPU'yu seçin

Bir strateji seçmek

Kullanım strategy_utils bir strateji oluşturmak için. Kaputun altında, parametreyi geçerek:

use_gpu = True

strategy = strategy_utils.get_strategy(tpu=False, use_gpu=use_gpu)
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
WARNING:tensorflow:Collective ops is not configured at program startup. Some performance features may not be enabled.
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',)

Aşağıda göreceğiniz gibi, tüm değişkenlerin ve Aracıların strategy.scope() altında oluşturulması gerekir.

Ajan

Bir SAC Aracısı oluşturmak için önce eğiteceği ağları oluşturmamız gerekir. SAC, aktör-eleştirmen bir ajandır, bu nedenle iki ağa ihtiyacımız olacak.

Eleştirmen bize Q(s,a) için değer tahminleri verecektir. Yani, girdi olarak bir gözlem ve bir eylem alacak ve bize bu eylemin belirli bir durum için ne kadar iyi olduğuna dair bir tahmin verecektir.

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

Bu eleştirmeni, bir gözlem verildiğinde eylemler oluşturmamızı sağlayacak bir actor ağını eğitmek için kullanacağız.

ActorNetwork , tanh-sıkıştırılmış Çok Değişkenli ActorNetwork dağılımı için parametreleri tahmin edecektir. Daha sonra, eylemler üretmemiz gerektiğinde, bu dağılım örneklenecek ve mevcut gözlemle koşullandırılacaktır.

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

Elimizdeki bu ağlarla artık ajanı somutlaştırabiliriz.

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

Yeniden Oynatma Arabelleği

Çevreden toplanan verilerin takip etmek amacıyla, kullanacağı Reverb , Deepmind etkin, genişletilebilir ve kolay kullanımlı yeniden oynatma sistemi. Aktörler tarafından toplanan ve eğitim sırasında Öğrenci tarafından tüketilen deneyim verilerini depolar.

Bu eğiticide, bu, max_size daha az önemlidir - ancak eşzamansız toplama ve eğitim içeren dağıtılmış bir ortamda, muhtemelen rate_limiters.SampleToInsertRatio ile deneme yapmak rate_limiters.SampleToInsertRatio

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

Yeniden oynatma tamponu, tf_agent.collect_data_spec kullanılarak tf_agent.collect_data_spec elde edilebilecek depolanacak tensörleri tanımlayan özellikler kullanılarak tf_agent.collect_data_spec .

SAC Aracısı kaybı hesaplamak için hem geçerli hem de sonraki gözleme ihtiyaç duyduğundan, sequ_length sequence_length=2 ayarını yaparız.

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

Şimdi, Reverb yeniden oynatma arabelleğinden bir TensorFlow veri kümesi oluşturuyoruz. Eğitim deneyimlerini örneklemesi için bunu Öğrenciye ileteceğiz.

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

Politikalar

TF-Agent'larda politikalar, time_step standart politika kavramını temsil eder: bir zaman time_step verildiğinde, bir eylem veya eylemler üzerinden bir dağıtım üretir. Ana yöntem, policy_step = policy.step(time_step) ' policy_step ; burada policy_step , adlandırılmış bir demet PolicyStep(action, state, info) . policy_step.action ortama uygulanacak action , durum, durum bilgisi olan (RNN) politikaların state temsil eder ve info , eylemlerin günlük olasılıkları gibi yardımcı bilgiler içerebilir.

Aracılar iki politika içerir:

  • agent.policy - Değerlendirme ve dağıtım için kullanılan ana politika.
  • agent.collect_policy - Veri toplama için kullanılan ikinci bir politika.
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)

Politikalar, aracılardan bağımsız olarak oluşturulabilir. Örneğin, tf_agents.policies.random_py_policy , her bir time_step için rastgele bir eylem seçecek bir politika oluşturmak için kullanın.

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

Aktörler

Aktör, bir politika ile çevre arasındaki etkileşimleri yönetir.

  • Actor bileşenleri, ortamın bir örneğini ( py_environment ) ve politika değişkenlerinin bir kopyasını içerir.
  • Her Actor çalışanı, ilke değişkenlerinin yerel değerleri verilen bir dizi veri toplama adımını çalıştırır.
  • Değişken güncellemeleri, actor.run() çağrılmadan önce eğitim komut dosyasındaki değişken kapsayıcı istemci örneği kullanılarak açıkça yapılır.
  • Gözlemlenen deneyim, her veri toplama adımında yeniden oynatma arabelleğine yazılır.

Aktörler veri toplama adımlarını çalıştırdıkça, gözlemciye (durum, eylem, ödül) yörüngelerini geçirirler, bu da onları Yankı yeniden oynatma sistemine önbelleğe alıp yazar.

[(T0, t1) (t1, t2) (t2, t3), ...] çerçeveler için yörüngeleri saklıyoruz çünkü stride_length=1 .

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

Rastgele politikayla bir Aktör yaratıyoruz ve tekrar tamponunu tohumlamak için deneyimler topluyoruz.

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

Eğitim sırasında daha fazla deneyim toplamak için bir Aktöre toplama politikası uygulayın.

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

Eğitim sırasında politikayı değerlendirmek için kullanılacak bir Aktör oluşturun. Metrikleri daha sonra günlüğe actor.eval_metrics(num_eval_episodes) için actor.eval_metrics(num_eval_episodes) ı 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'),
)

Öğrenciler

Öğrenci bileşeni, aracıyı içerir ve yeniden oynatma arabelleğinden gelen deneyim verilerini kullanarak ilke değişkenlerinde gradyan adımı güncellemeleri gerçekleştirir. Bir veya daha fazla eğitim adımından sonra Öğrenci, değişken kabına yeni bir değişken değerleri kümesi gönderebilir.

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:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fa28994fe50>". 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 0x7fa28985a6d0>" 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 0x7fa28994fe50>". 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 0x7fa27c71c250>" 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:Function `function_with_signature` contains input name(s) 0/step_type, 0/reward, 0/discount, 0/observation with unsupported characters which will be renamed to step_type, reward, discount, observation in the SavedModel.
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fa28994fe50>". 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 0x7fa27c4cbd50>" 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:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file "keras.metadata" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).

FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.
WARNING:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file "keras.metadata" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).

FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.
INFO:tensorflow:Assets written to: /tmp/policies/policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/policy/assets
WARNING:absl:Function `function_with_signature` contains input name(s) 0/step_type, 0/reward, 0/discount, 0/observation with unsupported characters which will be renamed to step_type, reward, discount, observation in the SavedModel.
WARNING:absl:WARNING: Could not serialize policy.distribution() for policy "<tf_agents.policies.actor_policy.ActorPolicy object at 0x7fa28994fe50>". 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 0x7fa2898ab350>" 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:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file "keras.metadata" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).

FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.
WARNING:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file "keras.metadata" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).

FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.
INFO:tensorflow:Assets written to: /tmp/policies/collect_policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/collect_policy/assets
WARNING:absl:Function `function_with_signature` contains input name(s) 0/step_type, 0/reward, 0/discount, 0/observation with unsupported characters which will be renamed to step_type, reward, discount, observation in the SavedModel.
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:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file "keras.metadata" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).

FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.
WARNING:tensorflow:FOR KERAS USERS: The object that you are saving contains one or more Keras models or layers. If you are loading the SavedModel with `tf.keras.models.load_model`, continue reading (otherwise, you may ignore the following instructions). Please change your code to save with `tf.keras.models.save_model` or `model.save`, and confirm that the file "keras.metadata" exists in the export directory. In the future, Keras will only load the SavedModels that have this file. In other words, `tf.saved_model.save` will no longer write SavedModels that can be recovered as Keras models (this will apply in TF 2.5).

FOR DEVS: If you are overwriting _tracking_metadata in your class, this property has been used to save metadata in the SavedModel. The metadta field will be deprecated soon, so please move the metadata to a different file.
INFO:tensorflow:Assets written to: /tmp/policies/greedy_policy/assets
INFO:tensorflow:Assets written to: /tmp/policies/greedy_policy/assets
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tf_agents/train/learner.py:146: 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.7/site-packages/tf_agents/train/learner.py:146: 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

Ölçümler ve Değerlendirme

Politika değerlendirmesi sırasında en sık kullanılan metrikleri oluşturan yukarıda actor.eval_metrics ile değerlendirici actor.eval_metrics somutlaştırdık:

  • Ortalama getiri. Geri dönüş, bir bölüm için bir ortamda bir politika yürütürken elde edilen ödüllerin toplamıdır ve genellikle bunun birkaç bölüm boyunca ortalamasını alırız.
  • Ortalama bölüm uzunluğu.

Bu ölçümleri oluşturmak için Actor'u çalıştırıyoruz.

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.256803, AverageEpisodeLength = 55.599998

Farklı metriklerin diğer standart uygulamaları için metrikler modülüne göz atın.

Temsilcinin eğitimi

Eğitim döngüsü, hem ortamdan veri toplamayı hem de aracının ağlarını optimize etmeyi içerir. Yol boyunca, ne durumda olduğumuzu görmek için zaman zaman temsilcinin politikasını değerlendireceğiz.

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 = -48.70292282104492
step = 10000: AverageReturn = -0.241995, AverageEpisodeLength = 122.949997
step = 10000: loss = -59.98332214355469
step = 15000: loss = -35.55713653564453
step = 20000: AverageReturn = -0.607229, AverageEpisodeLength = 221.500000
step = 20000: loss = -22.29997444152832
step = 25000: loss = -12.32511043548584
step = 30000: AverageReturn = -1.270276, AverageEpisodeLength = 410.549988
step = 30000: loss = -6.429823398590088
step = 35000: loss = -1.2349894046783447
step = 40000: AverageReturn = -0.467371, AverageEpisodeLength = 492.149994
step = 40000: loss = -4.74995231628418
step = 45000: loss = -2.0106310844421387
step = 50000: AverageReturn = -0.827860, AverageEpisodeLength = 548.849976
step = 50000: loss = -2.952303886413574
step = 55000: loss = 0.84348464012146
step = 60000: AverageReturn = -0.172424, AverageEpisodeLength = 572.549988
step = 60000: loss = -3.286008596420288
step = 65000: loss = -0.6228725910186768
step = 70000: AverageReturn = -0.090871, AverageEpisodeLength = 450.049988
step = 70000: loss = -0.7660086154937744
step = 75000: loss = 0.5882142782211304
step = 80000: AverageReturn = 0.392658, AverageEpisodeLength = 457.850006
step = 80000: loss = 0.8202561736106873
step = 85000: loss = 0.8028820157051086
step = 90000: AverageReturn = 0.564336, AverageEpisodeLength = 317.450012
step = 90000: loss = 0.3934253454208374
step = 95000: loss = 2.7876131534576416
step = 100000: AverageReturn = 1.998965, AverageEpisodeLength = 646.400024
step = 100000: loss = 4.307077884674072

Görselleştirme

Arsalar

Temsilcimizin performansını görmek için ortalama getiri ile küresel adımları karşılaştırabiliriz. Minitaur ödül işlevi, minitaur'un 1000 adımda ne kadar yürüdüğüne dayanır ve enerji tüketimini cezalandırır.

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

png

VİDEOLAR

Her adımda ortamı oluşturarak bir aracının performansını görselleştirmek faydalıdır. Bunu yapmadan önce, videoları bu derlemede yerleştirmek için bir işlev oluşturalım.

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)

Aşağıdaki kod, temsilcinin birkaç bölüm için politikasını görselleştirir:

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)