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

pir*_*pir 20 python machine-learning neural-network theano deep-learning

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

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

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

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

bas*_*ndi 1

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

y = x.dot(w)
Run Code Online (Sandbox Code Playgroud)

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

y = [x[edges[i]].dot(w[i])) for i in neurons]
Run Code Online (Sandbox Code Playgroud)

其中edges[i]包含连接到神经元的神经元的索引i以及w[i]该连接的权重。

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