文献链接:https://arxiv.org/abs/1706.02275
"Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments"(作者:Lowe, Ryan等人,2017年)
环境搭建:https://zhuanlan.zhihu.com/p/41954025
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
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_dir
或 arglist.exp_name
中的一个或多个值为 None
。导致这种情况可能有以下几种原因:
①检查是否正确设置了 arglist.plots_dir
和 arglist.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_name
和 agrew_file_name
不为 None
。这样可以避免出现文件名为 None
导致的错误。
注意:我照此种方法改代码出现了同样的错误
1.1.2 第二种解决方式-打印哪个为空
可以在代码中打印相关变量的值,以便进一步调试和确定问题所在。
在 rew_file_name
和 agrew_file_name
的生成代码之前,添加以下打印语句:
print("arglist.plots_dir:", arglist.plots_dir)
print("arglist.exp_name:", arglist.exp_name)
这将显示 arglist.plots_dir
和 arglist.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
命令会显示当前目录中的所有文件和目录,包括隐藏文件和特殊目录。
.
代表当前目录,即命令执行的目录本身。..
代表当前目录的上级目录,即父级目录。
这两个特殊项是每个目录中的默认项。它们用于表示目录结构中的位置关系。下面是对它们的详细说明:
-
.
(点)- 在命令行中,
.
表示当前目录。 - 在文件系统中,每个目录中都存在一个隐含的
.
条目,表示该目录本身。 - 例如,如果你执行
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区别和联系
在强化学习中,display
和 render
是用于可视化环境的两个相关概念,它们有一些区别和联系。
-
display
:display
通常用于指示是否在训练过程中显示环境的可视化界面,以便观察智能体与环境的交互情况。当display
设置为True
时,环境将在训练过程中以可视化形式呈现,允许您实时观察智能体的决策和环境的状态。这对于调试和直观理解算法的表现很有帮助。 -
render
:render
是一个环境提供的方法,用于将当前环境状态渲染成可视化图像或视频。通过调用环境的render
方法,您可以获取当前环境状态的可视化表示。渲染通常用于演示、记录或展示智能体在环境中的表现。
联系:
- 在某些情况下,
display
参数可能会调用环境的render
方法来显示环境的可视化界面。当display
设置为True
时,通常会在每个时间步骤调用环境的render
方法来实时显示环境状态。 display
和render
都与环境的可视化相关,它们提供了一种观察智能体与环境交互的方式,帮助您理解和调试算法。
需要注意的是,具体的实现可能因环境库、框架或代码而有所不同。因此,在使用特定的强化学习库或框架时,最好查阅相关文档以了解准确的定义和用法。