2012-07-25 46 views
6

有沒有一種很好的方法來將神經元及其關聯連接添加到/從完全連接的PyBrain網絡中/從其中移除?說我開始:PyBrain神經元操縱

from pybrain.tools.shortcuts import buildNetwork 
net = buildNetwork(2,3,1) 

我怎麼會去使它成爲一個(2,4,1)或(2,2,1)的網絡,同時保持所有舊的權重(和初始化任何新的到像初始化網絡時那樣是隨機的)?我想這樣做的原因是因爲我試圖使用進化學習策略來確定最佳體系結構,「突變」步驟涉及以某種概率添加/刪除節點。 (輸入和輸出模塊應該始終保持不變。)

編輯:我發現NeuronDecomposableNetwork應該使這更容易,但它似乎仍然需要分別跟蹤神經元和連接。

回答

4

我假設你正在沿着NEAT算法的方向行嗎? 有兩種不同的答案你的問題:

  1. 公開賽結束演進的網絡拓撲:在這種情況下,我建議封裝在它自己的「層」的每個神經元/模塊,並添加/刪除它們和它們與網絡的連接迭代,有點像this tutorial,除了會有更多(單神經元)層。在每次拓撲變化之後,不要忘記調用sortModules()方法。

  2. 尋找預定義框架內的最佳拓撲結構(例如最多1000個神經元)。在這種情況下,開始時構建完整網絡會更簡單,更高效,並且只需要掩碼的某些連接(例如使用MaskedParameters模塊)。其中,memetic algorithms(used like this)被設計來搜索這樣的拓撲空間。

的替代,就像你說的,是手工管理所有的權重(通過跟蹤what is where,或使用NeuronDecomposableNetwork),但我不建議這一點。


的一般性意見:對於pybrain的更高級的用途,如你的,依靠`buildNetwork」快捷方式實在是太有限了,你會希望直接使用網絡/模塊/連接API。

+0

太棒了,這有助於我出一噸,謝謝!我非常喜歡第一個想法。永遠不會想到使用圖層作爲單獨的神經元。是的,嘗試了大約三天後,我不會推薦手動管理大聲笑(另一個stackoverflow帖子實際上是我的想法)。我會在做一些實驗後回來(並且對NEAT進行研究,因爲這是我發現的第一個,但幾乎正是我想要的),並更新我的帖子和結果。 – ubomb 2012-08-07 17:18:17