#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?