pymc3报initvals未使用ValueError错误解决方案
这个错误是PyMC3版本API不匹配导致的,和系统、C++编译器、Theano版本无关。
Automated Recommendation Tool(ART)的源码是基于PyMC3 3.8及更早版本编写的,在PyMC3 3.9及之后的版本中,pm.sample()的参数规则做了调整:旧版本用于传入采样初始值的initvals参数被改名为start,且参数不再透传给步方法初始化逻辑。你当前安装的是PyMC3 3.11.4,代码里传的initvals会被当成未识别的步方法参数,直接抛出ValueError。
二选一即可,优先选第一个方案,改动最小、不会引发依赖冲突。
方案1:修改ART源码适配新版PyMC3(推荐)
找到本地ART安装目录下的art/core.py文件,定位到1428行附近的pm.sample()调用块,做一处参数名修改即可:
- 将传入的
initvals=initvals修改为start=initvals
修改后的对应代码段如下:
step = pm.NUTS() self.trace[j] = pm.sample( const.n_iterations, step=step, start=initvals, progressbar=progressbar, tune=const.tune_steps, cores=cores, return_inferencedata=False, )
保存修改后重新运行代码即可解决该报错。
补充:如果后续运行碰到其他参数类报错,都是同一类版本适配问题,对照PyMC3 3.11.4的API说明替换对应参数名即可,不存在底层逻辑冲突。
方案2:降级PyMC3到ART适配版本
如果不想修改源码,可以直接将PyMC3降级到3.8版本,和ART原生适配:
# pip环境执行 pip install pymc3==3.8 # conda环境执行 # conda install pymc3=3.8
降级完成后无需改任何代码,直接运行即可。该方案的缺点是老版本PyMC3可能和当前环境的其他依赖产生版本冲突,稳定性不如方案1。
如果修复参数问题后,多核心采样出现进程卡死、随机数种子异常的问题,可以把pm.sample()里的cores参数暂时设为1,单核心跑通后再尝试调大核心数,这是Linux环境下PyMC3多进程fork和新版Theano的已知兼容问题。
内容的提问来源于stack exchange,提问作者vaibhav mohite

