OpenCV 3.0无法加载神经网络 [英] OpenCV 3.0 Can't load neural network

查看:1051
本文介绍了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 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);

neuro_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<< 没关系! << 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]



< 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& lt; ANN_MLP> neural_network = Algorithm :: load< ANN_MLP>(nn.yml); 

此行导致我收到错误:



在cvGetFileNodeByName,文件C中,OpenCV错误:未指定的错误(节点既不是映射也不是空的collecti
)C:\builds\master_PackSlave-win64-vc12-shared\op
encv\modules\core\src\persistence.cpp,第739行



我做错了什么?

您可以使用保存 load



所以你需要做:

  //保存
neural_network-> save(nn.yml);

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

或:

 code> // Write 
neural_network-> write(fs);

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


I need to use a neural network in my OpenCV (version 3.0) project. I've created and trained neural network and it works, but if I want to load neural network from YML file, it doesn't predict.

This is a code where I creat, train and save my neural network:

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; 
}

But next time, if I want to load it from YML file:

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

I get the output:

[-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");

This line cause that I get an error:

OpenCV Error: Unspecified error (The node is neither a map nor an empty collecti on) in cvGetFileNodeByName, file C:\builds\master_PackSlave-win64-vc12-shared\op encv\modules\core\src\persistence.cpp, line 739

What am I doing wrong? Where is the problem?

解决方案

You can use save and load, or write and read, but you shouldn't mix them.

So you either need to do:

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

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

or:

// Write
neural_network->write(fs);

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

这篇关于OpenCV 3.0无法加载神经网络的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆