На радость нейросетевикам, быстрая и бесплатная библиотека для MT4 - страница 14

 

Сейчас протестил советника и отловил такой момент

2009.12.24 23:04:29 2009.09.04 14:00 n5_test EURUSD,H1: -1
2009.12.24 23:04:29 2009.09.04 14:00 n5_test EURUSD,H1: -1
2009.12.24 23:04:29 2009.09.04 14:00 n5_test EURUSD,H1: -1
2009.12.24 23:04:28 2009.09.04 13:00 n5_test EURUSD,H1: 1024
2009.12.24 23:04:27 2009.09.04 12:00 n5_test EURUSD,H1: 1023
2009.12.24 23:04:26 2009.09.04 11:00 n5_test EURUSD,H1: 1022


Эти числа - то, что возвращает код:

a = f2M_create_standard (nn_layer,nn_input,nn_hidden1,nn_hidden2,nn_output);
Print(a);

Таким образом, идентификатор сети возрастает до 1024, а потом система отказывается создавать новую сетку

При этом функция f2M_destroy(ann[i]) никаких сеток не разрушает! Вот такое предположение...

 
Kharin писал(а) >>

При этом функция f2M_destroy(ann[i]) никаких сеток не разрушает! Вот такое предположение...

Александр, а Вы пробовали функцию f2M_destroy_all_anns();

Может быть будут различия в отработке?

 

Да, сейчас попробовал, похоже одна проблема локализовалась...

I. - В советнике ставлю static int AnnsNumber = 1027;

- Из папки ANN все удаляю, лог очищаю.

- По логу видно создаются сети с индексами начиная с 7 до 1024.

- Сохраняются сетки в файлы с номерами от .1017.net до .0.net

Повторял эту последовательность несколько раз - ничего не меняется.

Лог первого варианта прилагаю.

.

===========================

II. Вставил в начале init() ф-цию f2M_destroy_all_anns(); и картина изменилась кардинально в лучшую сторону, только в конце косячок

22:44:41 2008.07.31 23:59 FANN-EA_tmp USDJPY,M5: f2M_save(1, E:\ANN\USDJPY-870.1.net) returned: 0
22:44:41 2008.07.31 23:59 FANN-EA_tmp USDJPY,M5: f2M_destroy(1) returned: 0
22:44:41 2008.07.31 23:59 FANN-EA_tmp USDJPY,M5: f2M_save(0, E:\ANN\USDJPY-870.0.net) returned: -1
22:44:41 2008.07.31 23:59 FANN-EA_tmp USDJPY,M5: f2M_destroy(0) returned: -1

нулевая сетка не сохранилась, а 1024.net сохранилась. Но это уже мелочи )))

Файлы:
fanneea_tmp.zip  18 kb
 
Dali писал(а) >>

Кто-то раскомментировал все варианты. В коде из CVS таких ошибок нет.

Вопрос: Кто как разворачивал FANN2MQL?

Инсталлятором? Руками с оф. сайта? Другим способом?

Может все мы жертвы ЗАГОВОРА антисетевиков? )

 
Henry_White писал(а) >>

Ну пожалуй тоже добавлю в копилку странностей FANN...

Эксперимента ради, решил обучить комитет из 46-сетей размерности 30/N/N/1 брутфорсом (т.е. на каждом баре: ~300тыс).

Уточните плиз. У каждой из 46 сетей выходы разные?

Диапазон размерности весов каков?

Если возможно, прикрепите профайлик одной комитетской сетки.

 
Kharin >>:

Сейчас протестил советника и отловил такой момент

2009.12.24 23:04:29 2009.09.04 14:00 n5_test EURUSD,H1: -1
2009.12.24 23:04:29 2009.09.04 14:00 n5_test EURUSD,H1: -1
2009.12.24 23:04:29 2009.09.04 14:00 n5_test EURUSD,H1: -1
2009.12.24 23:04:28 2009.09.04 13:00 n5_test EURUSD,H1: 1024
2009.12.24 23:04:27 2009.09.04 12:00 n5_test EURUSD,H1: 1023
2009.12.24 23:04:26 2009.09.04 11:00 n5_test EURUSD,H1: 1022


Эти числа - то, что возвращает код:

a = f2M_create_standard (nn_layer,nn_input,nn_hidden1,nn_hidden2,nn_output);
Print(a);

Таким образом, идентификатор сети возрастает до 1024, а потом система отказывается создавать новую сетку

При этом функция f2M_destroy(ann[i]) никаких сеток не разрушает! Вот такое предположение...

Так там в самой библиотеке определено :


#ifdef FANN2MQL_EXPORTS
#define FANN2MQL_API __declspec(dllexport)
#else
#define FANN2MQL_API __declspec(dllimport)
#endif

/* maximum number of concurrently handled networks */
#define ANNMAX	1024

....................................................


/* array of FANN network structures */
extern struct fann *_fanns[ANNMAX];
/* array of output values of networks */
extern double* _outputs[ANNMAX];
/* index to last allocated network */
extern int _ann;
 
Kharin >>:


При этом функция f2M_destroy(ann[i]) никаких сеток не разрушает! Вот такое предположение...

Сама функция :


DLLFUNC int __stdcall f2M_destroy(int ann)
{
	int i, last_null=_ann-1;

	/* this network is not allocated */
	if (ann<0 || ann>_ann || _fanns[ann]==NULL) return (-1);

	/* destroy */
	fann_destroy(_fanns[ann]);

	/* clear the pointers */
	_fanns[ann]=NULL;
	_outputs[ann]=NULL;

	/* let reuse the handlers if last */
	if (ann==_ann) {
		_ann--;

		/* look if we can recover any more handlers */
		for (i=_ann; i>-1; i--) {
			if (_fanns[i]==NULL) {
				_ann--;
			} else {
				break;
			}
		}
	}

	return 0;
}

Память освобождается.

FANN_EXTERNAL void FANN_API fann_destroy(struct fann *ann)
{
	if(ann == NULL)
		return;
	fann_safe_free(ann->weights);
	fann_safe_free(ann->connections);
	fann_safe_free(ann->first_layer->first_neuron);
	fann_safe_free(ann->first_layer);
	fann_safe_free(ann->output);
	fann_safe_free(ann->train_errors);
	fann_safe_free(ann->train_slopes);
	fann_safe_free(ann->prev_train_slopes);
	fann_safe_free(ann->prev_steps);
	fann_safe_free(ann->prev_weights_deltas);
	fann_safe_free(ann->errstr);
	fann_safe_free(ann->cascade_activation_functions);
	fann_safe_free(ann->cascade_activation_steepnesses);
	fann_safe_free(ann);
}
#define fann_safe_free(x) {if(x) { free(x); x = NULL; }}

Удачи.

ЗЫ Проблема может возникнуть, если разрушать сети в произвольном порядке или от первой к последней. Нужно от последней к предыдущей - то есть в порядке, обратном тому, как создавались.

 
VladislavVG писал(а) >>

ЗЫ Проблема может возникнуть, если разрушать сети в произвольном порядке или от первой к последней. Нужно от последней к предыдущей - то есть в порядке, обратном тому, как создавались.

Дополню. Или в случае краха терминала. Но решение вроде найдено.

Вопрос другой. Владислав вы вроде без "посредников" читаете С++ код.

Не могли бы прокомментировать проблему с одинаковыми ответами коммитета сетей и правильность инициализации значений весов? (подробно озвучены здесь и ещё логи, а здесь вопрос по весам)

 

lasso и VladislavVG

Спасибо огромное

 
lasso >>:

Уточните плиз. У каждой из 46 сетей выходы разные?

Диапазон размерности весов каков?

Если возможно, прикрепите профайлик одной комитетской сетки.

Да. На каждую сетку входы разные, хотя это и не принципиально. Можно взять стандартный сигнал, например тот же RSI и одну сетку, и все равно на брутфорсе получите отрицательные значения при любых входах.

Начальная инициализация весов -1, 1.

На счет профайла... Вы имеете ввиду результирующий файл обученной сети?

Причина обращения: