Почему мой сэмплер pymc3 использует код C в Jupyter notebook?

#python #c #jupyter-notebook #theano #pymc3

#python #c #jupyter-notebook #theano #pymc3

Вопрос:

У меня проблема в Anaconda Jupyter notebook, где я запускаю сэмплер pymc3 для выборки из последующего нормального распределения.

 import autograd.numpy as np
import pymc3 as pm
from pymc3 import Model
import theano.tensor as Th
from scipy.special import softmax


def pymc3_sampling_test(out_last_hidden_layer, output_dim, y, D, mu_wanted=0, tau_wanted=1, samples_wanted=100,
                       number_chains=2):
        """
        :param out_last_hidden_layer: the feature map after the trained Neural network
        :param output_dim: the output dimension (= number of classes)
        :param y: your training labels
        :param D: the number of hidden nodes (is also the dimensionnality of the output of the feature map)
        :param mu_wanted: mu of the normal prior
        :param tau_wanted: precision of the normal prior
        :param samples_wanted: number of samples generated
        :param number_chains: number of chains ran
        :return: samples from the posterior of the Bayesian Logistic regression
        """
        initialization_pymc3 = nlm.get_feature_map_weights()
        with pm.Model() as replacing_HMC:
            w = pm.Normal('w', mu=0, tau=tau_wanted, shape=(D * output_dim   output_dim))
            linear_combinations = []
            for j in range(output_dim):
                dot = pm.math.dot(out_last_hidden_layer[0].T, w[j * D:j * D   D])   w[-output_dim j]
                linear_combi = pm.Deterministic('s'   str(j), dot)
                linear_combinations.append(linear_combi)
            thetas = pm.Deterministic('theta', Th.nnet.softmax(linear_combinations))
            y_obs = pm.Categorical('y_obs', p=thetas.T, observed=y)
            trace = pm.sample(samples_wanted, chains=number_chains)
        return trace
    
    
traces=pymc3_sampling_test( nlm.forward(nlm.weights,X_train.T,partial=True), 4, y_train.T,5)
 

Мой сэмплер работал очень медленно, и я следовал инструкциям, найденным на этом веб-сайте, и установил модуль theano с помощью pip, а также компиляторы clang_osx-64 и clangxx_osx-64.

Похоже, это заставляет мой сэмплер запускать C-код, я запускаю Python 3.8 на Mac OSX 10.15.7. Вот мое сообщение об ошибке:

 You can find the C code in this temporary file: /var/folders/72/7tyqmpr158x1ps3r1z7591pw0000gp/T/theano_compilation_error_rx998tv5
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-19-5bcc6da39369> in <module>
     33 
     34 
---> 35 traces=pymc3_sampling_test( nlm.forward(nlm.weights,X_train.T,partial=True), 4, y_train.T,5)

<ipython-input-19-5bcc6da39369> in pymc3_sampling_test(out_last_hidden_layer, output_dim, y, D, mu_wanted, tau_wanted, samples_wanted, number_chains)
     27                 linear_combi = pm.Deterministic('s'   str(j), dot)
     28                 linear_combinations.append(linear_combi)
---> 29             thetas = pm.Deterministic('theta', Th.nnet.softmax(linear_combinations))
     30             y_obs = pm.Categorical('y_obs', p=thetas.T, observed=y)
     31             trace = pm.sample(samples_wanted, chains=number_chains)

~/opt/anaconda3/lib/python3.8/site-packages/theano/tensor/nnet/nnet.py in softmax(c)
    813     if c.broadcastable[-1]:
    814         warnings.warn("The softmax is applied on a dimension of shape 1, which does not have a semantic meaning.")
--> 815     return softmax_op(c)
    816 
    817 

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/op.py in __call__(self, *inputs, **kwargs)
    667 
    668                 # compute output value once with test inputs to validate graph
--> 669                 thunk = node.op.make_thunk(node, storage_map, compute_map,
    670                                            no_recycling=[])
    671                 thunk.inputs = [storage_map[v] for v in node.inputs]

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/op.py in make_thunk(self, node, storage_map, compute_map, no_recycling, impl)
    952                               compute_map=compute_map, impl='c')
    953             try:
--> 954                 return self.make_c_thunk(node, storage_map, compute_map,
    955                                          no_recycling)
    956             except (NotImplementedError, utils.MethodNotDefined):

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/op.py in make_c_thunk(self, node, storage_map, compute_map, no_recycling)
    855                 raise NotImplementedError("float16")
    856         _logger.debug('Trying CLinker.make_thunk')
--> 857         outputs = cl.make_thunk(input_storage=node_input_storage,
    858                                 output_storage=node_output_storage)
    859         thunk, node_input_filters, node_output_filters = outputs

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/cc.py in make_thunk(self, input_storage, output_storage, storage_map, keep_lock)
   1213         """
   1214         init_tasks, tasks = self.get_init_tasks()
-> 1215         cthunk, module, in_storage, out_storage, error_storage = self.__compile__(
   1216             input_storage, output_storage, storage_map,
   1217             keep_lock=keep_lock)

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/cc.py in __compile__(self, input_storage, output_storage, storage_map, keep_lock)
   1151         input_storage = tuple(input_storage)
   1152         output_storage = tuple(output_storage)
-> 1153         thunk, module = self.cthunk_factory(error_storage,
   1154                                             input_storage,
   1155                                             output_storage,

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/cc.py in cthunk_factory(self, error_storage, in_storage, out_storage, storage_map, keep_lock)
   1621             for node in self.node_order:
   1622                 node.op.prepare_node(node, storage_map, None, 'c')
-> 1623             module = get_module_cache().module_from_key(
   1624                 key=key, lnk=self, keep_lock=keep_lock)
   1625 

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/cmodule.py in module_from_key(self, key, lnk, keep_lock)
   1187             try:
   1188                 location = dlimport_workdir(self.dirname)
-> 1189                 module = lnk.compile_cmodule(location)
   1190                 name = module.__file__
   1191                 assert name.startswith(location)

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/cc.py in compile_cmodule(self, location)
   1518         try:
   1519             _logger.debug("LOCATION %s", str(location))
-> 1520             module = c_compiler.compile_str(
   1521                 module_name=mod.code_hash,
   1522                 src_code=src_code,

~/opt/anaconda3/lib/python3.8/site-packages/theano/gof/cmodule.py in compile_str(module_name, src_code, location, include_dirs, lib_dirs, libs, preargs, py_module, hide_symbols)
   2396             # prints the exception, having 'n' in the text makes it more
   2397             # difficult to read.
-> 2398             raise Exception('Compilation failed (return status=%s): %s' %
   2399                             (status, compile_stderr.replace('n', '. ')))
   2400         elif config.cmodule.compilation_warning and compile_stderr:

Exception: ('Compilation failed (return status=1): In file included from /Users/gaelancel/.theano/compiledir_macOS-10.15.7-x86_64-i386-64bit-i386-3.8.5-64/tmp03mtegep/mod.cpp:1:. In file included from /Users/gaelancel/opt/anaconda3/include/python3.8/Python.h:25:. In file included from /usr/local/include/stdio.h:64:. /usr/local/include/_stdio.h:93:16: warning: pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified) [-Wnullability-completeness].         unsigned char   *_base;.                         ^. /usr/local/include/_stdio.h:93:16: note: insert '_Nullable' if the pointer may be null.         unsigned char   *_base;.

````




 

Ответ №1:

Theano генерирует и компилирует код языков (в первую очередь C), чтобы увеличить скорость его вычисления. https://en.wikipedia.org/wiki/Theano_ (программное обеспечение)). PyMC3 полагается на theano, и его математические операции нельзя смешивать с не-theano (например scipy.special.softmax ).

Код примера завершается сбоем, поскольку операция Th.nnet.softmax thenao принимает только тензоры theno как минимум двух измерений. В примере linear_combinations вместо этого передается список.

Вы можете объединить тензоры в списке в один тензор, например, с помощью

 Th.concatenate(linear_combinations, axis=0)
 

Осторожно: Th.nnet.softmax работает вдоль оси 1 (s. https://github.com/pymc-devs/Theano-PyMC/issues/183 ). Поэтому вы можете захотеть перенести linear_combi его перед добавлением linear_combinations .

Я запустил следующий код без ошибок:

 import pymc3 as pm
from pymc3 import Model
import theano.tensor as Th
import numpy as np


def pymc3_sampling_test(out_last_hidden_layer, output_dim, y, D, mu_wanted=0, tau_wanted=1, samples_wanted=100,
                       number_chains=2):
        with pm.Model() as replacing_HMC:
            w = pm.Normal('w', mu=0, tau=tau_wanted, shape=(D * output_dim   output_dim))
            linear_combinations = []
            for j in range(output_dim):
                dot = pm.math.dot(out_last_hidden_layer[0].T, w[j * D:j * D   D])   w[-output_dim j]
                linear_combi = pm.Deterministic('s'   str(j), Th.shape_padleft(dot, n_ones=1))
                linear_combinations.append(linear_combi)
            lc = Th.concatenate(linear_combinations, axis=0)
            thetas = pm.Deterministic('theta', Th.nnet.softmax(lc))
            y_obs = pm.Categorical('y_obs', p=thetas.T, observed=y)
            trace = pm.sample(samples_wanted, chains=number_chains)
        return trace

pymc3_sampling_test(np.array([[1,2,3],[4,5,6],[7,8,9]]), 4, [0], 3)
 

Я использовал PyMC3 3.9.3 на macOS 11.0.1. Я установил PyMC3 и все его зависимости с помощью

 conda install -c conda-forge pymc3
 

Комментарии:

1. Спасибо за ответ, но когда я изменяю свою строку в thetas = pm.Deterministic('theta', Th.nnet.softmax(Th.concatenate(linear_combinations, axis=0))) сообщение об ошибке, оно сохраняется!

2. Работает ли код с другими значениями out_last_hidden_layer , например, для массива numpy?