2017-04-12 12 views
0

私は単純なニューラルネットワークを構築しています.2つの主要なクラス:NeuralNetworkとLevelがあります。私はニューロンを持っていません。それは、同じ活性化機能を共有するレベルのすべてのユニットで簡単なフィードワワードなのでです。コピーコンストラクタを削除するタイミング

私は、このように自分のレベルを組織しました:(ないポインタ、値)

クラスニューラルネットワークは、レベルのベクトルを持っている、高速アクセスのためにそれらとクラスレベルのすべてのオブジェクトがPRECへのポインタを持っており、次のレベル、いくつかの行列やもの。

より一般的な質問は次のとおりです。 レベルのようにダブルリンクリストとして編成されたクラスのコンストラクタ/代入演算子をコピー/移動するものは何ですか?

  • 次のポインターとバックポインターの後に構造全体をコピーし、コピーしたばかりのオブジェクトのアイシャンスを返します。

  • コピーマトリックスECCの単なるコピーでシングルトンレベルを返すnullptrする\ precの隣にポインタを残して、単一のレベル..

  • コピーコンストラクタ/代入演算子を削除します。

+2

こんにちは、歓迎、StackOverflowへ。あなたの質問を[編集]してあなたの質問を説明する[mcve]を提供してください。 – YSC

+0

何をしても、一貫性のないオブジェクトが存在しないことを確認してください。 2番目のオプションは、一貫性のないオブジェクトのように聞こえますが、bool "is_valid"などを追加することもできますが、結果が使用できない場合はコピーを許可する理由もあります。私は次のことをやっています:今のところ演算子を削除し、それを実装する必要があります(私はあなたが削除することは、コードを削除することではなく、違法にすることを意味すると仮定します)。そうでなければ、なぜそれを書くのに時間を費やすのだろうか特にそれを削除すると、コンパイラはあなたが意図していないコピーの割り当てを受け付けなくなります。ランタイムとメモリを節約します。 – Aziuth

+0

いずれかの目的に適しています。ゴールデンルールは、オブジェクトが破壊されたときに、既存のオブジェクトを無効にしないようにする必要があるということです。正しく行われたオプションのいずれかが正しいと思われるかもしれません。しかし、すべてのデータを深くコピーしたものは、おそらくどの実験モデルにも適していますが、大きなプロダクション環境ではパフォーマンスオーバーヘッドがあることがわかります。 – Persixty

答えて

1

あなたのクラスはあなた次第です。これにより、人々は一般的に、リンクリストなどの汎用コンテナがコピー可能であることを期待しています。このようなクラスを設計する際に、より一般的には、自分自身に次のことを

尋ねる:

  • 意味、このクラスをコピーしませんか?
  • このクラスをコピーすることは意味がありますか?
  • このクラスをコピーするとユーザーは驚くでしょうか?

このクラスのコピーが何であるかが明確でない場合は、コピー可能にしないでください。このクラスをコピーする意味がない場合は、コピー可能にしないでください。クラスがコピーされるのを見て驚くことがあるなら(unique_ptrを考えてください)、真剣に考えずにコピーすることはできません。これらは厳しいルールではありませんが、これは適切なものを解決するためのヒントです。

何かをコピー可能にするつもりがない場合は、実際には関連付けられた演算子を削除するのが理にかなっています(これは他に何もない場合はドキュメントとして機能します)。

クラスをコピー可能にすると、実装方法はあなた次第です。書き込み時にコピーする共有インスタンスを作成したり、熱心にコピーしたり、必要な作業を行うことができます。それはすべてあなたのユーザー(あなたを含む)が起こると予想されるものと、それぞれのトレードオフが何であるかに依存します。ビット無意味だ

「高速アクセスのためにそれらとクラスレベルのすべてのオブジェクトは、precは、次のレベルへのポインタを持つクラスニューラルネットワークは、レベルのベクトルがある(ないポインタ、値を。)、」

0

。前のレイヤーは*(this-1)で、次のレイヤーは*(this+1)です。これは、ベクトルが要素を連続して格納するためです。もちろん、であるかどうかを知るという小さな課題がありますが、その質問は出てこない傾向があります。入力レイヤーは、その値を直接設定するため、特別なレイヤーです。すべての次のレイヤーは前のレイヤーから入力を安全に引き出すことができるため、入力を次のレイヤーにプッシュする必要はありません。

バックプロパゲーション段階があり、両方向に歩く必要があるため、トレーニングは少し難しくなります。ただし、ここでは入力と出力の両方を制御するので、明示的にlayers.front()layers.back()を使用してください。あなたは全体のベクトルをコピーするとき

は今、それぞれの層は、コピーされ、新しいthisを持っていますが、新しいベクトルが再びneigboursため*(this-1)/*(this+1)ルールを連続しているので、まだ保持しています。

関連する問題