5

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

问题是这些算法期望函数参数在一个向量中给出。这意味着,就我而言,我必须将所有权重展开为长度向量

1024*512 + 512*256 + 256*1 = 655616

一些算法(如fmin_bfgs)需要使用恒等矩阵,因此它们会调用

I = numpy.eye(655616)

毫不奇怪,它会产生一个MemoryError. 我有什么办法可以避免将所有权重展开到一个向量中,scipy.optimize而不是根据自己的需要调整算法?

4

2 回答 2

1

不要尝试使用 L-BFGS 将权重拟合到 NN。它的效果不是特别好(请参阅 Yann LeCun 早期的论文),并且因为它是一种二阶方法,您将尝试逼近 Hessian,对于这么多的权重,它是一个 655,000 x 650,000 矩阵:这引入了一个根本不合理的性能开销。

网络没有那么深:你有没有理由避免使用标准的反向支持?如果您可以访问库实现,这只是梯度下降,梯度的计算成本很低,并且因为它只是一阶方法,所以您不会有相同的性能开销。

编辑:

反向传播意味着 w_i 在步骤 t 的更新规则是:

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

此外,您遇到了视觉领域的人经常使用卷积神经网络的原因:稀疏连接极大地减小了每个像素有一个神经元的权重向量的大小。

于 2013-03-18T13:01:54.043 回答
0

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

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

于 2013-03-18T09:32:13.957 回答