为 pymc3 声明 theano 变量

Declaring theano variables for 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.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 数组,最后一个是浮点数。然而,我是 得到这个“'numpy.ndarray' 对象没有属性 'type'”错误:

  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'

欢迎任何正确方向的建议。

当我从 pymc2 转到 pymc3 时,我遇到了很多浪费时间的停顿。我认为问题在于该文档非常糟糕。就代码仍在发展而言,我怀疑他们忽略了文档。 3 comments/advises:

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

  • “@theano.compile.ops.as_op”的缺点是您隐式排除了与函数梯度相关的任何分析。要访问梯度,我认为您需要以更复杂的方式定义您的函数

  • 警告:目前,如果您想在 Windows 下分发代码,使用 theano 似乎是一个问题来源。看到build a .exe for Windows from a python 3 script importing theano with pyinstaller,但我不确定这只是个人的笨拙还是真的有问题。就个人而言,我不得不放弃 theano 才能分发我的代码...