一些用于神经网络的用例要求,并不是所有的神经元都连接在两个连续的层之间。对于我的神经网络体系结构,我需要一个层,其中每个神经元只与前一层中的一些预先指定的神经元有连接(在一些任意的地方,而不是像卷积层这样的模式)。为了在特定的图形上对数据建模,需要这样做。我需要在Theano中实现这个“稀疏”层,但是我不习惯Theano的编程方式。
在Theano中编程稀疏连接最有效的方法似乎是使用theano.tensor.nnet.blocksparse.SparseBlockGemv。另一种方法是进行矩阵乘法,其中许多权值被设置为0 (=无连接),但与SparseBlockGemv
相比,这是非常低效的,因为每个神经元在~100000个神经元中仅连接到前一层的2-6个神经元。此外,100000x100000的权重矩阵不适合我的RAM/GPU。因此,有人能提供如何使用SparseBlockGemv
方法或另一种计算效率高的方法实现稀疏连接的示例吗?
一个完美的例子是扩展MLP Theano Tutorial,在隐藏层之后(在softmax之前)增加一个额外的层,其中每个神经元只能连接到前一层中的一个神经元子集。不过,其他的例子也很受欢迎!
编辑:注意到该层必须在Theano中实现,因为它只是更大体系结构的一小部分。
发布于 2016-04-15 08:13:21
全连通层的输出由输入的点积和该层的权值决定。在theano或numpy中,您可以使用dot
方法。
y = x.dot(w)
如果您只与前一层中的某些神经元有连接,并且这些连接是预先定义的,那么您可以这样做:
y = [x[edges[i]].dot(w[i])) for i in neurons]
其中,edges[i]
包含与神经元i
和w[i]
连接的神经元的指数,该连接的权重。
请注意,西亚诺不知道层或其他高层的细节。
发布于 2018-03-14 17:19:11
很抱歉复活了一个旧线程,但这是我发现的最简单的指导,它有助于在https://iamtrask.github.io/2015/07/12/basic-python-network/上将指导扩展到部分连接的输入。然而,我花了一段时间才明白了巴萨迪的回答,我认为我可以改进它。
有几件事,我需要改变,以使它发挥作用。在我的例子中,我试图从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))
这似乎对我有用。
https://stackoverflow.com/questions/36437989
复制相似问题