代码之家  ›  专栏  ›  技术社区  ›  merv

错误:非常量表达式不能从“npy-intp”类型缩小到“int”

  •  1
  • merv  · 技术社区  · 6 年前

    我尝试运行以下模型,但在编译期间失败:

    import numpy as np
    import pymc3 as pm
    
    
    def sample_data(G=1, K=2):
        # mean proportion ([0,1]) for each g
        p_g = np.random.beta(2, 2, size=G)
    
        # concentration around each p_g
        c_g = np.random.lognormal(mean=0.5, sigma=1, size=G)
    
        # reparameterization for standard Beta(a,b)
        a_g = c_g * p_g / np.sqrt(p_g**2 + (1.-p_g)**2)
        b_g = c_g*(1.-p_g) / np.sqrt(p_g**2 + (1.-p_g)**2)
    
        # for each p_g, sample K proportions
        p_gk = np.random.beta(a_g[:, np.newaxis], b_g[:, np.newaxis], size=(G, K))
    
        return p_gk
    
    # Data size
    G = 3
    K = 5
    
    # obtain a G x K array of proportions p_gk in [0,1]
    data = sample_data(G, K) 
    
    with pm.Model() as m:
    
        # Parameters
        p_g = pm.Beta('p_g', 1., 1., shape=G)
        sd_g = pm.HalfNormal('sd_g', sd=1., shape=G)
    
        # Observed proportions
        p_gk = pm.Beta('p_gk', mu=p_g, sd=sd_g, shape=(G, K), observed=data)
    
        trace = pm.sample(2000)
    

    有了这些错误:

    Exception: ("Compilation failed (return status=1):
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:400:27: 
      error: non-constant-expression cannot be narrowed from type 'npy_intp' (aka 'long') to 'int' in initializer list [-Wc++11-narrowing].
         int init_totals[2] = {V3_n0, V3_n1};.
                               ^~~~~.
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:400:27:
      note: insert an explicit cast to silence this issue.
         int init_totals[2] = {V3_n0, V3_n1};.
                               ^~~~~.
                               static_cast<int>( ).
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:400:34: 
      error: non-constant-expression cannot be narrowed from type 'npy_intp' (aka 'long') to 'int' in initializer list [-Wc++11-narrowing].
         int init_totals[2] = {V3_n0, V3_n1};.
                                      ^~~~~.
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:400:34: 
      note: insert an explicit cast to silence this issue.
         int init_totals[2] = {V3_n0, V3_n1};.
                                      ^~~~~.
                                      static_cast<int>( ).
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:412:9: 
      error: non-constant-expression cannot be narrowed from type 'ssize_t' (aka 'long') to 'int' in initializer list [-Wc++11-narrowing].
             V3_stride0, V3_stride1, .
             ^~~~~~~~~~.
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:412:9: 
      note: insert an explicit cast to silence this issue.
             V3_stride0, V3_stride1, .
             ^~~~~~~~~~.
             static_cast<int>( ).
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:412:21: 
      error: non-constant-expression cannot be narrowed from type 'ssize_t' (aka 'long') to 'int' in initializer list [-Wc++11-narrowing].
             V3_stride0, V3_stride1, .
                         ^~~~~~~~~~.
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:412:21:
      note: insert an explicit cast to silence this issue.
             V3_stride0, V3_stride1, .
                         ^~~~~~~~~~.
                         static_cast<int>( ).
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:413:1: 
      error: non-constant-expression cannot be narrowed from type 'ssize_t' (aka 'long') to 'int' in initializer list [-Wc++11-narrowing].
     V1_stride0, V1_stride1.
     ^~~~~~~~~~.
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:413:1: 
      note: insert an explicit cast to silence this issue.
     V1_stride0, V1_stride1.
     ^~~~~~~~~~.
     static_cast<int>( ).
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:413:13:
      error: non-constant-expression cannot be narrowed from type 'ssize_t' (aka 'long') to 'int' in initializer list [-Wc++11-narrowing].
     V1_stride0, V1_stride1.
                 ^~~~~~~~~~.
    
    /Users/mfansler/.theano/compiledir_Darwin-17.6.0-x86_64-i386-64bit-i386-3.6.3-64/tmpr58gulp2/mod.cpp:413:13:
      note: insert an explicit cast to silence this issue.
     V1_stride0, V1_stride1.
                 ^~~~~~~~~~.
                 static_cast<int>( ).
    
    6 errors generated.. ", '[Elemwise{log,no_inplace}(TensorConstant{[[0.297343..76841722]]})]')
    

    我刚接触Pymc3。在运行现有的PYMC3示例时,我看不到这些错误。我怀疑我看到这些是因为我使用的是多维格式(即, (G,K) ,因为我还没有看到其他人使用这种格式(我可能是在强调我对斯坦的熟悉)。

    通常,我很难理解如何实现具有多个维度的多级模型。

    知道是什么导致了我看到的错误吗?


    版本

    • 蟒蛇3.6.3
    • 数字1.14.5
    • 序号1.0.2
    • PYMC3 3.4.1型
    • Mac操作系统10.13.5

    更新

    我安装了相同的软件包版本(通过 conda )在一个hpc节点上(centos 7),并且能够运行 the modified version of the model suggested by @colcarroll . 但是,在我的OSX机器上,我仍然可以看到上面指出的theano编译错误,即使模型发生了更改。这可能是一个 clang 有问题吗?可以指定编译器供theano使用吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   colcarroll    6 年前

    shape

    with pm.Model() as m:
    
        # Parameters
        p_g = pm.Beta('p_g', 1., 1., shape=(G, 1))
        sd_g = pm.HalfNormal('sd_g', sd=1, shape=(G, 1))
    
        # Observed proportions
        p_gk = pm.Beta('p_gk', mu=p_g.dot(np.ones((1,K))), sd=sd_g.dot(np.ones((1, K))), shape=(G, K), observed=data)
        trace = pm.sample()
    

    m.check_test_point() p_gk sd_g mu, sd

    sd_g = pm.HalfNormal('sd_g', sd=0.1, shape=(G, 1))

        2
  •  1
  •   merv    6 年前

    import theano
    
    theano.config.gcc.cxxflags = "-Wno-c++11-narrowing"
    

    -Wc++11-narrowing