c++ - OpenCV 3.0 无法加载神经网络

标签 c++ opencv neural-network opencv3.0 vision

我需要在我的 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错误:未指定的错误(节点既不是 map 也不是空集合 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());

关于c++ - OpenCV 3.0 无法加载神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34547400/

相关文章:

来自二进制字符串和溢出的 C++ char 定义

c++ - OpenCV 数据类型错误

scala - 为什么我不能显示 Spark MultilayerPerceptronClassifier 的预测列?

machine-learning - 这个神经网络有多少层?

opencv - 如何使用OpenCV检测边缘的终点和起点?

python - ScikitLearn 中关于 epoch 的学习曲线解读

C++、char*、段错误

C++ - 为什么这个成员需要被声明为静态的?

c++ - 测量由我的程序引起的设备驱动程序 CPU/IO 利用率

opencv - 基于条件的IO操作的常量变量初始化