Python Theano-NameError:name';注册gpu opt';没有定义

Python Theano-NameError:name';注册gpu opt';没有定义,python,gpu,pickle,theano,Python,Gpu,Pickle,Theano,我已经在GPU上训练了Theano模型,现在想将其设置为在服务器上运行(没有GPU) 首先,由于缺少CudaNdarray类型,我的模型无法取消勾选。然后,根据来自的建议,我将选项config.experimental.unpickle\u gpu\on\u cpu设置为True 但后来我犯了一个错误: >>> import cPickle >>> f = open('results/model.save') >>> cPickle.load

我已经在GPU上训练了Theano模型,现在想将其设置为在服务器上运行(没有GPU)

首先,由于缺少
CudaNdarray
类型,我的模型无法取消勾选。然后,根据来自的建议,我将选项
config.experimental.unpickle\u gpu\on\u cpu
设置为
True

但后来我犯了一个错误:

>>> import cPickle
>>> f = open('results/model.save')
>>> cPickle.load(f)

/home/ubuntu/anaconda/lib/python2.7/site-packages/theano/sandbox/cuda/type.py:541: UserWarning: config.experimental.unpickle_gpu_on_cpu is set to True. Unpickling CudaNdarray as numpy.ndarray
warnings.warn("config.experimental.unpickle_gpu_on_cpu is set to True. Unpickling CudaNdarray as numpy.ndarray")
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/home/ubuntu/anaconda/lib/python2.7/site-packages/theano/sandbox/cuda/opt.py", line 2192, in <module>
     import theano.sandbox.cuda.extra_ops
   File "/home/ubuntu/anaconda/lib/python2.7/site-packages/theano/sandbox/cuda/extra_ops.py", line 424, in <module>
     @register_gpu_opt()
  NameError: name 'register_gpu_opt' is not defined

是的,这是一个典型的问题。 为什么会这样?由于theano将模型编译为c/cuda c代码,因此当模型从不一致的编译器中查找代码时,将发生错误

如何解决这个问题?我会选择将所有参数保存为numpy值。比如说

values_to_pickle = [p.get_value() for p in model.all_parameters()]

没有解决GPU->CPU的问题,但更多,在这里扩展lyoncao的答案:谢谢!这种方法对我来说很有意义。然而,这意味着我必须在网络的每一层实现导出/导入参数方法。。。还是有更聪明的方法?我的解决方案供您考虑:每一层都需要知道它的参数列表。然后,对于层列表(表示为var“layers”),我们可以定义一个全局函数get_all_参数(layers)和set_all_参数(layers)。对于任何具有多个层的模型,我们可以调用parameters=get_all_parameters(self.layers)和pickle参数到磁盘或从磁盘进行pickle。不需要为每一层实现save_参数或load_参数。
values_to_pickle = [p.get_value() for p in model.all_parameters()]