是否有一种很好的方法可以在完全连接的PyBrain网络中添加/删除神经元及其相关连接?说我开始:
from pybrain.tools.shortcuts import buildNetwork
net = buildNetwork(2,3,1)
如何保持所有旧权重(并初始化任何新权重,如初始化网络时所做的那样),我将如何使其成为(2,4,1)或(2,2,1)网络? )?我想这样做的原因是因为我试图使用进化学习策略来确定最佳架构,而“突变”步骤则涉及以某种可能性添加/删除节点。 (输入和输出模块应始终保持不变。)
编辑:我发现NeuronDecomposableNetwork应该让这更容易,但似乎我必须分别跟踪神经元和连接。
答案 0 :(得分:4)
我假设您正在按照NEAT算法进行操作? 您的问题有两个不同的答案:
开放式网络拓扑的演变:在这种情况下,我建议将每个神经元封装在自己的“层”/模块中,并添加/删除它们以及它们与网络的连接迭代地,有点像this tutorial,除了会有更多(单神经元)层。不要忘记在每次拓扑更改后调用sortModules()
方法。
在预定义框架内找到最佳拓扑(例如最多1000个神经元)。在这种情况下,在开始时构建完整网络更容易,更有效,只需掩盖一些连接(例如使用MaskedParameters
模块)。其中,memetic algorithms (used like this)旨在搜索此类拓扑空间。
正如您所说,另一种方法是手动管理所有权重(通过跟踪what is where或使用NeuronDecomposableNetwork
),但我不建议。
一般性评论:对于像你这样的pybrain的更高级用法,依赖于`buildNetwork'的快捷方式实在太有限了,你需要直接使用网络/模块/连接API。