OpenCV を使用して、C++ でニューラル ネットワークをトレーニングしようとしています。
cv::Mat* (名前空間 cv が使用されている場合は Mat*) を CvMat* に変換できません。
詳しく説明しましょう:
cv::Mat* タイプの 2 つのデータ構造があります。1 つ目は特徴ベクトルのセットで、2 つ目は期待される出力のセットです。
cv::Mat *feat = new cv::Mat(3000, 100, CV_32F, featureData);
cv::Mat *op = new cv::Mat(3000, 2, CV_32F, expectedOutput);
(これらは、特徴ベクトルの長さ = 100、出力状態 = 2 の 3000 データ ポイントです)
これらの 2 つのマトリックスには、正しい次元のデータが入力されており、サンプル データがコンソールに出力されたときに正常に機能しているように見えます。
ニューラル ネットワークは次のように初期化されています。
int layers_array[] = {100,200,2}; //hidden layer nodes = 200
CvMat* layer = cvCreateMatHeader(1, 3, CV_32SC1);
cvInitMatHeader(layer, 1,3,CV_32SC1, layers_array);
CvANN_MLP nnetwork;
nnetwork.create(layer, CvANN_MLP::SIGMOID_SYM, SIGMOID_ALPHA, SIGMOID_BETA);
さて、ANN の train メソッドは次のテンプレートです。
virtual int train( const CvMat* inputs, const CvMat* outputs,
const CvMat* sampleWeights, const CvMat* sampleIdx=0,
CvANN_MLP_TrainParams params = CvANN_MLP_TrainParams(),
int flags=0 );
次のコードを使用して、cv::Mat * と CvMat * の間で変換を試みました。
CvMat featMat,opMat;
(&featMat)->cols = feat->cols;
(&featMat)->rows = feat->rows;
(&featMat)->type = CV_32F;
(&featMat)->data.fl = (float *)feat->data;
(&opMat)->cols = op->cols;
(&opMat)->rows = op->rows;
(&opMat)->type = CV_32F;
(&opMat)->data.fl = (float *)op->data;
//setting up the ANN training parameters
int iterations = network.train(&featMat, &opMat, NULL, NULL, trainingParams);
このコードを実行すると、コンソールに次のエラー メッセージが表示されます。
**OpenCV Error: Bad argument (input training data should be a floating-point matrix withthe number of rows equal to the number of training samples and the number
of columns equal to the size of 0-th (input) layer) in CvANN_MLP::prepare_to_train, file ..\..\OpenCV-2.3.0-win-src\OpenCV-2.3.0\modules\ml\src\ann_mlp.cpp,
line 694**
エラーメッセージを理解しました。しかし、私の知る限りでは、入出力層のノード数を混乱させていないと思います。
何が問題なのかを理解するのを手伝ってもらえますか?