Numpy 为pymc3声明无变量

Numpy 为pymc3声明无变量,numpy,theano,pymc,pymc3,Numpy,Theano,Pymc,Pymc3,我在使用pymc3复制pymc2代码时遇到问题 我相信这是因为pymc3使用的theano类型变量与我使用的numpy操作不兼容。所以我使用@theano.decorator: 我有这个功能: with pymc3.Model() as model: z_stars = pymc3.Uniform('z_star', self.z_min_ssp_limit, self.z_max_ssp_limit) Av_stars = pymc3.Un

我在使用pymc3复制pymc2代码时遇到问题

我相信这是因为pymc3使用的theano类型变量与我使用的numpy操作不兼容。所以我使用@theano.decorator:

我有这个功能:

with pymc3.Model() as model:

    z_stars         = pymc3.Uniform('z_star',    self.z_min_ssp_limit, self.z_max_ssp_limit)
    Av_stars        = pymc3.Uniform('Av_star',   0.0, 5.00)
    sigma_stars     = pymc3.Uniform('sigma_star',0.0, 5.0)

    #Fit observational wavelength
    ssp_fit_output = self.ssp_fit_theano(z_stars, Av_stars, sigma_stars, 
                                         self.obj_data['obs_wave_resam'], 
                                         self.obj_data['obs_flux_norm_masked'], 
                                         self.obj_data['basesWave_resam'], 
                                         self.obj_data['bases_flux_norm'], 
                                         self.obj_data['int_mask'], 
                                         self.obj_data['normFlux_obs'])

    #Define likelihood
    like = pymc.Normal('ChiSq', mu=ssp_fit_output, 
                       sd=self.obj_data['obs_fluxEr_norm'], 
                       observed=self.obj_data['obs_fluxEr_norm'])

    #Run the sampler
    trace = pymc3.sample(iterations, step=step, start=start_conditions, trace=db)
其中:

@theano.compile.ops.as_op(itypes=[t.dscalar,t.dscalar,t.dscalar,t.dvector,
                                  t.dvector,t.dvector,t.dvector,t.dvector,t.dscalar],
                          otypes=[t.dvector])
def ssp_fit_theano(self, input_z, input_sigma, input_Av, obs_wave, obs_flux_masked, 
                   rest_wave, bases_flux, int_mask, obsFlux_mean):
   ...
   ...
前三个变量是标量(来自pymc3均匀分布)。这个 剩下的变量是numpy数组,最后一个是float。然而,我是 获取此“'numpy.ndarray'对象没有属性'type'”错误:

文件“/home/user/anaconda/lib/python2.7/site packages/theano/gof/op.py”,第615行,在调用中__
节点=self.make_节点(*输入,**kwargs)
文件“/home/user/anaconda/lib/python2.7/site packages/theano/gof/op.py”,第963行,在make_节点中
如果不是全部(inp.type==it for inp,它在zip中(inputs,self.itypes)):
文件“/home/user/anaconda/lib/python2.7/site packages/theano/gof/op.py”,第963行,在
如果不是全部(inp.type==it for inp,它在zip中(inputs,self.itypes)):
AttributeError:'numpy.ndarray'对象没有属性'type'

请注意,任何正确的建议都会受到欢迎。

当我从pymc2转到pymc3时,我有一大堆浪费时间的站点。我想问题是,医生很糟糕。我怀疑他们忽略了文档,因为代码还在不断发展。3评论/建议:

  • 我希望您能在这里使用“@theano.compile.ops.as_op”或在这里找到一些帮助

  • “@theano.compile.ops.as_op”的缺点是隐式排除了与函数梯度相关的任何分析。为了获得梯度,我认为你需要用一种更复杂的方式来定义你的函数

  • 警告:目前,如果您想在Windows下分发代码,使用theano似乎是一个问题源。你看,但我不确定这是个人的笨拙还是一个真正的问题。就我个人而言,我不得不放弃theano来分发我的代码


仅仅根据变量的名称,调用
ssp_fit_theano
不应该是
self.ssp_fit_theano(z_星、sigma_星、Av_星等)
?(与
ssp\u fit\u theano
的呼叫签名相比,第二个和第三个参数似乎不合适)。非常感谢您的回复(以及您的理解)。我一直了解到,这个问题比这复杂得多。使用pymc2,我一直设法将其变量与第三方python库结合在一起,没有任何问题。然而,现在还不是那么直截了当。当然,他们必须有自己的理由,但是文档中应该有更多的例子。
  File "/home/user/anaconda/lib/python2.7/site-packages/theano/gof/op.py", line 615, in __call__
    node = self.make_node(*inputs, **kwargs)
  File "/home/user/anaconda/lib/python2.7/site-packages/theano/gof/op.py", line 963, in make_node
    if not all(inp.type == it for inp, it in zip(inputs, self.itypes)):
  File "/home/user/anaconda/lib/python2.7/site-packages/theano/gof/op.py", line 963, in <genexpr>
    if not all(inp.type == it for inp, it in zip(inputs, self.itypes)):
AttributeError: 'numpy.ndarray' object has no attribute 'type'