gpt4 book ai didi

c++ - 神经网络mlp麻烦

转载 作者:太空宇宙 更新时间:2023-11-04 14:01:32 25 4
gpt4 key购买 nike

我正在使用 Visual Studio 2012 和 Opencv 2.4.6 使用 C++ 进行编程。我有一组训练图像,我已经为其计算了特征向量。这些特征向量应该成为我的神经网络的输入,用类 CvANN_MLP 实现。每个特征向量由 60 个属性组成,其中 59 个是神经网络的“输入”,最后一个是“输出”,只能是 1 或 0。我已经实现了这个神经网络:

CvANN_MLP machineBrain;

double td[NUMERO_ESEMPI_TOTALE][60];

CvMat* trainData = cvCreateMat(NUMERO_ESEMPI_TOTALE, 59, CV_32FC1);

CvMat* trainClasses = cvCreateMat(NUMERO_ESEMPI_TOTALE, 1, CV_32FC1);

CvMat* sampleWts = cvCreateMat(NUMERO_ESEMPI_TOTALE, 1, CV_32FC1);
//The matrix representation of our ANN. We'll have four layers.
CvMat* neuralLayers = cvCreateMat(4, 1, CV_32SC1);
CvMat trainData1, trainClasses1, neuralLayers1, sampleWts1;

cvGetRows(trainData, &trainData1, 0, NUMERO_ESEMPI_TOTALE);
cvGetRows(trainClasses, &trainClasses1, 0, NUMERO_ESEMPI_TOTALE);
cvGetRows(trainClasses, &trainClasses1, 0, NUMERO_ESEMPI_TOTALE);
cvGetRows(sampleWts, &sampleWts1, 0, NUMERO_ESEMPI_TOTALE);
cvGetRows(neuralLayers, &neuralLayers1, 0, 4);



cvSet1D(&neuralLayers1, 0, cvScalar(59));
cvSet1D(&neuralLayers1, 1, cvScalar(3));
cvSet1D(&neuralLayers1, 2, cvScalar(3));
cvSet1D(&neuralLayers1, 3, cvScalar(1));



for(int i=0;i<NUMERO_ESEMPI_TOTALE;i++){
for(int j=0;j<59;j++){
td[i][j] = featureVect[i][j];
}
if(i<45){
td[i][59] = 0; //è una bocca!
}else{
td[i][59] = 1; //non è una bocca!
}
}

//Mettiamo insieme i training data
for (int i=0; i<NUMERO_ESEMPI_TOTALE; i++){
//I 59 input
for(int j=0;j<59;j++){
cvSetReal2D(&trainData1, i, 0, td[i][j]);
}
//Output
cvSet1D(&trainClasses1, i, cvScalar(td[i][59]));
//I pesi (vengono tutti settati a 1)
cvSet1D(&sampleWts1, i, cvScalar(1));
}


machineBrain.create(neuralLayers);
cout<<"Rete creata"<<endl;

//Train it with our data.
machineBrain.train(trainData,trainClasses,sampleWts,0,CvANN_MLP_TrainParams(cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,100000,/*1.0*/0.01/*riprovare 0.01*/),CvANN_MLP_TrainParams::BACKPROP,0.001,0.05));
cout<<"Rete addestrata"<<endl;

Mat pred(num_test_sample, 1, CV_32FC1);
Mat pred1(num_test_sample, 1, CV_32FC1);
for(int i=0;i<NUMERO_ESEMPI_TEST; i++){
float _sample[59];
CvMat sample = cvMat(1, 59, CV_32FC1, _sample);
float _predout[1];
CvMat predout = cvMat(1, 1, CV_32FC1, _predout);
for(int j=0;j<59;j++){
sample.data.fl[j] = featureVectTest[i][j];
}
machineBrain.predict(&sample, &predout);
cout<<endl<<predout.data.fl[i]<<endl;//risultato predizione!
pred.at<float>(i,0)=predout.data.fl[i];
pred1.at<float>(i,0)=predout.data.fl[i];
file<<"Value Image "<<i<<": "<<predout.data.fl[i]<<"\n";
}

返回的值属于这种类型:

 Value Image 0: 0.475639
Value Image 1: 0
Value Image 2: 4.2039e-044
Value Image 3: 1.4013e-045
Value Image 4: -7.88636e-016
Value Image 5: 1.31722e-043
Value Image 6: 4.2039e-044
Value Image 7: 1.4013e-045
Value Image 8: 0.0154511
Value Image 9: 0.00100189
Value Image 10: 0.00161414
Value Image 11: 0.0449422
Value Image 12: 7.5433
Value Image 13: 65.8052
Value Image 14: 24.301
Value Image 15: 19.7311
Value Image 16: 0.985553
Value Image 17: 0.965309
Value Image 18: 0.971295

所以我没有 0 或 1 的结果。是否正确?如果不是,我的代码有什么错误?

最佳答案

我不太了解 C 接口(interface),但我在这里遇到了与 C++ 接口(interface)类似的问题:

OpenCV Neural Network Sigmoid Output

Mlp 的创建函数默认参数不起作用,它们应该给出:

mlp.create(层, CvANN_MLP::SIGMOID_SYM, 1, 1)

但正如我所说,我不知道 c 接口(interface)。由于 C 没有默认参数,因此可能有另一个函数可以提供 sigmoid 的 alpha 和 beta 参数。

顺便说一句,OpenCV 没有众所周知的 sigmoid 实现,它在 0 和 1 的范围内。正如文档中所述,它在 -1 和 1 之间。

关于c++ - 神经网络mlp麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19140860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com