-1

私は FANN の C++ ラッパーを使用しており、時系列入力から予測子をトレーニングしました。ここで、ネットワーク出力を入力としてフィードバックした結果、どのようなシーケンスが生じるかを確認したいと思います。

私は最初にこれを試しました:

fann_type *previousOutput = net.run(previousOutput);

結果は次のとおりです。

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bc51fb in fann_run () from /usr/local/lib/libfann.so.2
(gdb) bt
#0  0x00007ffff7bc51fb in fann_run () from /usr/local/lib/libfann.so.2
#1  0x000000000040161f in FANN::neural_net::run (this=0x7fffffffe420, 
    input=0x7fffffffe5b8) at /usr/local/include/fann_cpp.h:1107
#2  0x000000000040118d in run () at generate_dream.cpp:34
#3  0x000000000040133b in main (argc=1, argv=0x7fffffffe5a8)
    at generate_dream.cpp:55

私も試しました:

fann_type *tmpOutput = net.run(previousOutput);
previousOutput = *tmpOutput; // feedback loop.

同じエラーが発生します。

それで、これを行う適切な方法は何ですか?問題は、run() が実際のデータではなくポインターを返すことです。

また、トレーニング データでは入力が離散的であるため (0 と 1 を -1 と 1 にスケーリング)、フィードバックする前にネットワーク出力を離散化する必要がある場合があります。これには、ネットワーク出力をループして、離散化された値の新しい fann_type 配列を構築する必要がありますが、run() はポインターを必要とするため、これを行う方法がわかりません。

ありがとう。

EDIT1 (完全なコード リスト)

#include "floatfann.h"
#include "fann_cpp.h"

#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <sys/time.h>

using namespace std;

// Test function that demonstrates usage of the fann C++ wrapper
void run()
{
    // Load file previously trained (for example by learn_sequence)
    FANN::neural_net net;
    net.create_from_file("learn_sequential.net");

    // load datafile 
    FANN::training_data data;
    if (data.read_train_from_file("../data/backgroundState_FANN.data")) {
        data.scale_train_data(-1, 1);

        // Seed with last pattern from dataset.
        fann_type *previousOutput = data.get_input()[data.length_train_data()];

        // Length of dream
        for (unsigned int i = 0; i < 10000; i++)
        {
            fann_type *tmpOutput;
            tmpOutput = net.run(previousOutput);
            previousOutput = tmpOutput; // feedback loop.

            // print out each 
            for (unsigned int j = 0; j < data.num_input_train_data(); j++) {
                cout << "RESULT " << i << " " << j << " " << previousOutput[j] <<endl;
            }
        }
    } else
        cout << "Data file could not be loaded" << 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
        run();
    }
    catch (...)
    {
        cerr << endl << "Abnormal exception." << endl;
    }
    return 0;
}
4

1 に答える 1

0

配列要素を個別に扱うと、意図したとおりに機能します。

fann_type *tmpOutput = net.run(previousOutput);

// copy element by element from output to new array.
fann_type newInput[data.num_input_train_data()];
for (unsigned int j = 0; j < data.num_input_train_data(); j++) {
    newInput[j] = tmpOutput[j];
}
previousOutput = newInput; // feedback loop.
于 2013-10-22T22:03:30.190 に答える