#pointers #opencv
#указатели #opencv
Вопрос:
У меня есть вектор обучающих наборов (структура ниже), называемый data
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;
}
Этот последний этап заключается в проверке того, соответствует ли содержимое матриц данным, которые я только что передал, но они не совпадают. Похоже, что матрицы содержат совершенно разные данные.
Есть мысли о том, что происходит не так?
Ответ №1:
Мне кажется, что in
и out
являются не непрерывным массивом, а массивом указателей.
Я думаю, что CvMat нуждается в непрерывном массиве памяти, чтобы иметь возможность работать с ним.
Также, как только вы создадите массив, вам не нужно создавать CvMat из него, просто используйте
CvSetData( header, data ).
Комментарии:
1. Сначала я должен заявить, что я не очень часто использую C , я не очень хорош. Тем не менее, я не знаю, как создать непрерывный массив для этих данных. Поскольку длина файла данных в обучающих наборах является переменной, то же самое относится и к данным в обучающих наборах. Также функции train () нейронной сети требуются матрицы для входных и выходных наборов для обучения, можете ли вы привести мне пример использования CvSetData() для обучения нейронной сети?
2. Я обнаружил, что могу создавать экземпляры своих матриц с помощью всего лишь: CvMat trainInput = CvMat(datasize, 2 * TIME_STEPS, CV_32S, in); CvMat trainOutput = CvMat(datasize, 3 * NUM_TRACKING_POINTS, CV_32FC1, out); Но это вызывает странную проблему, когда программа вообще не запускается. Он компилируется, но когда я его запускаю, он выдает мне исключение, прежде чем оно попадет в мою программу, где-то в ядре.