الشبكات

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

مقدمة

سنغطي في هذا الكولاب كيفية تحديد الشبكات المخصصة لوكلائك. تساعدنا الشبكات في تحديد النموذج الذي يتم تدريبه من قبل الوكلاء. ستجد في TF-Agents عدة أنواع مختلفة من الشبكات المفيدة عبر الوكلاء:

الشبكات الرئيسية

  • QNetwork: المستخدمة في Qlearning لبيئات مع الإجراءات المنفصلة، هذه الشبكة خرائط ملاحظة لتقديرات قيمة كل الإجراءات الممكنة.
  • CriticNetworks: كما يشار إلى ValueNetworks في الأدب، ويتعلم لتقدير بعض نسخة من وظيفة قيمة رسم خرائط بعض الدول إلى تقدير العائد المتوقع من هذه السياسة. تقدر هذه الشبكات مدى جودة حالة الوكيل حاليًا.
  • ActorNetworks: تعلم رسم الخرائط من الملاحظات على الإجراءات. تُستخدم هذه الشبكات عادةً بواسطة سياساتنا لإنشاء الإجراءات.
  • ActorDistributionNetworks: على غرار ActorNetworks لكن هذه توليد التوزيع التي تمثل سياسة ويمكن بعد ذلك عينة لتوليد الأعمال.

شبكات المساعدة

  • EncodingNetwork: يسمح للمستخدمين بسهولة تحديد تعيين طبقات تجهيز ما قبل تطبيق لإدخال الشبكة.
  • DynamicUnrollLayer: يعيد تلقائيا حالة الشبكة على حدود حلقة كما يتم تطبيقه على التسلسل الزمني.
  • ProjectionNetwork: شبكات مثل CategoricalProjectionNetwork أو NormalProjectionNetwork تأخذ المدخلات وتوليد المعلمات المطلوبة لتوليد القاطع، أو التوزيع الطبيعي.

جميع الأمثلة في TF-Agents تأتي مع شبكات مهيأة مسبقًا. ومع ذلك ، لم يتم إعداد هذه الشبكات للتعامل مع الملاحظات المعقدة.

إذا كانت لديك بيئة تعرض أكثر من ملاحظة / إجراء وتحتاج إلى تخصيص شبكاتك ، فهذا البرنامج التعليمي يناسبك!

اقامة

إذا لم تقم بتثبيت وكلاء tf حتى الآن ، فقم بتشغيل:

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

import abc
import tensorflow as tf
import numpy as np

from tf_agents.environments import random_py_environment
from tf_agents.environments import tf_py_environment
from tf_agents.networks import encoding_network
from tf_agents.networks import network
from tf_agents.networks import utils
from tf_agents.specs import array_spec
from tf_agents.utils import common as common_utils
from tf_agents.utils import nest_utils

تعريف الشبكات

واجهة برمجة تطبيقات الشبكة

في وكلاء TF نحن فئة فرعية من Keras الشبكات . مع ذلك يمكننا:

  • تبسيط عمليات النسخ المطلوبة عند إنشاء الشبكات المستهدفة.
  • أداء إنشاء متغير التلقائي عند الاتصال network.variables() .
  • تحقق من صحة المدخلات بناءً على مدخلات الشبكة.

EncodingNetwork

وكما ذكر أعلاه و EncodingNetwork يسمح لنا بتحديد بسهولة تعيين طبقات ما قبل المعالجة لتطبيق لإدخال الشبكة لتوليد بعض الترميز.

تتكون شبكة الترميز من الطبقات الاختيارية التالية في الغالب:

  • طبقات المعالجة المسبقة
  • وحدة المعالجة المسبقة
  • Conv2D
  • تتسطح
  • كثيف

الشيء المميز في شبكات التشفير هو أنه يتم تطبيق المعالجة المسبقة للمدخلات. تجهيزها الإدخال ممكن عبر preprocessing_layers و preprocessing_combiner طبقات. يمكن تحديد كل منها كبنية متداخلة. إذا كان preprocessing_layers العش هو أقل عمقا من input_tensor_spec ، ثم طبقات سوف تحصل على subnests. على سبيل المثال ، إذا:

input_tensor_spec = ([TensorSpec(3)] * 2, [TensorSpec(3)] * 5)
preprocessing_layers = (Layer1(), Layer2())

ثم سوف تستدعي المعالجة المسبقة:

preprocessed = [preprocessing_layers[0](observations[0]),
                preprocessing_layers[1](observations[1])]

ومع ذلك، إذا

preprocessing_layers = ([Layer1() for _ in range(2)],
                        [Layer2() for _ in range(5)])

ثم سوف تستدعي المعالجة المسبقة:

preprocessed = [
  layer(obs) for layer, obs in zip(flatten(preprocessing_layers),
                                    flatten(observations))
]

الشبكات المخصصة

لإنشاء شبكات الخاصة بك سيكون لديك فقط لتجاوز __init__ و call الأساليب. دعونا خلق شبكة مخصصة باستخدام ما تعلمناه عن EncodingNetworks لخلق ActorNetwork التي تأخذ الملاحظات التي تحتوي على صورة والنواقل.

class ActorNetwork(network.Network):

  def __init__(self,
               observation_spec,
               action_spec,
               preprocessing_layers=None,
               preprocessing_combiner=None,
               conv_layer_params=None,
               fc_layer_params=(75, 40),
               dropout_layer_params=None,
               activation_fn=tf.keras.activations.relu,
               enable_last_layer_zero_initializer=False,
               name='ActorNetwork'):
    super(ActorNetwork, self).__init__(
        input_tensor_spec=observation_spec, state_spec=(), name=name)

    # For simplicity we will only support a single action float output.
    self._action_spec = action_spec
    flat_action_spec = tf.nest.flatten(action_spec)
    if len(flat_action_spec) > 1:
      raise ValueError('Only a single action is supported by this network')
    self._single_action_spec = flat_action_spec[0]
    if self._single_action_spec.dtype not in [tf.float32, tf.float64]:
      raise ValueError('Only float actions are supported by this network.')

    kernel_initializer = tf.keras.initializers.VarianceScaling(
        scale=1. / 3., mode='fan_in', distribution='uniform')
    self._encoder = encoding_network.EncodingNetwork(
        observation_spec,
        preprocessing_layers=preprocessing_layers,
        preprocessing_combiner=preprocessing_combiner,
        conv_layer_params=conv_layer_params,
        fc_layer_params=fc_layer_params,
        dropout_layer_params=dropout_layer_params,
        activation_fn=activation_fn,
        kernel_initializer=kernel_initializer,
        batch_squash=False)

    initializer = tf.keras.initializers.RandomUniform(
        minval=-0.003, maxval=0.003)

    self._action_projection_layer = tf.keras.layers.Dense(
        flat_action_spec[0].shape.num_elements(),
        activation=tf.keras.activations.tanh,
        kernel_initializer=initializer,
        name='action')

  def call(self, observations, step_type=(), network_state=()):
    outer_rank = nest_utils.get_outer_rank(observations, self.input_tensor_spec)
    # We use batch_squash here in case the observations have a time sequence
    # compoment.
    batch_squash = utils.BatchSquash(outer_rank)
    observations = tf.nest.map_structure(batch_squash.flatten, observations)

    state, network_state = self._encoder(
        observations, step_type=step_type, network_state=network_state)
    actions = self._action_projection_layer(state)
    actions = common_utils.scale_to_spec(actions, self._single_action_spec)
    actions = batch_squash.unflatten(actions)
    return tf.nest.pack_sequence_as(self._action_spec, [actions]), network_state

دعونا خلق RandomPyEnvironment لتوليد الملاحظات منظم والتحقق من صحة تنفيذنا.

action_spec = array_spec.BoundedArraySpec((3,), np.float32, minimum=0, maximum=10)
observation_spec =  {
    'image': array_spec.BoundedArraySpec((16, 16, 3), np.float32, minimum=0,
                                        maximum=255),
    'vector': array_spec.BoundedArraySpec((5,), np.float32, minimum=-100,
                                          maximum=100)}

random_env = random_py_environment.RandomPyEnvironment(observation_spec, action_spec=action_spec)

# Convert the environment to a TFEnv to generate tensors.
tf_env = tf_py_environment.TFPyEnvironment(random_env)

نظرًا لأننا حددنا الملاحظات على أنها إملاء ، نحتاج إلى إنشاء طبقات معالجة مسبقة للتعامل معها.

preprocessing_layers = {
    'image': tf.keras.models.Sequential([tf.keras.layers.Conv2D(8, 4),
                                        tf.keras.layers.Flatten()]),
    'vector': tf.keras.layers.Dense(5)
    }
preprocessing_combiner = tf.keras.layers.Concatenate(axis=-1)
actor = ActorNetwork(tf_env.observation_spec(), 
                     tf_env.action_spec(),
                     preprocessing_layers=preprocessing_layers,
                     preprocessing_combiner=preprocessing_combiner)

الآن بعد أن أصبح لدينا شبكة الممثلين ، يمكننا معالجة الملاحظات من البيئة.

time_step = tf_env.reset()
actor(time_step.observation, time_step.step_type)
(<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[4.5753636, 4.946792 , 4.853481 ]], dtype=float32)>,
 ())

يمكن استخدام هذه الاستراتيجية نفسها لتخصيص أي من الشبكات الرئيسية المستخدمة من قبل الوكلاء. يمكنك تحديد أي معالجة مسبقة وتوصيلها ببقية الشبكة. أثناء تحديد العرف الخاص بك ، تأكد من تطابق تعريفات طبقة الإخراج الخاصة بالشبكة.