深度强化学习-DDPG代码阅读-ddpg.py(1)

目录

1.编写ddpg.py

1.1 导入需要的包和其他的python文件

1.2 定义训练函数train()

1.2.1 代码总括

1.2.2 代码分解

1.3 定义测试函数test()

1.3.1 代码总括

1.3.2 代码分解

1.4 定义主函数

1.4.1 代码总括

1.4.2 代码分解

1.5 根据需要调用训练函数或者测试函数

1.6 问题


1.编写ddpg.py

首先编写ddpg.py文件,其中包含的步骤如下:

1.1 导入需要的包和其他的python文件

import tensorflow as tf
import numpy as np
import gym
from gym import wrappers
import argparse
import pprint as pp
import sys

from replay_buffer import ReplayBuffer
from AandC import *
from TrainOrTest import *

这段代码导入了一些常用的 Python 模块和自定义的模块,包括 tensorflownumpygymargparsepprintsys,以及自定义的 replay_bufferAandCTrainOrTest 模块。

具体解释如下:

  • tensorflow:用于进行深度学习模型的定义和训练。
  • numpy:用于进行数值计算和数组操作。
  • gym:OpenAI Gym 的 Python 环境,用于构建和训练强化学习智能体。
  • argparse:用于解析命令行参数。
  • pprint:用于漂亮地打印 Python 对象。
  • sys:用于访问系统相关的功能,例如命令行参数。
  • replay_buffer:自定义的回放缓冲区类,用于存储和采样经验数据。
  • AandC:自定义的演员(Actor)和评论家(Critic)类,用于构建 DDPG 算法中的演员和评论家网络。
  • TrainOrTest:自定义的训练和测试类,用于执行 DDPG 算法的训练和测试过程。
  • argparse 是 Python 标准库中的一个模块,用于解析命令行参数。通过 argparse 可以方便地在命令行中指定参数,并且可以对参数进行类型检查、限制取值范围、生成帮助信息等操作。它是编写命令行工具和脚本时非常常用的工具,能够帮助开发者处理命令行输入,从而实现对程序行为的灵活控制。

  • pprint 是 Python 标准库中的一个模块,用于漂亮地打印 Python 对象。pprint 提供了 pprint() 函数,可以将复杂的 Python 对象(如字典、列表、嵌套对象等)格式化输出,使其更加易于阅读。这在调试和输出复杂数据结构时非常有用,可以帮助开发者更好地理解数据的结构和内容。

  • sys 是 Python 标准库中的一个模块,提供了与系统相关的功能,例如访问命令行参数、与系统交互等。sys.argv 变量可以获取到命令行参数的列表,sys.exit() 函数可以用于退出程序并返回退出码,sys.stdoutsys.stderr 可以用于标准输出和标准错误输出等。sys 模块在处理命令行参数、异常处理、系统交互等场景下非常有用,是 Python 中的一个重要工具。

1.2 定义训练函数train()

1.2.1 代码总括

def train(args):
    with tf.Session() as sess:
        env = gym.make(args['env'])  # 创建 Gym 环境
        np.random.seed(int(args['random_seed']))  # 设置随机种子
        tf.set_random_seed(int(args['random_seed']))  # 设置 TensorFlow 随机种子
        env.seed(int(args['random_seed']))  # 设置环境的随机种子
        env._max_episode_steps = int(args['max_episode_len'])  # 设置最大回合步数

        state_dim = env.observation_space.shape[0]   # 状态维度
        action_dim = env.action_space.shape[0]  # 动作维度
        action_bound = env.action_space.high  # 动作的上界

        actor = ActorNetwork(sess, state_dim, action_dim, action_bound,
                             float(args['actor_lr']), float(args['tau']), int(args['minibatch_size']))  # 创建 Actor 神经网络

        critic = CriticNetwork(sess, state_dim, action_dim,
                               float(args['critic_lr']), float(args['tau']), float(args['gamma']),
                               actor.get_num_trainable_vars())  # 创建 Critic 神经网络

        trainDDPG(sess, env, args, actor, critic)  # 使用 trainDDPG 函数进行 DDPG 算法的训练

        saver = tf.train.Saver()  # 创建保存器
        saver.save(sess, "ckpt/model")  # 保存训练得到的模型到 "ckpt/model" 目录下
        print("saved model")  # 打印提示信息

这是一个 train() 函数,用于训练 DDPG(Deep Deterministic Policy Gradient)算法的 Actor 和 Critic 神经网络。函数接受一个参数 args,其中包含了训练 DDPG 算法所需的各种参数,例如学习率、折扣因子、目标网络更新参数、缓冲区大小等。

在函数内部,首先创建了一个 TensorFlow 会话 (tf.Session()),并根据传入的参数创建了 Gym 环境 (gym.make(args['env']))。接着设置随机种子以保证结果的可复现性,初始化 Actor 和 Critic 神经网络,并调用 trainDDPG() 函数进行 DDPG 算法的训练。

在训练完成后,使用 tf.train.Saver() 创建了一个保存器,并保存了训练得到的模型到 "ckpt/model" 目录下,同时打印了 "saved model" 的提示信息。

注意:在使用该函数之前,需要确保已经导入了相关的依赖库,并且已经定义了 ActorNetworkCriticNetworktrainDDPG 函数,这些函数的具体实现可能在其他地方定义。

1.2.2 代码分解

(1)np.random.seed(int(args['random_seed']))

        env = gym.make(args['env'])
        np.random.seed(int(args['random_seed']))
        tf.set_random_seed(int(args['random_seed']))
        env.seed(int(args['random_seed']))
        env._max_episode_steps = int(args['max_episode_len'])

这段代码使用了 gymnumpytensorflow 库来创建一个 OpenAI Gym 环境,并设置随机种子和最大回合步数。

具体步骤如下:

①使用 gymmake() 函数创建一个 OpenAI Gym 环境,其中环境的名称由 args['env'] 指定。

②使用 numpyrandom.seed() 函数将随机种子设置为 args['random_seed'] 的整数值,用于控制随机性。

③使用tensorflowset_random_seed() 函数将 TensorFlow 的随机种子设置为 args['random_seed'] 的整数值,用于控制 TensorFlow 的随机性

④使用 env 对象的 seed() 方法将环境的随机种子设置为 args['random_seed'] 的整数值,用于控制环境的随机性。

⑤使用 args['max_episode_len'] 的整数值设置环境的最大回合步数为 env._max_episode_steps,用于限制每个回合的最大步数。

注意:在运行这段代码之前,需要确保 args 字典中包含了正确的参数值,例如 'env''random_seed''max_episode_len' 等参数,否则可能会出现错误。

这段代码主要用于初始化环境并设置随机种子和最大回合步数,以保证实验的可重复性和控制性。

(2)state_dim = env.observation_space.shape[0]

        state_dim = env.observation_space.shape[0]   # 状态维度
        action_dim = env.action_space.shape[0]  # 动作维度
        action_bound = env.action_space.high  # 动作的上界

以上代码用于获取环境状态和动作的维度信息,并将动作的上界存储在变量中。

env.observation_space.shape 返回环境状态空间的形状,即状态的维度信息。env.observation_space.shape[0] 获取状态维度的第一个元素,即状态维度。

env.action_space.shape 返回环境动作空间的形状,即动作的维度信息。env.action_space.shape[0] 获取动作维度的第一个元素,即动作维度。

env.action_space.high 返回动作空间的上界,即动作的最大值。这个值被用作 Actor 网络中输出动作的上界,以确保生成的动作不会超过环境动作空间的限制。这样可以帮助训练出合理的动作策略。

(3)actor = ActorNetwork(sess, state_dim, action_dim, action_bound,
                             float(args['actor_lr']), float(args['tau']), 
                             int(args['minibatch_size']))  

        actor = ActorNetwork(sess, state_dim, action_dim, action_bound,
                             float(args['actor_lr']), float(args['tau']), 
                             int(args['minibatch_size']))  

        critic = CriticNetwork(sess, state_dim, action_dim,
                             float(args['critic_lr']), float(args['tau']), 
                             float(args['gamma']),
                             actor.get_num_trainable_vars())

以上代码创建了 Actor 网络和 Critic 网络,并传入相应的参数进行初始化。

ActorNetwork 类是 Actor 网络的实现,接收 sess(TensorFlow 会话对象)、state_dim(状态维度)、action_dim(动作维度)、action_bound(动作上界)、actor_lr(Actor 网络学习率)、tau(目标网络更新参数)、minibatch_size(小批量大小)等参数进行初始化。

CriticNetwork 类是 Critic 网络的实现,接收 sess(TensorFlow 会话对象)、state_dim(状态维度)、action_dim(动作维度)、critic_lr(Critic 网络学习率)、tau(目标网络更新参数)、gamma(折扣因子)、num_actor_vars(Actor 网络可训练参数数量)等参数进行初始化。

注意,这里还调用了 actor.get_num_trainable_vars() 方法来获取 Actor 网络的可训练参数数量,并将其作为参数传给 Critic 网络,用于目标网络更新时的参数更新。这样可以确保 Critic 网络在更新目标网络时,不会更新 Actor 网络的参数。

(4)saver.save(sess, "ckpt/model")

        trainDDPG(sess, env, args, actor, critic)  # 使用 trainDDPG 函数进行 DDPG 算法的训练

        saver = tf.train.Saver()  # 创建保存器
        saver.save(sess, "ckpt/model")  # 保存训练得到的模型到 "ckpt/model" 目录下
        print("saved model") 

trainDDPG 函数是用于训练 DDPG(Deep Deterministic Policy Gradient)算法的函数,接收 sess(TensorFlow 会话对象)、env(OpenAI Gym 环境对象)、args(命令行参数字典)、actor(Actor 网络对象)和 critic(Critic 网络对象)等参数作为输入。

trainDDPG 函数将根据 DDPG 算法的训练流程,在给定的环境中使用 Actor 网络和 Critic 网络进行训练,更新网络参数,优化策略和值函数。具体的训练流程和算法实现可参考 trainDDPG 函数的实现。

在训练完成后,代码通过 tf.train.Saver() 创建了一个保存器 saver,用于保存训练得到的模型。调用 saver.save(sess, "ckpt/model") 将模型保存到 "ckpt/model" 目录下,其中 sess 是当前的 TensorFlow 会话对象,保存的模型文件名为 "model"。最后,通过 print("saved model") 输出保存成功的提示信息。

1.3 定义测试函数test()

1.3.1 代码总括

def test(args):
    with tf.Session() as sess:
        env = gym.make(args['env'])  # 创建测试环境
        np.random.seed(int(args['random_seed']))  # 设置随机种子
        tf.set_random_seed(int(args['random_seed']))  # 设置 TensorFlow 随机种子
        env.seed(int(args['random_seed']))  # 设置测试环境的随机种子
        env._max_episode_steps = int(args['max_episode_len'])  # 设置最大的回合步数

        state_dim = env.observation_space.shape[0]  # 获取状态空间的维度
        action_dim = env.action_space.shape[0]  # 获取动作空间的维度
        action_bound = env.action_space.high  # 获取动作的上界

        actor = ActorNetwork(sess, state_dim, action_dim, action_bound,
                             float(args['actor_lr']), float(args['tau']), int(args['minibatch_size']))  # 创建 Actor 网络对象

        critic = CriticNetwork(sess, state_dim, action_dim,
                               float(args['critic_lr']), float(args['tau']), float(args['gamma']),
                               actor.get_num_trainable_vars())  # 创建 Critic 网络对象

        saver = tf.train.Saver()  # 创建 Saver 对象,用于加载之前训练时保存的模型参数
        saver.restore(sess, "ckpt/model")  # 加载之前训练时保存的模型参数

        testDDPG(sess, env, args, actor, critic)  # 使用加载的模型在测试环境中运行,并输出测试结果

这是一个用于进行测试的函数 test(args),其功能是加载之前训练好的 DDPG 模型,并在测试环境中运行该模型进行测试。

函数的具体步骤如下:

  1. 创建一个 TensorFlow 会话 sess,用于执行 TensorFlow 操作。
  2. 使用 gym.make() 函数创建测试环境 env,并设置随机种子和最大的回合步数。
  3. 获取状态空间的维度、动作空间的维度以及动作的上界。
  4. 创建 Actor 网络对象 actor,并使用之前训练时保存的参数初始化该网络。
  5. 创建 Critic 网络对象 critic,并使用之前训练时保存的参数初始化该网络。
  6. 创建一个 Saver 对象 saver,用于加载之前训练时保存的模型参数。
  7. 使用 saver.restore() 函数加载之前训练时保存的模型参数。
  8. 调用 testDDPG() 函数,使用加载的模型在测试环境中运行,并输出测试结果。

1.3.2 代码分解

(1)env = gym.make(args['env'])

env = gym.make(args['env'])

gym.make(args['env']) 是使用 Gym 库创建一个 Gym 环境对象的操作。

Gym 是一个用于开发和比较强化学习算法的开源工具包,提供了一系列标准化的环境,包括各种类型的游戏、控制问题等。通过调用 gym.make() 函数并传递一个环境名称作为参数,可以创建一个特定的 Gym 环境对象,用于进行训练或测试强化学习算法。

在这段代码中,args 是一个字典,包含了一些参数的取值,其中包括了 'env' 参数,它表示要创建的 Gym 环境的名称。通过使用 args['env'] 获取 'env' 参数的取值,并传递给 gym.make() 函数,从而创建一个对应名称的 Gym 环境对象,并将其赋值给变量 env,以便后续在训练或测试过程中使用该环境对象。

(2)np.random.seed(int(args['random_seed']))

np.random.seed(int(args['random_seed']))

np.random.seed(int(args['random_seed'])) 是为了设置 NumPy 库中随机数生成器的种子使得随机数生成过程可复现。在机器学习和深度学习中,随机数生成器的种子常常被设置为固定的值以确保每次运行代码时生成的随机数序列是一致的从而方便进行结果的比较和复现。

在这段代码中,args 是一个字典,包含了一些参数的取值,其中包括了 'random_seed' 参数,它是一个随机种子值。通过使用 int(args['random_seed']) 将字符串类型的随机种子值转换为整数类型,并传递给 np.random.seed() 函数,从而设置 NumPy 库中的随机数生成器的种子值,确保随机数生成的一致性。这样,在每次运行代码时,使用相同的随机种子值将生成相同的随机数序列,从而保证了测试的可复现性。

(3)tf.set_random_seed(int(args['random_seed']))

tf.set_random_seed(int(args['random_seed'])) 

tf.set_random_seed(int(args['random_seed'])) 是设置 TensorFlow 的随机种子操作

在机器学习中,随机性在训练过程中经常用到,例如在初始化模型参数、采样数据等过程中使用随机数。为了保证实验的可重复性,通常需要设置随机种子,使得每次运行代码时得到的随机数序列是相同的。

在这段代码中,args 是一个字典,包含了一些参数的取值,其中包括了 'random_seed' 参数,它表示随机种子的取值。通过使用 args['random_seed'] 获取 'random_seed' 参数的取值,并将其转换为整型数值后传递给 tf.set_random_seed() 函数,从而设置 TensorFlow 的随机种子,保证了在训练或测试过程中得到的随机数序列是相同的,以便实现实验的可重复性。

(4)env.seed(int(args['random_seed']))

env.seed(int(args['random_seed']))

env.seed(int(args['random_seed'])) 是设置 Gym 环境的随机种子操作。

在 OpenAI Gym 中,环境的随机性通常包括了初始状态的随机设置、随机动作的选择等。为了保证在不同运行时得到相同的随机环境,可以设置环境的随机种子。

在这段代码中,args 是一个字典,包含了一些参数的取值,其中包括了 'random_seed' 参数,它表示随机种子的取值。通过使用 args['random_seed'] 获取 'random_seed' 参数的取值,并将其转换为整型数值后传递给 env.seed() 函数,从而设置 Gym 环境的随机种子,保证了在训练或测试过程中得到的随机环境是相同的,以便实现实验的可重复性。

(5)saver.restore(sess, "ckpt/model")

saver.restore(sess, "ckpt/model")

saver.restore(sess, "ckpt/model") 是通过 TensorFlow 的 Saver 对象加载之前保存的模型参数。

在这段代码中,saver 是通过 tf.train.Saver() 创建的一个 Saver 对象,用于保存和恢复 TensorFlow 模型的参数。sess 是 TensorFlow 的会话对象,用于执行计算图中的操作。"ckpt/model" 是模型参数的保存路径,其中 "ckpt" 是保存模型参数的目录,"model" 是保存模型参数的文件名。

saver.restore(sess, "ckpt/model") 用于从指定的路径加载之前保存的模型参数,并将参数值恢复到当前的 TensorFlow 会话中,以便在后续的代码中可以使用已加载的模型参数进行预测、测试或其他操作。加载模型参数后,可以通过访问相应的 TensorFlow 变量来获取参数值,并在模型的后续运行中使用这些参数值。

1.4 定义主函数

1.4.1 代码总括

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='provide arguments for DDPG agent')

    # agent parameters
    parser.add_argument('--actor-lr', help='actor network learning rate', default=0.0001)
    parser.add_argument('--critic-lr', help='critic network learning rate', default=0.001)
    parser.add_argument('--gamma', help='discount factor for Bellman updates', default=0.99)
    parser.add_argument('--tau', help='target update parameter', default=0.001)
    parser.add_argument('--buffer-size', help='max size of the replay buffer', default=1000000)
    parser.add_argument('--minibatch-size', help='size of minibatch', default=64)

    # run parameters
    parser.add_argument('--env', help='gym env', default='Pendulum-v0')
    parser.add_argument('--random-seed', help='random seed', default=258)
    parser.add_argument('--max-episodes', help='max num of episodes', default=250)
    parser.add_argument('--max-episode-len', help='max length of each episode', default=1000)
    parser.add_argument('--render-env', help='render gym env', action='store_true')
    parser.add_argument('--mode', help='train/test', default='train')

    args = vars(parser.parse_args())

    pp.pprint(args)

这段代码是一个 Python 脚本的入口点,它使用 argparse 模块来解析命令行参数,并将这些参数传递给 DDPG(Deep Deterministic Policy Gradient)代理的训练或测试过程。

具体的参数解释如下:

  • --actor-lr: 指定 Actor 网络的学习率,默认值为 0.0001。
  • --critic-lr: 指定 Critic 网络的学习率,默认值为 0.001。
  • --gamma: 指定 Bellman 更新中的折扣因子,默认值为 0.99。
  • --tau: 指定目标网络更新的参数,默认值为 0.001。
  • --buffer-size: 指定回放缓存的最大大小,默认值为 1000000。
  • --minibatch-size: 指定每个小批量的大小,默认值为 64。
  • --env: 指定 Gym 环境的名称,默认为 'Pendulum-v0'。
  • --random-seed: 指定随机种子,默认值为 258。
  • --max-episodes: 指定最大的训练或测试的回合数,默认值为 250。
  • --max-episode-len: 指定每个回合的最大步数,默认值为 1000。
  • --render-env: 是否渲染 Gym 环境,默认为 False。
  • --mode: 指定运行模式,可以是 'train' 或 'test',默认为 'train'。

这些参数通过使用 argparse 模块解析命令行参数后,存储在一个字典 args 中,并通过 pp.pprint(args) 打印出来,以便查看参数的值。在后续的代码中,可以使用 args 字典中的键值对来获取相应的参数值,并传递给 DDPG 代理的训练或测试函数。

1.4.2 代码分解

(1)if __name__ == '__main__':

if __name__ == '__main__':

这段代码是Python中的一种常用写法,用于判断当前模块是否作为主程序直接运行,而不是作为模块被其他程序导入调用。

在Python中,每个模块都有一个__name__属性,用于表示模块的名称。当一个模块被直接运行时,其__name__属性的值为'__main__',当一个模块被导入时,其__name__属性的值为模块的名称。

因此,使用if __name__ == '__main__':这样的条件语句可以判断当前模块是否作为主程序直接运行。如果条件成立,表示当前模块作为主程序运行,可以执行相应的主程序逻辑;如果条件不成立,表示当前模块被导入,可以作为一个模块被其他程序调用。这样可以在代码中区分主程序逻辑和模块导入逻辑,使代码更加灵活和可复用。

(2)parser = argparse.ArgumentParser(description='provide arguments for DDPG agent')

parser = argparse.ArgumentParser(description='provide arguments for DDPG agent')

这行代码创建了一个ArgumentParser对象,用于解析命令行参数。其中description参数为对该ArgumentParser对象的描述,通常用于解释命令行参数的用途。在这里,描述为"provide arguments for DDPG agent"。

(3)parser.add_argument('--actor-lr', help='actor network learning rate', default=0.0001)

 parser.add_argument('--actor-lr', help='actor network learning rate', default=0.0001)

parser.add_argument()这是ArgumentParser对象的一个方法,用于添加命令行参数。通过调用这个方法可以定义需要在命令行中接受的参数,并设置它们的属性,例如参数名称、默认值、数据类型、帮助信息等。

这行代码定义了一个名为--actor-lr的命令行参数,它用于设置actor网络的学习率。help参数设置了这个参数的帮助信息为"actor network learning rate",default参数设置了默认值为0.0001。其他参数的定义方式类似。

(4)parser.add_argument('--render-env', help='render gym env', action='store_true')

parser.add_argument('--render-env', help='render gym env', action='store_true')

这段代码是通过 argparse 模块为命令行参数添加了一个可选参数 --render-env--render-env 参数的作用是用于控制是否在训练或测试时渲染 Gym 环境的图像。

具体解释如下:

  • --render-env: 指定参数的名称为 render-env
  • help='render gym env': 参数的帮助信息为 'render gym env',在用户通过 -h--help 查看帮助信息时会显示这段文本。
  • action='store_true': 当用户指定了 --render-env 参数时,将其值设置为 True。如果用户不指定该参数,则其值默认为 False

这样,当在命令行中传入 --render-env 参数时,args['render_env'] 的值会被设置为 True,从而可以在代码中根据该值来决定是否渲染 Gym 环境的图像。如果不传入 --render-env 参数,则 args['render_env'] 的值为 False

(5)args = vars(parser.parse_args())

args = vars(parser.parse_args())

这行代码将通过ArgumentParser解析的命令行参数存储在一个字典对象args中。

vars()函数用于将argparse.Namespace对象(parser.parse_args()返回的对象)转换为字典其中字典的键是参数名称,字典的值是命令行中传递的参数值。

例如,如果在命令行中传递了--actor-lr 0.0002这个参数,那么args字典中会包含一个键值对'actor_lr': 0.0002,其中'actor_lr'是参数名称,0.0002是参数值。可以通过args['actor_lr']访问该参数的值。其他命令行参数的值也可以通过类似的方式访问。

parser.parse_args()

这行代码是使用ArgumentParser解析命令行参数的方法。它会解析命令行中传递的参数,并根据在ArgumentParser对象中定义的参数规范进行验证和解析。

在代码中,parser是一个ArgumentParser对象,通过调用parse_args()方法来解析命令行参数。解析过程会根据在parser对象中使用add_argument()方法添加的参数规范来解析命令行参数,并将解析后的参数值存储在一个argparse.Namespace对象中。

例如,如果在命令行中传递了--actor-lr 0.0002这个参数,parse_args()方法会将'actor_lr'参数的值解析为0.0002,并返回一个包含了该值的argparse.Namespace对象。可以通过该对象的属性来访问解析后的参数值,例如args.actor_lr来访问'actor_lr'参数的值。

1.5 根据需要调用训练函数或者测试函数

if (args['mode'] == 'train'):
    train(args)
elif (args['mode'] == 'test'):
    test(args)

这段代码根据参数 args 中的 mode 字段的值来决定是执行训练还是测试操作。

  • 如果 args['mode'] 的值等于 'train',则调用 train 函数,并传入参数 args
  • 如果 args['mode'] 的值等于 'test',则调用 test 函数,并传入参数 args

这样可以根据命令行传入的参数 mode 的值来动态地选择执行训练或测试操作,从而实现更加灵活的程序行为。需要注意的是,traintest 函数在代码的其他地方应该定义和实现,这段代码只是根据 args['mode'] 的值来调用相应的函数。

1.6 问题

(1)问:为何env.observation_space.shape[0]使用[0]就是状态维度?

在 OpenAI Gym 中,observation_space 是一个描述环境状态空间的对象,通常是一个 BoxDiscrete 类型的对象。对于 Box 类型的状态空间,observation_space.shape 返回一个形状为 (n,) 的元组,其中 n 表示状态的维度数量。因此,observation_space.shape[0] 表示状态空间的第一个维度的大小,即状态的维度。

通过 env.observation_space.shape[0] 可以获取状态空间的维度数量,通常用于神经网络模型的输入层的节点数,以便正确设置输入层的大小。例如,如果状态空间的维度数量为 3,那么 env.observation_space.shape[0] 的值将为 3,表示状态的维度为 3。

(2)问:为何env.action_space.shape[0]使用[0]就是动作维度?

在 OpenAI Gym 中,action_space 是一个描述环境动作空间的对象,通常是一个 BoxDiscreteMultiDiscrete 类型的对象。对于 Box 类型的动作空间,action_space.shape 返回一个形状为 (n,) 的元组,其中 n 表示动作的维度数量。因此,action_space.shape[0] 表示动作空间的第一个维度的大小,即动作的维度。

通过 env.action_space.shape[0] 可以获取动作空间的维度数量,通常用于神经网络模型的输出层的节点数,以便正确设置输出层的大小。例如,如果动作空间的维度数量为 2,那么 env.action_space.shape[0] 的值将为 2,表示动作的维度为 2。

(3)问:生成的model文件为何后缀不同?

在 TensorFlow 中,模型参数可以以不同的文件后缀保存,例如".ckpt"、".meta"、".index"、".data" 等。这些文件后缀用于存储不同的信息。

  • ".ckpt" 文件是 TensorFlow 的 checkpoint 文件,用于存储模型的参数值。它包含了模型的权重、偏置等参数信息,以二进制格式保存。与直接以checkpoint命名的文件等价。
  • ".meta" 文件是 TensorFlow 的元图(meta-graph)文件,用于存储模型的计算图结构。它包含了模型的网络结构、操作节点等信息。
  • ".index" 文件是 TensorFlow 的索引文件,用于存储 ".ckpt" 文件中各个参数的索引信息。
  • ".data" 文件是 TensorFlow 的数据文件,用于存储 ".ckpt" 文件中各个参数的实际数值

这些文件后缀的组合形成了完整的模型文件,可以通过 Saver 对象的 save() 方法保存,并通过 restore() 方法加载。在使用 Saver 对象保存和加载模型时,可以指定保存和加载的文件路径和文件后缀。例如,在上面的代码中,使用了 "ckpt/model" 作为保存和加载模型参数的文件路径,其中 "ckpt" 是保存模型参数的目录,"model" 是保存模型参数的文件名,具体的文件后缀由 Saver 对象自动添加和识别。

(4)问:checkpoint、model.data-00000-of-00001 、model.index、model.meta的关系?

在 TensorFlow 中,这些文件通常是 checkpoint 文件的组成部分,用于保存模型的参数信息和计算图结构。

  • "checkpoint" 文件:用于保存当前训练的 checkpoint 的元信息,包括最新的 checkpoint 文件名、所有 checkpoint 文件的列表、最新的训练步数等信息。

  • "model.data-00000-of-00001" 文件:用于保存模型的参数数据,包括权重、偏置等参数的二进制数据。

  • "model.index" 文件:用于保存模型参数的索引信息,包括参数的名称、形状、类型等信息,用于快速查找模型参数。

  • "model.meta" 文件:用于保存 TensorFlow 计算图的元数据,包括图的结构、变量的名称和类型等信息。

这些文件通常一起组成一个完整的 checkpoint 文件,用于保存 TensorFlow 模型的参数信息和计算图结构。在使用 Saver 对象的 restore() 方法加载模型参数时,通常只需要指定 ".ckpt" 文件的路径,而不需要分别加载 "model.data-00000-of-00001"、"model.index"、"model.meta" 这些文件,因为它们在保存 checkpoint 文件时会一同生成,并且会被自动识别和加载。

注意:生成的文件名格式取决于所使用的 TensorFlow 版本,但不影响模型的加载和恢复过程,因为 TensorFlow 会根据文件的后缀和内容自动识别和加载相应的文件

(6)问:args?

args 是一个 Python 字典,包含了从命令行解析的参数及其对应的值。它是通过使用 argparse 模块解析命令行参数后生成的。

在代码中,args 是通过 parser.parse_args() 方法返回的。parser.parse_args() 会解析命令行参数,并将解析结果存储在 args 对象中,其中参数名称(如 --actor-lr--env 等)作为键,对应的参数值作为值。

例如,如果在命令行中执行了类似以下的命令:

python my_script.py --actor-lr 0.0001 --env 'Pendulum-v0' --render-env

那么 args 对象可能会包含以下内容:

args = {
    'actor_lr': 0.0001,
    'env': 'Pendulum-v0',
    'render_env': True
}

可以通过 args 对象来访问和使用这些参数值,在代码中根据需要进行处理。例如,args['actor_lr'] 将返回 0.0001args['env'] 将返回 'Pendulum-v0'args['render_env'] 将返回 True

猜你喜欢

转载自blog.csdn.net/aaaccc444/article/details/130208853