ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

الشبكات

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

المقدمة

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

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

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

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

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

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

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

اقامة

إذا لم تقم بتثبيت وكلاء tf بعد ، فقم بتشغيل:

pip install -q 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.compat.v1.enable_v2_behavior()

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

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

في TF-Agents ، صنفنا فئة فرعية من شبكات Keras. مع ذلك يمكننا:

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

شبكة الترميز

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

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

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

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

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

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

preprocessed = [preprocessing_layers[0](observations[0]),
                preprocessing_layers[1](obsrevations[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 لتوليد ملاحظات منظمة والتحقق من صحة 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([[7.026863 , 4.5458393, 4.7681847]], dtype=float32)>,
 ())

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