在神经网络中实现稀疏连接(Theano)

时间:2016-04-05 22:11:08

标签: python machine-learning neural-network theano deep-learning

神经网络的一些使用案例要求并非所有神经元都连接在两个连续层之间。对于我的神经网络架构,我需要有一个层,其中每个神经元只与前一层中某些预先指定的神经元有连接(在某些任意位置,而不是像卷积层这样的模式)。这是为了对特定图形上的数据建模所必需的。我需要实现这个" Sparse" Theano中的一层,但我并不习惯Theano的编程方式。

似乎在Theano中编写稀疏连接的最有效方法是使用theano.tensor.nnet.blocksparse.SparseBlockGemv。另一种方法是进行矩阵乘法,其中许多权重设置为0(=无连接),但与n_job相比效率非常低,因为每个神经元仅连接到前一层中的2-6个神经元超过~100000个神经元。此外,100000x100000的重量矩阵不适合我的RAM / GPU。因此,有人可以提供一个如何使用SparseBlockGemv方法或其他计算效率方法实现稀疏连接的示例吗?

一个完美的例子是在隐藏层之后(在softmax之前)用额外的层扩展MLP Theano Tutorial,其中每个神经元只与前一层中的神经元子集有连接。但是,其他例子也非常受欢迎!

编辑:请注意,该图层必须在Theano中实现,因为它只是大型架构的一小部分。

2 个答案:

答案 0 :(得分:1)

完全连接层的输出由输入的点积和该层的权重给出。在theano或numpy中,您可以使用dot方法。

y = x.dot(w)

如果您只与前一层中的某些神经元建立了连接,并且这些连接是预定义的,您可以执行以下操作:

y = [x[edges[i]].dot(w[i])) for i in neurons]

edges[i]包含连接到神经元iw[i]的神经元的索引。此连接的权重。

请注意,theano不了解图层或其他高级细节。

答案 1 :(得分:1)

为复活旧线程而道歉,但这是我发现的最简单的指导,有助于扩展https://iamtrask.github.io/2015/07/12/basic-python-network/对部分连接输入的指导。然而,我花了一段时间来理解basaundi的答案,我想我可以改进它。

我需要更改一些东西以使其正常工作。在我的情况下,我试图从N个输入映射到我的第一个隐藏层中的M个神经元。我的输入是NxF数组,其中F是输入的要素数,输入和第一层之间的突触值(权重)是FxM数组。因此,输入<点>的输出。权重是NxM数组。我的边缘矩阵是一个MxF数组,它为第1层(行)中的每个神经元指定,输入数据的哪些特征是相关的(列)。

在这个设置中,至少,它要求我以不同于上面指定的方式对数组进行切片。此外,列表推导返回矩阵列表,必须将其汇总以获得正确的NxM(否则您将得到一个MxNxM数组)。

所以我使用了以下内容(util.sigmoid是我自己的辅助函数):

y = [numpy.dot(x[:, edges[i]], w[edges[i]]) 
     for i in range(M)]
y = util.sigmoid(numpy.sum(y, 0))

这似乎对我有用。