神经网络的一些用例要求并非所有神经元都在两个连续层之间连接。对于我的神经网络架构,我需要有一个层,其中每个神经元仅与前一层中的一些预先指定的神经元有连接(在某种程度上任意的位置,而不是具有诸如卷积层之类的模式)。这是为了在特定图表上对数据进行建模所必需的。我需要在 Theano 中实现这个“稀疏”层,但我不习惯 Theano 的编程方式。
在 Theano 中编程稀疏连接的最有效方法似乎是使用 theano.tensor.nnet.blocksparse.SparseBlockGemv。另一种方法是进行矩阵乘法,其中许多权重设置为 0(= 无连接),但这与
SparseBlockGemv
相比效率非常低,因为每个神经元仅与前一层中的 2-6 个神经元连接。 〜100000 个神经元。此外,100000x100000 的权重矩阵不适合我的 RAM/GPU。有人可以提供一个如何使用 SparseBlockGemv
方法或其他计算效率高的方法来实现稀疏连接的示例吗?
一个完美的例子是在隐藏层之后(在 softmax 之前)扩展 MLP Theano 教程,其中每个神经元仅与前一层中的神经元子集有连接。但是,也非常欢迎其他示例!
编辑:请注意,该层必须在 Theano 中实现,因为它只是较大架构的一小部分。
全连接层的输出由输入和该层权重的点积给出。在 theano 或 numpy 中,您可以使用
dot
方法。
y = x.dot(w)
如果您仅与前一层中的某些神经元有连接,并且这些连接是预定义的,您可以执行以下操作:
y = [x[edges[i]].dot(w[i])) for i in neurons]
其中
edges[i]
包含与神经元 i
连接的神经元的索引,以及 w[i]
该连接的权重。
请注意,theano 不了解图层或其他高级细节。
为复活旧线程而道歉,但这是我发现的最简单的指导,对于部分扩展https://iamtrask.github.io/2015/07/12/basic-python-network/的指导很有用- 连接的输入。然而,我花了一段时间才理解 basaundi 的答案,我认为我可以改进它。
为了让它发挥作用,我需要改变一些事情。就我而言,我试图将 N 个输入映射到第一个隐藏层中的 M 个神经元。我的输入位于 NxF 数组中,其中 F 是输入的特征数量,输入和第一层之间的突触值(权重)位于 FxM 数组中。因此,Inputs
至少在这个设置中,它要求我以不同于上面指定的方式对数组进行切片。此外,列表推导式返回一个矩阵列表,必须将其相加才能得到正确的 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))
这似乎对我有用。