FANN: передать вывод обратно в качестве ввода для запуска () (C ++)

Я использую оболочку C ++ для FANN и обучил предиктору из входных временных рядов. Теперь я хочу посмотреть, какая последовательность получается при подаче сетевого вывода обратно в качестве входа.

Я попробовал это изначально:

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

-1

Решение

Если я рассматриваю элементы массива отдельно, то это работает так, как я и предполагал:

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.
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector