MADDPG-学习笔记(1)

文献链接:https://arxiv.org/abs/1706.02275

"Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments"(作者:Lowe, Ryan等人,2017年)

环境搭建:https://zhuanlan.zhihu.com/p/41954025

DDPG.html" title=MADDPG>MADDPG代码讲解博客链接:https://blog.csdn.net/qq_41871826/article/details/110678626?spm=1001.2014.3001.5506

多智能体粒子环境(multiagent-particle-envs)链接
https://github.com/openai/multiagent-particle-envs

DDPG.html" title=MADDPG>MADDPG代码链接:https://github.com/openai/maddpg

注意:学习者多看相关博客文章的评论等,会有一些错误的解决方式。

注意:本文是按照https://zhuanlan.zhihu.com/p/41954025这篇文章搭建的环境,执行的是simple这个环境

python train.py --scenario simple

使用的环境:ubuntu18.04、python3.6.13、numpy1.19.5、gym0.10.5、tensorflow1.8.0

目录

1.报错

1.1 TypeError: must be str, not NoneType

1.1.1 第一种解决方式-添加条件

1.1.2 第二种解决方式-打印哪个为空

1.1.3 第三种解决方式- default=" "

1.2 Non-UTF-8 code starting with '\xcc' in file train.py

1.3 FileNotFoundError: [Errno 2] No such file or directory

1.4 InvalidArgumentError (see above for traceback)

1.5 NotFoundError (see above for traceback)

1.6 [ 4844.367517] Out of memory:

1.7 set the environment variable `SUPPRESS_MA_PROMPT=1`

2.问题

2.1 Linux中隐藏文件是如何显示的?

2.2 使用ls -a显示 . .. train.py是什么意思?

2.3 c#中\t

2.4 display和render区别和联系


1.报错

1.1 TypeError: must be str, not NoneType

正常训练的显示:

 train.py文件链接:https://github.com/openai/maddpg/blob/master/experiments/train.py

Traceback (most recent call last): File "train.py", line 193, in <module> train(arglist) File "train.py", line 182, in train rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl' TypeError: must be str, not NoneType

注意:这个错误是执行到1499975步发生的,即将结束的阶段(episodes总共60000个):

steps: 1499975, episodes: 60000, mean episode reward: -6.559353017320698, time: 10.777

其实错误发生在在往learning_curves中写入结果时报错:

parser.add_argument("--plots-dir", type=str, default="./learning_curves/", help="directory where plot data is saved")

报错对应的代码: 

           if len(episode_rewards) > arglist.num_episodes:
                rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl'
                with open(rew_file_name, 'wb') as fp:
                    pickle.dump(final_ep_rewards, fp)
                agrew_file_name = arglist.plots_dir + arglist.exp_name + '_agrewards.pkl'
                with open(agrew_file_name, 'wb') as fp:
                    pickle.dump(final_ep_ag_rewards, fp)
                print('...Finished total of {} episodes.'.format(len(episode_rewards)))
                break 

根据错误信息,问题出现在 "train.py" 文件的第 193 行,具体原因是在第 182 行中 arglist.plots_dir + arglist.exp_name + '_rewards.pkl' 的部分。错误信息表明出现了类型错误,需要的是字符串类型,而实际上得到的是 NoneType 类型。

这个错误通常表示 arglist.plots_dirarglist.exp_name 中的一个或多个值为 None。导致这种情况可能有以下几种原因:

①检查是否正确设置了 arglist.plots_dirarglist.exp_name 的值。确保它们被正确赋值为字符串类型,并且没有被设置为 None

②如果这些值是从命令行参数或配置文件中获取的,请检查输入参数或配置文件中对应的键是否正确,并确保为它们提供了有效的值。

③如果这些值是在代码中动态生成的,请确保生成路径的过程没有出现错误,并且生成的结果是预期的字符串类型。

1.1.1 第一种解决方式-添加条件

为了解决这个问题,可以添加一些检查来确保文件名的生成不会引用空值或 None 值。下面是一个示例的修改建议:

if len(episode_rewards) > arglist.num_episodes:
    rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl'
    if rew_file_name is not None:  # 添加检查,确保文件名不为 None
        with open(rew_file_name, 'wb') as fp:
            pickle.dump(final_ep_rewards, fp)
    agrew_file_name = arglist.plots_dir + arglist.exp_name + '_agrewards.pkl'
    if agrew_file_name is not None:  # 添加检查,确保文件名不为 None
        with open(agrew_file_name, 'wb') as fp:
            pickle.dump(final_ep_ag_rewards, fp)
    print('...Finished total of {} episodes.'.format(len(episode_rewards)))
    break

在上述修改中,添加了两个条件检查来确保 rew_file_nameagrew_file_name 不为 None。这样可以避免出现文件名为 None 导致的错误。

注意:我照此种方法改代码出现了同样的错误

1.1.2 第二种解决方式-打印哪个为空

可以在代码中打印相关变量的值,以便进一步调试和确定问题所在。

rew_file_nameagrew_file_name 的生成代码之前,添加以下打印语句:

print("arglist.plots_dir:", arglist.plots_dir)
print("arglist.exp_name:", arglist.exp_name)

这将显示 arglist.plots_dirarglist.exp_name 的值。检查这些值是否为空或不正确,可能是导致文件名为空的原因。

打印结果:

arglist.plots_dir: ./learning_curves/
arglist.exp_name: None

要解决这个问题,需要确保在设置 arglist.exp_name 变量时赋予它一个非空的值。检查代码中设置 arglist.exp_name 的部分,并确保为其赋予一个合适的字符串值。

例如,可以在设置 arglist.exp_name 的地方添加以下代码:

arglist.exp_name = "your_experiment_name"

代码具体的添加方法:

if len(episode_rewards) > arglist.num_episodes:
    if arglist.exp_name is None:
        arglist.exp_name = "my_experiment"
    rew_file_name = arglist.plots_dir + arglist.exp_name + '_rewards.pkl'
    with open(rew_file_name, 'wb') as fp:
        pickle.dump(final_ep_rewards, fp)
    agrew_file_name = arglist.plots_dir + arglist.exp_name + '_agrewards.pkl'
    with open(agrew_file_name, 'wb') as fp:
        pickle.dump(final_ep_ag_rewards, fp)
    print('...Finished total of {} episodes.'.format(len(episode_rewards)))
    break

注意:这种方法尝试了之后仍然出现相同的错误,具体不清楚是文件名起的不对,还是什么。

在命令行输入仍然报相同的错误:

python your_script.py --exp-name my_experiment

1.1.3 第三种解决方式- default=" "

解决方式:将default=None改为default=" "

没有了TypeError: must be str, not NoneType这个错误

    # Checkpointing
    parser.add_argument("--exp-name", type=str, default="", help="name of the experiment")

    # parser.add_argument("--exp-name", type=str, default=None, help="name of the experiment")

但出现了新的错误:

Traceback (most recent call last): File "train.py", line 196, in <module> train(arglist) File "train.py", line 186, in train with open(rew_file_name, 'wb') as fp: FileNotFoundError: [Errno 2] No such file or directory: './learning_curves/_rewards.pkl'

这个错误提示表明在打开文件'./learning_curves/_rewards.pkl'时发生了找不到文件或目录的错误。

解决方式:在当前目录(即包含train.py文件的目录)下创建learning_curves

mkdir learning_curves

1.2 Non-UTF-8 code starting with '\xcc' in file train.py

File "train.py", line 184 SyntaxError: Non-UTF-8 code starting with '\xcc' in file train.py on line 184, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

根据提供的错误信息,遇到了一个编码错误 SyntaxError: Non-UTF-8 code starting with '\xcc' in file train.py on line 184, but no encoding declared

这个错误通常发生在代码文件中存在非 UTF-8 编码的字符,而没有声明文件的编码类型。在 Python 中,为了正确地解析和处理文件中的特定字符集,需要在代码文件的开头添加编码声明。

要解决这个问题,可以在代码文件的开头添加一个编码声明行,指明文件的编码类型。

例如,如果代码文件使用的是 UTF-8 编码,可以在文件的开头添加以下行:

# -*- coding: utf-8 -*-

确保将上述行添加到代码文件的开头,并在其中指定适当的编码类型(例如 UTF-8)。

在代码文件 train.py 中的第 1 行之前添加编码声明行,然后保存文件并重新运行您的代码,这应该能够解决编码错误。

另外,如果代码文件确实包含了其他编码的字符集,并且不是 UTF-8 编码,请根据实际情况选择适当的编码类型,并在编码声明行中进行声明。

1.3 FileNotFoundError: [Errno 2] No such file or directory

2023-05-16 08:37:33.982168: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Traceback (most recent call last): File "train.py", line 194, in <module> train(arglist) File "train.py", line 82, in train env = make_env(arglist.scenario, arglist, arglist.benchmark) File "train.py", line 54, in make_env scenario = scenarios.load(scenario_name + ".py").Scenario() File "/home/xiaowang/multiagent-particle-envs-master/multiagent-particle-envs-master/multiagent/scenarios/__init__.py", line 7, in load return imp.load_source('', pathname) File "/home/xiaowang/anaconda3/envs/py3.6/lib/python3.6/imp.py", line 172, in load_source module = _load(spec) File "<frozen importlib._bootstrap>", line 684, in _load File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 674, in exec_module File "<frozen importlib._bootstrap_external>", line 780, in get_code File "/home/xiaowang/anaconda3/envs/py3.6/lib/python3.6/imp.py", line 158, in get_data return super().get_data(path) File "<frozen importlib._bootstrap_external>", line 832, in get_data FileNotFoundError: [Errno 2] No such file or directory: '/home/xiaowang/multiagent-particle-envs-master/multiagent-particle-envs-master/multiagent/scenarios/simple_adversary.py.py'

根据错误信息,是找不到文件 /home/xiaowang/multiagent-particle-envs-master/multiagent-particle-envs-master/multiagent/scenarios/simple_adversary.py.py

检查文件路径,确保文件存在,并且文件名没有重复的扩展名。在错误信息中,文件名的末尾似乎有一个额外的 .py 扩展名,可能是重复添加导致的。

解决方法,

删除一个.py后缀

1.4 InvalidArgumentError (see above for traceback)

InvalidArgumentError (see above for traceback): Unsuccessful TensorSliceReader constructor: Failed to get matching files on /tmp/policy/: Not found: /tmp/policy; No such file or directory [[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, ..., DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/RestoreV2/shape_and_slices)]]

这个错误表明在执行 TensorFlow 模型恢复操作时,找不到指定的文件或目录。具体来说,它指示找不到 /tmp/policy/ 目录下的文件。

解决方法:

再训练一次,观察/tmp/policy/ 目录是否生成。因为只有训练时才会产生,如果是第一次训练,是没有这个路径的。

1.5 NotFoundError (see above for traceback)

Caused by op 'save/RestoreV2', defined at:
File "./experiments/train.py", line 193, in <module>
train(arglist)
File "./experiments/train.py", line 96, in train
U.load_state(arglist.load_dir)
File "d:\pytorch\maddpg-master\maddpg\common\tf_util.py", line 229, in load_state
saver = tf.train.Saver()

……
NotFoundError (see above for traceback): Key agent_1/agent_1/p_func/fully_connected/biases/Adam not found in checkpoint
[[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT, ..., DT_FLOAT, DT_FLOAT, DT_FLOAT
, DT_FLOAT, DT_FLOAT], _device="/job:localhost/replica:0/task:0/device:CPU:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/R
estoreV2/shape_and_slices)]]

解决方法:

1.6 [ 4844.367517] Out of memory:

在运行simple_adversary.py这个环境时报的错

[ 4844.367517] Out of memory: Kill process 2996 (python) score 424 or sacrifice child [ 4844.367530] Killed process 2996 (python) total-vm:2244352kB, anon-rss:1296896kB, file-rss:0kB, shmem-rss:0kB

这个错误表明系统内存不足,导致进程被操作系统终止。

这种情况通常发生在程序使用了过多的内存资源,而系统无法为其提供足够的内存空间。这可能是由于程序本身的内存使用量较大,或者系统上同时运行的其他进程也占用了大量的内存资源。

1.7 set the environment variable `SUPPRESS_MA_PROMPT=1`

Please read the raised warning, then press Enter to continue... (to suppress this prompt, please set the environment variable `SUPPRESS_MA_PROMPT=1`)

请阅读所提出的警告信息,然后按回车键继续...(如果要禁止此提示,请设置环境变量SUPPRESS_MA_PROMPT=1

在Linux系统中,可以通过以下方式设置环境变量:

 临时设置:在终端中执行以下命令来临时设置环境变量:

export SUPPRESS_MA_PROMPT=1

永久设置:要在系统中永久设置环境变量,可以编辑用户的配置文件。

常见的配置文件包括~/.bashrc~/.bash_profile~/.profile等。使用文本编辑器打开其中一个文件,然后在文件的末尾添加以下行:

export SUPPRESS_MA_PROMPT=1

保存文件并关闭文本编辑器。

接下来,在终端中运行以下命令以使更改生效:

source ~/.bashrc

或者,您可以注销并重新登录系统,使更改生效。

请注意,上述示例中的SUPPRESS_MA_PROMPT是一个示例环境变量名称,您可以根据需要自定义环境变量名称。同样,示例中的值为1,但您可以根据需要设置不同的值。

设置环境变量后,应该不再收到"Please read the raised warning, then press Enter to continue..."的提示

2.问题

2.1 Linux中隐藏文件是如何显示的?

在Linux系统中,文件名以点(.)开头的文件被视为隐藏文件。默认情况下,使用常规的 ls 命令是无法显示隐藏文件的,但可以通过添加命令参数来显示它们。

要显示所有文件(包括隐藏文件),您可以使用以下命令:

ls -a

或者,如果您只想查看隐藏文件,您可以使用以下命令:

ls -ld .?*

这个命令使用了通配符 .?*,它会匹配以点开头的文件和目录(隐藏文件)。命令的输出将显示隐藏文件的详细信息。

请注意,隐藏文件的名称通常是以点开头的,例如 .bashrc.gitignore。如果您在指定路径中没有看到类似的文件名,请确保目录中确实存在隐藏文件。

2.2 使用ls -a显示 . .. train.py是什么意思?

在Linux系统中,使用 ls -a 命令会显示当前目录中的所有文件和目录,包括隐藏文件和特殊目录。

  • . 代表当前目录,即命令执行的目录本身。
  • .. 代表当前目录的上级目录,即父级目录。

这两个特殊项是每个目录中的默认项。它们用于表示目录结构中的位置关系。下面是对它们的详细说明:

  1. . (点)

    • 在命令行中,. 表示当前目录
    • 在文件系统中,每个目录中都存在一个隐含的 . 条目,表示该目录本身。
    • 例如,如果你执行 ls -a 命令,你会看到以 . 开头的文件或目录,它们是当前目录下的内容。.. (点点)
      • 在命令行中,.. 表示当前目录的上级目录
      • 在文件系统中,每个目录中都存在一个隐含的 .. 条目,表示该目录的上级目录。
      • 例如,如果你执行 ls -a 命令,你会看到以 .. 开头的文件或目录,它们是当前目录的父级目录下的内容。

在您提供的示例中,ls -a 命令显示了当前目录下的所有文件和目录,其中包括隐藏文件(以 . 开头的文件或目录)以及默认的 ... 条目。

train.py 是一个普通的文件,它是当前目录中的一个Python源代码文件。

2.3 c#中\t

在C#中,\t 是一个转义序列,代表水平制表符(Tab)。当你将 \t 插入到字符串中时,它将在该位置插入一个水平制表符,从而产生一段水平对齐的空格。

下面是一个示例,演示如何在C#中使用 \t

string text = "Name:\tJohn\nAge:\t25";
Console.WriteLine(text);

输出结果将是:

Name:   John
Age:    25

注意到在字符串中的 \t 被解释为一个水平制表符,生成了一段空格来实现对齐效果。

使用 \t 可以帮助在输出文本时创建整齐对齐的格式,特别是在表格或其他需要垂直对齐的情况下。

2.4 display和render区别和联系

强化学习中,displayrender 是用于可视化环境的两个相关概念,它们有一些区别和联系。

  • displaydisplay 通常用于指示是否在训练过程中显示环境的可视化界面,以便观察智能体与环境的交互情况。当 display 设置为 True 时,环境将在训练过程中以可视化形式呈现,允许您实时观察智能体的决策和环境的状态。这对于调试和直观理解算法的表现很有帮助。

  • renderrender 是一个环境提供的方法,用于将当前环境状态渲染成可视化图像或视频。通过调用环境的 render 方法,您可以获取当前环境状态的可视化表示。渲染通常用于演示、记录或展示智能体在环境中的表现。

联系:

  • 在某些情况下,display 参数可能会调用环境的 render 方法来显示环境的可视化界面。当 display 设置为 True 时,通常会在每个时间步骤调用环境的 render 方法来实时显示环境状态。
  • displayrender 都与环境的可视化相关,它们提供了一种观察智能体与环境交互的方式,帮助您理解和调试算法。

需要注意的是,具体的实现可能因环境库、框架或代码而有所不同。因此,在使用特定的强化学习库或框架时,最好查阅相关文档以了解准确的定义和用法。


http://www.niftyadmin.cn/n/330517.html

相关文章

【数据库】存储过程

存储过程/函数:procedure/function 通俗说,存储过程是个模块化的程序段,完成一定功能,可被反复调用,可用于解决复杂的问题,减少程序冗余度。 这里的过程和函数就是C语言的方法/函数。过程一般不直接返回值,但可以通过实参和形参返回给主调程序计算结果;函数在SQLSERV…

红黑树封装map和set

文章目录 红黑树封装map和set1. 改良红黑树1.1 改良后的节点1.2 改良后的类分别添加仿函数代码 3. 封装map和set3.1 set3.2 map 3. 迭代器3.1 begin 和 end3.2 operator()和operator--()3.3 const迭代器set的迭代器map的迭代器 4. map的operator[]的重载5. 完整代码实现5.1 RBT…

IPWorks EDI 2022 .NET Edition 22.0.8 Crack

IPWorks EDI基于用于安全 EDI 通信&#xff08;AS2、SFTP、OFTP、RosettaNet、MLLP 等&#xff09;的领先 EDI-INT 协议&#xff0c;IPWorks EDI 库包含促进安全 EDI 消息传递以及 EDI 映射、翻译和验证&#xff08;X12、 EDIFACT、HL7、TRADACOMS、VDA、XML 和 JSON&#xff0…

opencv-python相机标定详解

文章目录 角点检测查看角点标定 opencv中内置了张正友的棋盘格标定法&#xff0c;通过一些姿态各异的棋盘格图像&#xff0c;就能标定相机的内外参数。 角点检测 第一步是角点检测&#xff0c;首先需要读取棋盘格图像 import numpy as np import cv2 import ospath imgs #…

“浅谈模块的加载机制“

模块的加载机制 ​ 模块在第一次加载后会被缓存。这意味着多次调用require()不会导致模块的代码被执行多次。 ​ 内置模块、用户自定义模块、第三方模块,它们都会优先从缓存加载,从而提高模块的加载效率。 1.内置模块的加载机制 ​ 内置模块的加载优先级最高。 例如: 即使…

Kali-linux控制Meterpreter

Meterpreter是Metasploit框架中的一个杀手锏&#xff0c;通常作为利用漏洞后的攻击载荷所使用&#xff0c;攻击载荷在触发漏洞后能够返回给用户一个控制通道。当使用Armitage、MSFCLI或MSFCONSOLE获取到目标系统上的一个Meterpreter连接时&#xff0c;用户必须使用Meterpreter传…

Python每日一练(20230517) 最大连续1的个数 I\II\III

目录 1. 最大连续1的个数 I Max Consecutive Ones &#x1f31f; 2. 最大连续1的个数 II Max Consecutive Ones &#x1f31f;&#x1f31f; 3. 最大连续1的个数 III Max Consecutive Ones &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; G…

Hive on Spark调优(大数据技术3)

3.1 Executor配置说明 3.1.1 Executor CPU核数配置 单个Executor的CPU核数&#xff0c;由spark.executor.cores参数决定&#xff0c;建议配置为4-6&#xff0c;具体配置为多少&#xff0c;视具体情况而定&#xff0c;原则是尽量充分利用资源。 此处单个节点共有16个核可供Exec…