2015-12-31 3 views
3

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

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

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 ошибка: Неизвестная ошибка (узел не является ни карта, ни пустой collecti на) в cvGetFileNodeByName, файл C : \ builds \ master_PackSlave-win64-vc12-shared \ op encv \ modules \ core \ src \ persistence.cpp, строка 739

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

+0

предусмотрено алгоритмом :: нагрузки ожидает данные в том же формате, как neural_network-> написать использует? – Ashalynd

ответ

2

Вы можете использовать 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()); 
+0

Спасибо, это работает :) – Simon

+0

Рад, что это помогло! – Miki