处理多重网络中的内存问题

时间:2013-03-06 10:49:07

标签: python numpy machine-learning scipy

我有一个神经网络,其架构为1024, 512, 256, 1(输入层有1024个单位,输出层有1个单位,等等。我想使用scipy.optimize中的一种优化算法训练此网络。

问题是这些算法期望在一个向量中给出函数参数;这意味着,在我的情况下,我必须在长度为

的向量中展开所有权重
1024*512 + 512*256 + 256*1 = 655616

某些算法(如fmin_bfgs)需要使用标识矩阵,因此它们会调用

I = numpy.eye(655616)

,这并不奇怪,产生MemoryError。有没有办法让我避免将所有权重展开到一个向量中,而不是根据自己的需要调整scipy.optimize中的算法?

2 个答案:

答案 0 :(得分:1)

不要尝试使用L-BFGS将重量调整到NN。它不能很好地工作(参见早期的Yann LeCun论文),并且因为它是一个二阶方法,你将试图逼近Hessian,对于那么多权重是655,000 x 650,000矩阵:这引入了性能开销根本不合理。

网络并不是那么深:你有没有理由避免使用标准的反向支柱?如果您可以访问库实现,渐变下降,计算成本便宜,并且因为它只是一阶方法,您将无法获得相同的性能开销。

编辑:

Backpropogation意味着步骤t中w_i的更新规则是:

w_i(t)= w_i(t-1) - \ alpha(dError / dw_i)

此外,您已经遇到了视觉中的人经常使用Convolutional NNs的原因:稀疏连接大大减少了每个像素有一个神经元的权重向量的大小。

答案 1 :(得分:0)

我认为内存映射可以解决您的问题。我建议使用numpy.memmap,它针对numpy数组进行了优化。请注意,虽然内存映射可以很快,但您应该留意thrashing

对于您的一般文化,mmap模块是一个更通用的内存映射库,它包含在标准库中。