Theano——两个矩阵相乘时的未解析符号。所有适用于矢量和张量3

Theano -- Unresolved symbol when multiplying two matrices. All works for vectors and tensor3

当我尝试运行以下代码时:

a = T.matrix('a')
b = T.matrix('b')
f = theano.function([a, b], T.batched_dot(a,b))
f([[1, 2], [5, 6]],[[3,4],[7,8]])

我收到以下错误和堆栈跟踪:

---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-13-42cb5508791b> in <module>()
      1 a = T.matrix('a')
      2 b = T.matrix('b')
----> 3 f = theano.function([a, b], T.batched_dot(a,b))
      4 f([[1, 2], [5, 6]],[[3,4],[7,8]])

/usr/local/lib/python2.7/dist-packages/theano/compile/function.pyc in function(inputs, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input)
    264                 allow_input_downcast=allow_input_downcast,
    265                 on_unused_input=on_unused_input,
--> 266                 profile=profile)
    267     # We need to add the flag check_aliased inputs if we have any mutable or
    268     # borrowed used defined inputs

/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.pyc in pfunc(params, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input)
    509     return orig_function(inputs, cloned_outputs, mode,
    510             accept_inplace=accept_inplace, name=name, profile=profile,
--> 511             on_unused_input=on_unused_input)
    512 
    513 

/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.pyc in orig_function(inputs, outputs, mode, accept_inplace, name, profile, on_unused_input)
   1464                    profile=profile,
   1465                    on_unused_input=on_unused_input).create(
-> 1466                        defaults)
   1467 
   1468     t2 = time.time()

/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.pyc in create(self, input_storage, trustme)
   1322             theano.config.traceback.limit = 0
   1323             _fn, _i, _o = self.linker.make_thunk(
-> 1324                 input_storage=input_storage_lists)
   1325         finally:
   1326             theano.config.traceback.limit = limit_orig

/usr/local/lib/python2.7/dist-packages/theano/gof/link.pyc in make_thunk(self, input_storage, output_storage)
    517     def make_thunk(self, input_storage=None, output_storage=None):
    518         return self.make_all(input_storage=input_storage,
--> 519                              output_storage=output_storage)[:3]
    520 
    521     def make_all(self, input_storage, output_storage):

/usr/local/lib/python2.7/dist-packages/theano/gof/vm.pyc in make_all(self, profiler, input_storage, output_storage)
    895                                                  storage_map,
    896                                                  compute_map,
--> 897                                                  no_recycling))
    898                 if not hasattr(thunks[-1], 'lazy'):
    899                     # We don't want all ops maker to think about lazy Ops.

/usr/local/lib/python2.7/dist-packages/theano/scan_module/scan_op.pyc in make_thunk(self, node, storage_map, compute_map, no_recycling)
    592                                name=self.name,
    593                                profile=profile,
--> 594                                on_unused_input='ignore')
    595 
    596         try:

/usr/local/lib/python2.7/dist-packages/theano/compile/function.pyc in function(inputs, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input)
    264                 allow_input_downcast=allow_input_downcast,
    265                 on_unused_input=on_unused_input,
--> 266                 profile=profile)
    267     # We need to add the flag check_aliased inputs if we have any mutable or
    268     # borrowed used defined inputs

/usr/local/lib/python2.7/dist-packages/theano/compile/pfunc.pyc in pfunc(params, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input)
    509     return orig_function(inputs, cloned_outputs, mode,
    510             accept_inplace=accept_inplace, name=name, profile=profile,
--> 511             on_unused_input=on_unused_input)
    512 
    513 

/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.pyc in orig_function(inputs, outputs, mode, accept_inplace, name, profile, on_unused_input)
   1464                    profile=profile,
   1465                    on_unused_input=on_unused_input).create(
-> 1466                        defaults)
   1467 
   1468     t2 = time.time()

/usr/local/lib/python2.7/dist-packages/theano/compile/function_module.pyc in create(self, input_storage, trustme)
   1322             theano.config.traceback.limit = 0
   1323             _fn, _i, _o = self.linker.make_thunk(
-> 1324                 input_storage=input_storage_lists)
   1325         finally:
   1326             theano.config.traceback.limit = limit_orig

/usr/local/lib/python2.7/dist-packages/theano/gof/link.pyc in make_thunk(self, input_storage, output_storage)
    517     def make_thunk(self, input_storage=None, output_storage=None):
    518         return self.make_all(input_storage=input_storage,
--> 519                              output_storage=output_storage)[:3]
    520 
    521     def make_all(self, input_storage, output_storage):

/usr/local/lib/python2.7/dist-packages/theano/gof/vm.pyc in make_all(self, profiler, input_storage, output_storage)
    895                                                  storage_map,
    896                                                  compute_map,
--> 897                                                  no_recycling))
    898                 if not hasattr(thunks[-1], 'lazy'):
    899                     # We don't want all ops maker to think about lazy Ops.

/usr/local/lib/python2.7/dist-packages/theano/sandbox/cuda/__init__.pyc in make_thunk(self, node, storage_map, compute_map, no_recycling)
    257                                     enable_cuda=False)
    258         return super(GpuOp, self).make_thunk(node, storage_map,
--> 259                                              compute_map, no_recycling)
    260 
    261 theano.compile.debugmode.default_make_thunk.append(

/usr/local/lib/python2.7/dist-packages/theano/gof/op.pyc in make_thunk(self, node, storage_map, compute_map, no_recycling)
    737                 logger.debug('Trying CLinker.make_thunk')
    738                 outputs = cl.make_thunk(input_storage=node_input_storage,
--> 739                                         output_storage=node_output_storage)
    740                 fill_storage, node_input_filters, node_output_filters = outputs
    741 

/usr/local/lib/python2.7/dist-packages/theano/gof/cc.pyc in make_thunk(self, input_storage, output_storage, keep_lock)
   1071         cthunk, in_storage, out_storage, error_storage = self.__compile__(
   1072             input_storage, output_storage,
-> 1073             keep_lock=keep_lock)
   1074 
   1075         res = _CThunk(cthunk, init_tasks, tasks, error_storage)

/usr/local/lib/python2.7/dist-packages/theano/gof/cc.pyc in __compile__(self, input_storage, output_storage, keep_lock)
   1013                                     input_storage,
   1014                                     output_storage,
-> 1015                                     keep_lock=keep_lock)
   1016         return (thunk,
   1017                 [link.Container(input, storage) for input, storage in

/usr/local/lib/python2.7/dist-packages/theano/gof/cc.pyc in cthunk_factory(self, error_storage, in_storage, out_storage, keep_lock)
   1440         else:
   1441             module = get_module_cache().module_from_key(
-> 1442                 key=key, lnk=self, keep_lock=keep_lock)
   1443 
   1444         vars = self.inputs + self.outputs + self.orphans

/usr/local/lib/python2.7/dist-packages/theano/gof/cmodule.pyc in module_from_key(self, key, lnk, keep_lock)
   1074             try:
   1075                 location = dlimport_workdir(self.dirname)
-> 1076                 module = lnk.compile_cmodule(location)
   1077                 name = module.__file__
   1078                 assert name.startswith(location)

/usr/local/lib/python2.7/dist-packages/theano/gof/cc.pyc in compile_cmodule(self, location)
   1352                 lib_dirs=self.lib_dirs(),
   1353                 libs=libs,
-> 1354                 preargs=preargs)
   1355         except Exception, e:
   1356             e.args += (str(self.fgraph),)

/usr/local/lib/python2.7/dist-packages/theano/sandbox/cuda/nvcc_compiler.pyc in compile_str(module_name, src_code, location, include_dirs, lib_dirs, libs, preargs, rpaths, py_module)
    432             #touch the __init__ file
    433             open(os.path.join(location, "__init__.py"), 'w').close()
--> 434             return dlimport(lib_filename)

/usr/local/lib/python2.7/dist-packages/theano/gof/cmodule.pyc in dlimport(fullpath, suffix)
    291                 importlib.invalidate_caches()
    292         t0 = time.time()
--> 293         rval = __import__(module_name, {}, {}, [module_name])
    294         t1 = time.time()
    295         import_time += t1 - t0

ImportError: ('The following error happened while compiling the node', for{gpu,scan_fn}(Elemwise{minimum,no_inplace}.0, GpuSubtensor{int64:int64:int8}.0, GpuSubtensor{int64:int64:int8}.0, Elemwise{minimum,no_inplace}.0), '\n', 'The following error happened while compiling the node', GpuAlloc{memset_0=True}(CudaNdarrayConstant{0.0}, TensorConstant{1}), '\n', '/home/alex/.theano/compiledir_Linux-3.13--generic-x86_64-with-Ubuntu-14.04-trusty-x86_64-2.7.6-64/tmppLzatX/e0c22e1de788a177e13f39a93c579f18.so: undefined symbol: _Z17CudaNdarray_SIZEtPK11CudaNdarray', '[GpuAlloc{memset_0=True}(CudaNdarrayConstant{0.0}, TensorConstant{1})]')

如果我将 matrix 替换为 vectortensor3(并为函数调用提供正确形状的张量),它会编译并 运行s。对于dotmatrixnone,tensor_dotbatched_dot有效,但加法和减法有效。

I 运行 pip install --upgrade theano,错误仍然存​​在。 pip 报告我当前的版本为 0.7。因为它只对矩阵失败,是否是因为某些库 theano 取决于我以某种方式碰巧配置错误?

我做错的是pip install --upgrade theano。结果我已经有了 theano 0.7,这是最新的,所以 pip install --upgrade 什么也没做(但并不明显,因为它确实升级了依赖项)。

pip uninstall theano && pip install theano 修复了问题