FANN示例在训练看似成功的情况下给出错误结果

使用FANN时,我无法成功运行从FANN网站上复制粘贴的代码。我使用的是Windows 7上的FANN版本2.2.0和MS Visual Studio 2008。我的XOR示例训练程序的代码如下所示:

#include "floatfann.h"#include "fann_cpp.h"#include <ios>#include <iostream>#include <iomanip>#include <string>using std::cout;using std::cerr;using std::endl;using std::setw;using std::left;using std::right;using std::showpos;using std::noshowpos;// Callback function that simply prints the information to coutint print_callback(FANN::neural_net &net, FANN::training_data &train,    unsigned int max_epochs, unsigned int epochs_between_reports,    float desired_error, unsigned int epochs, void *user_data){    cout << "Epochs     " << setw(8) << epochs << ". "         << "Current Error: " << left << net.get_MSE() << right << endl;    return 0;}// Test function that demonstrates usage of the fann C++ wrappervoid xor_test(){    cout << endl << "XOR test started." << endl;    const float learning_rate = 0.7f;    const unsigned int num_layers = 3;    const unsigned int num_input = 2;    const unsigned int num_hidden = 3;    const unsigned int num_output = 1;    const float desired_error = 0.00001f;    const unsigned int max_iterations = 300000;    const unsigned int iterations_between_reports = 1000;    cout << endl << "Creating network." << endl;    FANN::neural_net net;    net.create_standard(num_layers, num_input, num_hidden, num_output);    net.set_learning_rate(learning_rate);    //net.set_activation_steepness_hidden(0.5);    //net.set_activation_steepness_output(0.5);    net.set_activation_function_hidden(FANN::SIGMOID_SYMMETRIC_STEPWISE);    net.set_activation_function_output(FANN::SIGMOID_SYMMETRIC_STEPWISE);    // Set additional properties such as the training algorithm    //net.set_training_algorithm(FANN::TRAIN_QUICKPROP);    // Output network type and parameters    cout << endl << "Network Type                             :  ";    switch (net.get_network_type())    {    case FANN::LAYER:        cout << "LAYER" << endl;        break;    case FANN::SHORTCUT:        cout << "SHORTCUT" << endl;        break;    default:        cout << "UNKNOWN" << endl;        break;    }    net.print_parameters();    cout << endl << "Training network." << endl;    FANN::training_data data;    if (data.read_train_from_file("xor.data"))    {        // ***** MY INPUT        std::string fn;        fn = "xor_read.data";        data.save_train(fn);        fann_type **train_dat;        fann_type **out_dat;        train_dat = data.get_input();        out_dat = data.get_output();        printf("*****************\n");        printf("Printing read data (%d):\n", data.num_input_train_data());        for(unsigned int i = 0; i < data.num_input_train_data(); i++)        {            printf("XOR test (%f,%f) -> %f\n", train_dat[i][0], train_dat[i][1], out_dat[i][0]);        }        printf("*****************\n");        // END: MY INPUT **************        // Initialize and train the network with the data        net.init_weights(data);        cout << "Max Epochs " << setw(8) << max_iterations << ". "            << "Desired Error: " << left << desired_error << right << endl;        net.set_callback(print_callback, NULL);        net.train_on_data(data, max_iterations,            iterations_between_reports, desired_error);        cout << endl << "Testing network." << endl;        for (unsigned int i = 0; i < data.length_train_data(); ++i)        {            // Run the network on the test data            fann_type *calc_out = net.run(data.get_input()[i]);            cout << "XOR test (" << showpos << data.get_input()[i][0] << ", "                  << data.get_input()[i][2] << ") -> " << *calc_out                 << ", should be " << data.get_output()[i][0] << ", "                 << "difference = " << noshowpos                 << fann_abs(*calc_out - data.get_output()[i][0]) << endl;        }        cout << endl << "Saving network." << endl;        // Save the network in floating point and fixed point        net.save("xor_float.net");        unsigned int decimal_point = net.save_to_fixed("xor_fixed.net");        data.save_train_to_fixed("xor_fixed.data", decimal_point);        cout << endl << "XOR test completed." << endl;    }}/* Startup function. Syncronizes C and C++ output, calls the test function   and reports any exceptions */int main(int argc, char **argv){    try    {        std::ios::sync_with_stdio(); // Syncronize cout and printf output        xor_test();    }    catch (...)    {        cerr << endl << "Abnormal exception." << endl;    }    return 0;}

我注释掉了以下代码:

//net.set_activation_steepness_hidden(0.5);//net.set_activation_steepness_output(0.5);

否则程序会崩溃。xor.data文件内容如下:

4 2 11 1 -1 -1 -1 -1 -1 1 1 1 -1 1 

输出看起来很奇怪:

XOR test started.Creating network.Network Type                                                      :  LAYERInput layer                          :   2 neurons, 1 bias  Hidden layer                       :   3 neurons, 1 biasOutput layer                         :   1 neuronsTotal neurons and biases             :   8Total connections                    :  13Connection rate                      :   1.000Network type                         :   FANN_NETTYPE_LAYERTraining algorithm                   :   FANN_TRAIN_RPROPTraining error function              :   FANN_ERRORFUNC_TANHTraining stop function               :   FANN_STOPFUNC_MSEBit fail limit                       :   0.350Learning rate                        :   0.700Learning momentum                    :   0.000Quickprop decay                      :  -0.000100Quickprop mu                         :   1.750RPROP increase factor                :   1.200RPROP decrease factor                :   0.500RPROP delta min                      :   0.000RPROP delta max                      :  50.000Cascade output change fraction       :   0.010000Cascade candidate change fraction    :   0.010000Cascade output stagnation epochs     :  12Cascade candidate stagnation epochs  :  12Cascade max output epochs            : 150Cascade min output epochs            :  50Cascade max candidate epochs         : 150Cascade min candidate epochs         :  50Cascade weight multiplier            :   0.400Cascade candidate limit              :1000.000Cascade activation functions[0]      :   FANN_SIGMOIDCascade activation functions[1]      :   FANN_SIGMOID_SYMMETRICCascade activation functions[2]      :   FANN_GAUSSIANCascade activation functions[3]      :   FANN_GAUSSIAN_SYMMETRICCascade activation functions[4]      :   FANN_ELLIOTCascade activation functions[5]      :   FANN_ELLIOT_SYMMETRICCascade activation functions[6]      :   FANN_SIN_SYMMETRICCascade activation functions[7]      :   FANN_COS_SYMMETRICCascade activation functions[8]      :   FANN_SINCascade activation functions[9]      :   FANN_COSCascade activation steepnesses[0]    :   0.250Cascade activation steepnesses[1]    :   0.500Cascade activation steepnesses[2]    :   0.750Cascade activation steepnesses[3]    :   1.000Cascade candidate groups             :   2Cascade no. of candidates            :  80Training network.*****************Printing read data (2):XOR test (0.000000,1.875000) -> 0.000000XOR test (0.000000,-1.875000) -> 0.000000*****************Max Epochs   300000. Desired Error: 1e-005Epochs            1. Current Error: 0.260461Epochs           36. Current Error: 7.15071e-006Testing network.XOR test (+0, +1.875) -> +5.295e-035, should be +0, difference = 5.295e-035XOR test (+0, -1.875) -> +0, should be +0, difference = -0XOR test (+0, -1.875) -> +0, should be +0, difference = -0XOR test (+0, +1.875) -> +0, should be +0, difference = -0Saving network.XOR test completed.

Testing network.之后的输出看起来像是:

  1. 训练数据和测试数据都被解释为(0, +/- 1.875),如Printing read data (2)Testing network.之后的行所示。
  2. Printing read data后的(2)是从data.num_input_train_data()获取的,我期望得到(4),因为我有四组训练数据。
  3. “目标”似乎总是“0”(见输出),尽管训练数据从不为零,而是总是+/- 1。

一个不同的问题也有同样的奇怪输出,暗示训练数据被解释为(0,+/-1.875)->0.0。使用这个示例进行训练(如我的XOR示例)似乎也成功了,但即使在用于训练的数据上执行ANN,也返回了看似随机的数字。


回答:

我在FANN – I get incorrect results (near 0) at simply task中找到了答案。上面说在包含”doublefann.h”时,也应该链接doublefann库。这显然也适用于”floatfann.h”和floatfann库。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注