我需要在我的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错误:未指定的错误(该节点既不是映射也不是空的collecti
on)在cvGetFileNodeByName中,文件C:\builds\master_PackSlave-win64-vc12-shared\op
encv\modules\core\src\persistence.cpp,第739行

我究竟做错了什么?问题出在哪儿?

最佳答案

您可以使用saveload,或者writeread,但不要混用。

因此,您需要执行以下操作:

// 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());

09-04 18:12