2017-04-12 89 views
0

我正在構建一個簡單的神經網絡,我有兩個主要分類:神經網絡和級別。我沒有神經元,因爲它是一個簡單的餵食者,所有單位在一個水平上共享相同的激活函數。何時刪除複製構造函數

我這樣安排我的水平:(不是指針,值)

類NeuralNetwork有水平的載體,以便快速訪問它們,一流水平的每個對象都有一個指向PREC和下一級,一些矩陣和東西。

更一般的問題是: 什麼複製/移動構造器/賦值操作符組織爲雙級鏈接列表像Level應該做什麼?

  • 複製整個結構,跟隨下一個指針和返回指針,並返回剛纔複製的對象的度數。

  • 複製單級離開指針旁邊\ PREC到nullptr與的矩陣ECC只是複製返回一個單級..

  • 刪除拷貝構造函數/賦值運算符。

+2

你好,歡迎來到StackOverflow。請[編輯]你的問題提供[mcve]來說明你的問題。 – YSC

+0

不管你做什麼,確保沒有不一致的對象存在。第二個選項聽起來像一個不一致的對象,雖然你可以去添加一個bool「is_valid」之類的東西,但是如果結果不可用,爲什麼還要複製呢?我會做以下事情:現在刪除運營商,並實施它,如果你碰巧需要它(我假設刪除你的意思是使它非法使用,而不是刪除代碼)。如果不是,爲什麼浪費時間寫它?特別是因爲如果你刪除它,你的編譯器將不會接受你不打算做的複製任務。節省運行時間和內存。 – Aziuth

+0

以適合您的目的爲準。黃金法則是當對象被破壞時,您需要確保它不會使任何現有對象失效。正確地完成您提出的任何選項都可能是正確的。但是,對所有數據進行深層複製的那個可能適合任何實驗模型,但可能證明在任何大型生產環境中都會有性能開銷。 – Persixty

回答

1

你的班級做什麼取決於你。據說,人們通常會期望通用容器(如鏈接列表)是可複製的。

設計這樣的類時,更普遍,問問自己以下:

  • 是什麼複製這個類是什麼意思?
  • 複製此課程有意義嗎?
  • 如果複製此類,用戶會感到驚訝嗎?

如果不清楚複製此類的含義是什麼,請不要將其複製。如果複製這個類沒有意義,請不要將其複製。如果人們會很驚訝地看到課堂被抄襲(認爲是unique_ptr),不要在沒有認真思考的情況下將其複製。這些並不是硬性的規則,這些只是一些思考點,可以幫助你找出合適的方法。

如果你不打算做一些可複製的東西,刪除相關的操作符確實有意義(如果沒有其他的話,它就像文檔一樣)。

如果您確實讓您的課程可以複製,那麼您將如何實施它。您可以創建共享實例,在寫入時進行復制,您可以熱切地複製,可以做任何你想做的事情;這一切都取決於你的用戶(包括你)預期會發生什麼,以及每個用戶的權衡。

0

「類NeuralNetwork有水平的矢量(不是指針,值),以便快速訪問它們,一流水平的每個對象都有一個指向PREC和一個新的水平」

這是一個有點毫無意義。前一層是*(this-1),下一層是*(this+1)。這是因爲矢量連續存儲它的元素。當然,知道是否爲是上一層或下一層的小挑戰,但這個問題不會出現。輸入圖層是一個特殊的圖層,因爲您可以直接設置其值。接下來的所有圖層都可以安全地從前一圖層中提取輸入,因此沒有圖層需要將其輸入推送到下一圖層。

培訓比較困難,因爲您有反向傳播階段,需要雙向走路。但是,在這裏您可以控制輸入和所需的輸出,因此您明確使用layers.front()layers.back(),絕不會超過它們。

現在,當你複製整個向量,每一層都是一個副本,並有一個新的this,但由於新的矢量再次連續的*(this-1)/*(this+1)規則neigbours仍然成立。