问题描述
我正在接受pymc3的培训,因此我建立了一个二维聚类模型:
我已经调试了模型,下面是代码:
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import pymc3 as pm
import theano
import theano.tensor as tt
#Generating data
N = 1000
p = (0.1,0.3,0.6)
M = ((1.,1.),(2.,1.5),(3.,1.))
D = (0.23,0.2,0.25)
n = N * np.array(p)
n = [int(n_) for n_ in n]
clast = [np.empty([n_,2]) for n_ in n]
for i in range(3):
for j in range(n[i]):
clast[i][j,0] = np.random.normal(M[i][0],D[i])
clast[i][j,1] = np.random.normal(M[i][1],D[i])
data = np.concatenate([clast[0],clast[1],clast[2]])
np.random.shuffle(data)
#Bulding model
#Point estimation of params
data_mean = [x.mean() for x in data.T]
data_std = [x.std() for x in data.T]
data_std = np.mean(data_std)
model = pm.Model()
with model:
p_ = pm.Uniform("p_",0.,1.,shape = 3)
p = p_ / p_.sum()
assignment = pm.Categorical("assignment",p,shape=N,testval=np.random.randint(0,3,N))
mu = pm.Normal("mu",np.ones([3,2]) * data_mean,2]) * data_std ** 2,shape = (3,2))
sigma = pm.Exponential("sigma",2]) * data_std / 3,2))
mu_rand = pm.Deterministic("mu_rand",mu[assignment])
sigma_rand = pm.Deterministic("sigma_rand",sigma[assignment])
obsX = pm.Normal("obsX",mu_rand[:,0],sigma_rand[:,observed = data[:,0])
obsY = pm.Normal("obsY",1],1])
obs = pm.Deterministic("obs",tt.stack([obsX,obsY],axis = 1))
map_estimate = pm.find_MAP(method = "powell")
step1 = pm.Metropolis(vars=[p,mu,sigma])
step2 = pm.ElemwiseCategorical(vars=[assignment])
trace = pm.sample(10000,tune = 1000,step = [step1,step2],start = map_estimate,chains = 1)
上面的代码可以正常运行,但是收敛所需的时间过多(约30分钟)。
然后,我决定尝试以GPU加速运行它(PyMC3简历承诺“清晰的GPU支持”)。我安装了CUDA,随后Theano页面的示例代码报告成功使用GPU并加快了大约30倍的速度。 然后,我转到模型上,并在GPU使用情况下配置Theano来运行它。
然后是错误。最初,gpuarray加载良好,并且启用了CUDA。我们有:
Using cuDNN version 7104 on context None
Preallocating 4000/6144 Mb (0.651042) on cuda
Mapped name None to device cuda: GeForce GTX 1060 6GB (0000:01:00.0)
但是在采样时,我们会收到以下消息:
ERROR (theano.gof.opt): Optimization failure due to: local_IncSubtensor_serialize
ERROR (theano.gof.opt): node: Elemwise{add,no_inplace}(Elemwise{mul}.0,AdvancedIncSubtensor1{no_inplace,inc}.0)
ERROR (theano.gof.opt): TRACEBACK:
ERROR (theano.gof.opt): Traceback (most recent call last):
File "C:\Users\math\miniconda3\lib\site-packages\theano\gof\opt.py",line 2034,in process_node
replacements = lopt.transform(node)
File "C:\Users\math\miniconda3\lib\site-packages\theano\tensor\opt.py",line 3327,in local_IncSubtensor_serialize
tip = mi.owner.op(tip,*mi.owner.inputs[1:])
File "C:\Users\math\miniconda3\lib\site-packages\theano\gof\op.py",line 615,in __call__
node = self.make_node(*inputs,**kwargs)
File "C:\Users\math\miniconda3\lib\site-packages\theano\tensor\subtensor.py",line 1919,in make_node
ilist_ = theano.tensor.as_tensor_variable(ilist)
File "C:\Users\math\miniconda3\lib\site-packages\theano\tensor\basic.py",line 142,in as_tensor_variable
return x._as_TensorVariable() # TODO: pass name and ndim arguments
File "C:\Users\math\miniconda3\lib\site-packages\theano\gpuarray\type.py",line 579,in _as_TensorVariable
return host_from_gpu(self)
File "C:\Users\math\miniconda3\lib\site-packages\theano\gof\op.py",**kwargs)
File "C:\Users\math\miniconda3\lib\site-packages\theano\gpuarray\basic_ops.py",line 578,in make_node
raise TypeError(x)
TypeError: assignment_shared__
我不知道如何解决它。
我尝试过的事情:
-
重新安装软件包,然后重新安装整个conda(我使用此环境)
-
以不同方式重新配置.theanorc
-
试图在另一台机器上运行它,但出现相同的错误
-
与Theano共享的
data
变量float32:data = theano.shared(data,theano.config.floatX)
什么都没改变。
我想:
- 错误代码结尾的字符串
TypeError: assignment_shared__
使我认为变量assignment
的类型有问题。当我检查它是形状为1000的int16数组时,我遇到了一个问题,根据GPU机器注册表,CUDA上的Theano“喜欢” 32位值。但是我看不到我可以用显式方式处理此变量类型的方法,因为它隐藏在PyMC3“黑色外壳”中。所以我没有武器。
有没有人可以建议对此错误原因的任何猜测?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)