1

私はランダムなフォレストを構築するためのいくつかのアルゴリズムを書いています、各フォレストは別々の関数を持つ別々のデータでトレーニングされます(各ツリーは固定署名の関数のセットを使用しますが、異なるツリーは異なる関数のセットを使用してトレーニングされます別の署名)、ただし、テンプレートを使用して、ランダムツリーを一度構築するためのコードを記述したいと思います。私は現在次のようなものを持っています:

テンプレートクラス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)がいくつかあることです。

これまで私は考えてきました:

  1. 関数がキャッシュにアクセスできるように、キャッシュをグローバルにします
  2. 各トレーニングデータポイントへのキャッシュへのポインタを追加します(ただし、クリーンアップの責任者は誰ですか?)
  3. RandomTreeに3番目のテンプレートパラメーターを追加しますが、この場合、この3番目のパラメーターを必要としないツリーを構築している場合、そこに何を配置しますか?

これらのオプションはどれも私には特に魅力的ではないようです。誰かが経験を積んで、より良い方法を教えてくれることを願っています。

ありがとう

4

2 に答える 2

4

状態が必要な関数にはファンクターを使用します。C++ のファンクターは、オーバーロードされた operator() を持つクラス (または構造体) であるため、ファンクターのインスタンスを関数のように "呼び出す" ことができます。RandomTree のファンクターへの引数は、変化し、RandomTree の制御下にある正確なパラメーターである必要があり、残りは外部にバインドする必要があります。関数をラップする追加の状態を持つサンプル ファンクター:

template<typename Retval, typename Arg1, typename ExtraData>
struct BindExtraData
{
  typedef Retval(*func_type)(Arg1, ExtraData);
  BindExtraData( ExtraData const& d_, func_type func_ ):d(d_), func(func_) {};
  ExtraData d;
  func_type func;
  Retval operator()( Arg1 a1 )
  {
    return func(a1, d);
  }
};

しかし、あなたはもっとうまくやることができます。これが 1 回限りの場合は、テンプレートにする必要はありません。bind2nd(まあ、binder2nd) は上記の標準ライブラリ バージョンであり、より適切に記述されます。

于 2012-10-25T15:20:36.077 に答える
0

キャッシュを取り込む別のパラメーターを RandomTree に追加できますか。提供されない場合、デフォルトは空のキャッシュになります。例えば

template<typename T, typename V, typename CacheDataType = EmptyCache>
class RandomTree{ ... }

RandomTree<TrainingDataPoint, function_ptr, ProloadedImageCache>
于 2012-10-25T15:14:41.567 に答える