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

问题描述 投票:0回答:2

神经网络的一些用例要求并非所有神经元都在两个连续层之间连接。对于我的神经网络架构,我需要有一个层,其中每个神经元仅与前一层中的一些预先指定的神经元有连接(在某种程度上任意的位置,而不是具有诸如卷积层之类的模式)。这是为了在特定图表上对数据进行建模所必需的。我需要在 Theano 中实现这个“稀疏”层,但我不习惯 Theano 的编程方式。

在 Theano 中编程稀疏连接的最有效方法似乎是使用 theano.tensor.nnet.blocksparse.SparseBlockGemv。另一种方法是进行矩阵乘法,其中许多权重设置为 0(= 无连接),但这与

SparseBlockGemv
相比效率非常低,因为每个神经元仅与前一层中的 2-6 个神经元连接。 〜100000 个神经元。此外,100000x100000 的权重矩阵不适合我的 RAM/GPU。有人可以提供一个如何使用
SparseBlockGemv
方法或其他计算效率高的方法来实现稀疏连接的示例吗?

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

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

python machine-learning neural-network theano deep-learning
2个回答
1
投票

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

dot
方法。

y = x.dot(w)

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

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

其中

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

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


1
投票

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

为了让它发挥作用,我需要改变一些事情。就我而言,我试图将 N 个输入映射到第一个隐藏层中的 M 个神经元。我的输入位于 NxF 数组中,其中 F 是输入的特征数量,输入和第一层之间的突触值(权重)位于 FxM 数组中。因此,Inputs Weights 的输出是一个 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))

这似乎对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.