У меня есть вектор TrainingSets (структура ниже), называемый данными

class TrainingSet
{
public:
int time;
float input[2];
float output[3*NUM_TRACKING_POINTS];

TrainingSet(int t, float in[2], float out[3*NUM_TRACKING_POINTS])
{
    time = t;
    for (int i = 0; i < 2; i++)
        input[i] = in[i];
    for (int i = 0; i < 3*NUM_TRACKING_POINTS; i++)
        output[i] = out[i];
}
TrainingSet()
{

}
};

Затем я пытаюсь взять содержимое этого Вектора и поместить его в CvMats для обучения нейронной сети.

int datasize = data.size();
float** in = new float*[datasize];
float** out = new float*[datasize];

for (int i = 0; i < datasize; i++) {
    in[i] = new float[2*TIME_STEPS];
    out[i] = new float[3*NUM_TRACKING_POINTS];
}

for ( int i = 0 ; i < datasize; i ++)
{
    // get the first set in the sequence.
    TrainingSet tset = data.front();
    data.pop();

    // get the inputs
    in[i] = new float[2*TIME_STEPS];
    in[i][0] = tset.input[0];
    in[i][1] = tset.input[1];

    // get the outputs
    out[i] = new float[3*NUM_TRACKING_POINTS];
    for (int j = 0; j < 3*NUM_TRACKING_POINTS; j++)
        out[i][j] = tset.output[j];

    for (int j = 2; j < 2*TIME_STEPS; j++)
    {
        if (i == 0)
            in[i][j] = 0.0f;
        else
            in[i][j] = in[i - 1][j - 2];
    }
}

// make matrices from data.
CvMat *trainInput = cvCreateMat(datasize, 2*TIME_STEPS, CV_32FC1);
cvInitMatHeader(trainInput, datasize, 2*TIME_STEPS, CV_32FC1, in);
CvMat *trainOutput = cvCreateMat(datasize, 3*NUM_TRACKING_POINTS, CV_32FC1);
cvInitMatHeader(trainOutput, datasize, 3*NUM_TRACKING_POINTS, CV_32FC1, out);

for (int x = 0; x < datasize; x++)
{
    cout << "IN: ";
    for (int y = 0; y < 2*TIME_STEPS; y++)
        cout << cvmGet(trainInput, x, y) << " ";
    cout << endl << "IN: ";
    for (int y = 0; y < 2*TIME_STEPS; y++)
        cout << in[x][y] << " ";
    cout << endl << "OUT: ";
    for (int y = 0; y < 3 * NUM_TRACKING_POINTS; y++)
        cout << cvmGet(trainOutput, x, y) << " ";
    cout << endl << "OUT: ";
    for (int y = 0; y < 3 * NUM_TRACKING_POINTS; y++)
        cout << out[x][y] << " ";
    cout << endl << endl;
}

Этот последний цикл for проверяет, является ли содержимое матриц данными, которые я только что передал, но они не совпадают. Матрицы, кажется, имеют совершенно другие данные.

Есть мысли о том, что происходит не так?

0
acp10bda 10 Апр 2011 в 21:36

1 ответ

Мне кажется, что in и out - это не непрерывный массив, а массив указателей.

Я думаю, что cvMat нужен непрерывный массив памяти, чтобы иметь возможность работать с ним.

Также после создания массива вам не нужно создавать из него CvMat, просто используйте

CvSetData( header, data ).
0
talonmies 31 Май 2012 в 01:14
Во-первых, я должен сказать, что я не очень часто использую C++, я не очень хорош. Тем не менее, я не знаю, как сделать непрерывный массив для этих данных. Поскольку длина файла данных в обучающих наборах является переменной, то же самое происходит и с данными в обучающих наборах. Также функции нейронной сети train() нужны матрицы для входных и выходных наборов для обучения. Не могли бы вы привести пример использования CvSetData() для обучения нейронной сети?
 – 
acp10bda
10 Апр 2011 в 22:28
Я обнаружил, что могу создавать экземпляры своих матриц всего лишь: CvMat trainInput = cvMat(datasize,2*TIME_STEPS,CV_32S, in); CvMat trainOutput = cvMat (размер данных, 3 * NUM_TRACKING_POINTS, CV_32FC1, выход); Но это вызывает странную проблему, когда программа вообще не запускается. Он компилируется, но когда я запускаю его, он выдает мне исключение еще до того, как он попадет в мою программу, где-то в ядре.
 – 
acp10bda
12 Апр 2011 в 15:19