OpenCV 3.0 не может загрузить нейронную сеть

Мне нужно использовать нейронную сеть в моем проекте OpenCV (версия 3.0). Я создал и обучил нейронную сеть, и она работает, но если я хочу загрузить нейронную сеть из файла YML, это не предскажет.

Это код, где я создаю, обучаю и сохраняю свою нейронную сеть:

FileStorage fs("nn.yml", FileStorage::WRITE);

int input_neurons = 7;
int hidden_neurons = 100;
int output_neurons = 5;

Ptr<TrainData> train_data = TrainData::loadFromCSV("data.csv", 10, 7, 12);

Ptr<ANN_MLP> neural_network = ANN_MLP::create();
neural_network->setTrainMethod(ANN_MLP::BACKPROP);
neural_network->setBackpropMomentumScale(0.1);
neural_network->setBackpropWeightScale(0.05);
neural_network->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)10000, 1e-6));

Mat layers = Mat(3, 1, CV_32SC1);
layers.row(0) = Scalar(input_neurons);
layers.row(1) = Scalar(hidden_neurons);
layers.row(2) = Scalar(output_neurons);

neural_network->setLayerSizes(layers);
neural_network->setActivationFunction(ANN_MLP::SIGMOID_SYM, 1, 1);

neural_network->train(train_data);

if (neural_network->isTrained()) {
neural_network->write(fs);
cout << "It's OK!" << endl;
}

Но в следующий раз, если я захочу загрузить его из файла YML:

Ptr<ANN_MLP> neural_network = Algorithm::load<ANN_MLP>("nn.yml", "neural_network");

Я получаю вывод:

[-1. # IND, -1. # IND, -1. # IND, -1. # IND, -1. # IND] [-1. # IND, 1.0263158, 1.0263158, 1.0263158, 1.0263158] [1.0263158, 1.0263158, 1.0263158, 1.0263158, 1.0263158] [-1. # IND, -1. # IND, -1. # IND, -1. # IND, -1. # IND]
Ptr<ANN_MLP> neural_network = Algorithm::load<ANN_MLP>("nn.yml");

Эта строка вызывает то, что я получаю ошибку:

Ошибка OpenCV: неопределенная ошибка (узел не является ни картой, ни пустой коллекцией
в) в cvGetFileNodeByName, файл C: \ builds \ master_PackSlave-win64-vc12-shared \ op
encv \ modules \ core \ src \ persistence.cpp, строка 739

Что я делаю неправильно? В чем проблема?

4

Решение

Ты можешь использовать save а также load, или же write а также read, но вы не должны смешивать их.

Так что вам либо нужно сделать:

// Save
neural_network->save("nn.yml");

// Load
Ptr<ANN_MLP> nn = Algorithm::load<ANN_MLP>("nn.yml");

или же:

// Write
neural_network->write(fs);

// Read
FileStorage ffs("nn.yml", FileStorage::READ);
Ptr<ANN_MLP> nn = Algorithm::read<ANN_MLP>(ffs.root());
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]