私はランダムなフォレストを構築するためのいくつかのアルゴリズムを書いています、各フォレストは別々の関数を持つ別々のデータでトレーニングされます(各ツリーは固定署名の関数のセットを使用しますが、異なるツリーは異なる関数のセットを使用してトレーニングされます別の署名)、ただし、テンプレートを使用して、ランダムツリーを一度構築するためのコードを記述したいと思います。私は現在次のようなものを持っています:
テンプレートクラスTは、トレーニングデータタイプ(つまり、画像パッチ、またはピクセル)に対応します。テンプレートクラスVは、関数ポインタータイプに対応します。
template<class T, class V>
class RandomTree{
void build(RandomTreeNode<T>& current_node,
vector<V>& functions,
vector<T>& data) {
... some code that basically calls a function passing in data T
}
}
そして私はそのようにオブジェクトを作成します:
typedef double (*function_ptr)(TrainingDataPoint& data_point);
RandomTree<TrainingDataPoint, function_ptr> tree = ...
問題は、効率上の理由から、構築しているツリーの1つに対して、関数のセット(function_ptr)がTrainingDataPoint(テンプレートタイプT)だけでなくデータのキャッシュも取り込むようにしたいということです。関数ポインタが次のようになるようにします。
typedef double (*function_ptr)(TrainingDataPoint&,
unordered_map<string, cv::Mat>& preloaded_images);
ここで問題となるのは、RandomTreeクラスをジェネリックに保つ方法は考えられませんが、トレーニングポイント(テンプレートタイプT)以上のものを使用する関数セット(テンプレートタイプV)がいくつかあることです。
これまで私は考えてきました:
- 関数がキャッシュにアクセスできるように、キャッシュをグローバルにします
- 各トレーニングデータポイントへのキャッシュへのポインタを追加します(ただし、クリーンアップの責任者は誰ですか?)
- RandomTreeに3番目のテンプレートパラメーターを追加しますが、この場合、この3番目のパラメーターを必要としないツリーを構築している場合、そこに何を配置しますか?
これらのオプションはどれも私には特に魅力的ではないようです。誰かが経験を積んで、より良い方法を教えてくれることを願っています。
ありがとう