2010-06-02 74 views
0

我有一個圖層(網絡),它由包含節點(神經元)的圖層組成。我想寫一個過程來以最優雅的方式複製整個圖 - 即在節點或圖層的結構中添加最少或沒有開銷。或者換句話說 - 程序可能很複雜,但複雜性不應該「泄露」到結構中。他們應該不會因爲複製而變得複雜。如何優雅地複製圖形(神經網絡)

我寫C#代碼,到目前爲止,它看起來是這樣的:

  • 神經元有更多的領域 - copy_of這是指針,其基地複製的神經元,這是我的 額外的開銷
  • 神經元有參數方法克隆()
  • 神經元有方法重新連接() - 其從交換「源」神經元(參數)的「目標」的神經元(參數)連接
  • 層具有參數方法克隆() - 它只需調用Clone()f或所有神經元
  • 網絡具有無參數方法Clone() - 它爲每個層調用Clone(),然後遍歷所有神經元並創建映射neuron => copy_of,然後調用Reconnect交換所有「連線」

我希望我的方法很明確。問題是 - 有沒有更優雅的方法,我特別不喜歡在被複制的情況下在神經元類中保留額外的指針!我想收集數據在一點(網絡的克隆),然後完全處置它(克隆方法不能有一個參數,雖然)。

+0

如果你經常做這種克隆,你可能要考慮使用不可變的數據結構(其中「複製」是O(1)時間和空間)。 – 2010-06-02 21:30:57

+0

這也意味着每個操作都需要克隆整個圖形 - 並且分配內存不是免費的。此外,我不明白如何在這種情況下使數據不可變_使克隆更加優雅。 – greenoldman 2010-06-07 06:51:12

回答

1

使用哈希表複製一般圖:

h = new HashTable() 
def copyAll(node): 
    if h has key node: return h[node] 
    copy = node.copy() 
    h[node] = copy 
    for each successor of node: 
    copy.addSuccessor(copy(successor)) 
    return copy 

您的特定圖形似乎是無環的特殊結構,所以你並不需要一個哈希表(你可以使用一個數組來代替)和您所描述的方法似乎是複製它的最佳方法。

如果你正在編寫一個神經網絡,你應該使用矢量和浮點矩陣來表示神經元。現在看起來可能不那麼高雅,但相信我會更優雅(而且速度也快幾個數量級)。

考慮一個2層神經網絡,輸入(n個節點)和輸出(m個節點)。現在假設我們有一個稱爲in的浮點向量,它表示輸入層的值,我們想要計算一個名爲out的向量,它表示輸出層的值。神經網絡本身由浮游物的矩陣組成。 M[i][j]表示輸入節點i與輸出節點j之間的連接有多強。的優點在於,估計網絡是相同的矩陣乘法隨後施加的激活函數的結果向量的每個元素:

out = f(M*in) 

f是激活函數,並且其中是*矩陣乘法。這是1行的神經網絡評估!用OO設計一個神經網絡,你無法得到它的優雅。

+0

我不明白它是如何工作的。假設您連接了節點A和B.您將A'非常正確地複製到A'(現在用B'連接到)。但是你必須複製B - 它已經是B了,但它是空的,你不能添加連接,因爲你失去了映射B'是B的拷貝。 除了你不能添加繼承者就是因爲它是來自另一層的節點(通常:它是來自任何層的節點)。 – greenoldman 2010-06-02 11:18:52

+0

你沒有失去映射,映射被明確地存儲在散列表h中。你可以爲你的特定圖形結構做類似的事情。而不是在每個節點中有一個copy_of字段,而是有一個copy_of散列表,以便copy_of [node]返回它是其副本的節點。 – Jules 2010-06-02 11:24:15

+0

但是,這不是實施神經網絡的好方法。我一直在那裏,做到了這一點,浮點數組方法在各方面都好得多:) – Jules 2010-06-02 11:25:07