/plato/controller/basic_controller.py
,line 415 中,将三个'/'
改成os.sep
,所有的 controller 都要改。否则会出现ValueError: Configuration file CamRest_text.yaml not found!
的错误,这是因为 windows 电脑的分隔符是\\
而不是'/'
。- 如果使用 pycharm 运行 plato 而不是命令行,有几点需要注意(在命令行中运行时,加载文件都是从项目根目录找的)。本质上,Plato 在加载模型时,使用了相对路径。即默认程序会从项目根目录查找文件,但是在 pycharm 中,会从当前正在运行的模块中查找文件。以下是两种情况,分别为两种解决办法:
- 在运行 LudwigNLU(或自定义的预训练 NLU) 而不是 SlotFillingNLU 的情况下。在包
applications/cambridge_restaurants
中有一个模块为cambridge_restaurants_agent.py
,它可以供人直接运行(只需稍作更改)。但是这会报错Plato error! Ludwig nlu: Model directory models/camrest_nlu/sys/experiment_run/model not found
,这是因为在applications/cambridge_restaurants
路径下运行程序,那么项目的根路径就变了plato/applications/cambridge_restaurants
而不是plato
。所以在加载模型时,模型的路径错了。所以可以在 plato 项目的根路径下新建一个 py 文件,然后把cambridge_restaurants_agent.py
的代码拷过去。 - 使用 multi-agent 时,也会产生类似的错误。在
plato/agent/component/dialogue_policy/reinforcement_learning/wolf_phc_policy.py
文件的load()
方法中,加载 pkl 文件时,文件路径有问题,应该是当前文件并非处于根目录造成的,只要改为绝对路径即可。将if isinstance(path, str):
内的代码更改为:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import plato
plato_path = "/".join(plato.__file__.split(os.sep)[:-2]) + '/'
new_path = plato_path + path
if os.path.isfile(new_path):
with open(new_path, 'rb') as file:
obj = pickle.load(file)
if 'Q' in obj:
self.Q = obj['Q']
if 'pi' in obj:
self.pi = obj['pi']
if 'mean_pi' in obj:
self.mean_pi = obj['mean_pi']
if 'state_counter' in obj:
self.state_counter = obj['state_counter']
if 'a' in obj:
self.alpha = obj['a']
if 'e' in obj:
self.epsilon = obj['e']
if 'g' in obj:
self.gamma = obj['g']
print('WoLF-PHC dialogue_policy loaded from {0}.'
.format(new_path))
else:
print('Warning! WoLF-PHC dialogue_policy file %s not found'
% new_path)
- 在运行 LudwigNLU(或自定义的预训练 NLU) 而不是 SlotFillingNLU 的情况下。在包
- 使用 ludwig 训练 NLU/DST/NLG 时,会出现找不到日志文件夹的错误,因为它没有自动创建 log 文件夹的上一级文件夹。个人认为是框架的 bug,所以在训练的时候应该要加上
--skip_save_log
跳过日志记录。
uber plato v0.2使用注意点(踩坑)
- 本文链接: https://yan624.github.io/posts/f067676c.html
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!