ニューラルネットワーカーに嬉しい、MT4用のクイック&フリーライブラリ - ページ 14

 

EAをテストしたところ、次のようなことが判明しました。

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

グリッドIDは1024まで増加し、新しいグリッドの作成は拒否されます。

f2M_destroy(ann[i]) 関数は、グリッドを破壊しません!これが前提ですが...。

 
Kharin писал(а)>>

しかし、関数 f2M_destroy(ann[i]) はグリッドを一つも破壊しない!その前提で・・・。

Alexanderさん、f2M_destroy_all_anns()は試されましたか?

もしかしたら、性能に差が出るかも?

 

ああ、今試してみたところ、1つの問題が局所化したようだ......。

I.- EAにstatic int AnnsNumber = 1027を入れました。

- ANNフォルダからすべて削除し、ログもきれいにしました。

- ログを見ると、7から1024までのインデックスを持つネットが作成されていることがわかります。

- ネットワークは、.1017.netから.0.netまでの番号のファイルに保存されます。

この一連の作業を何度か繰り返しましたが、何も変わりません。

最初のバリアントのログを添付します。

.

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

II.init()の最初にf2M_destroy_all_anns();を挿入したところ、状況が劇的に好転し、最後に1つだけ誤動作が発生しました。

22:44:41 2008.07.31 23:59 FANN-EA_tmp USDJPY,M5: f2M_save(1, E:\ANNUSDJPY-870.1.net) returned: 0.
22:44:41 2008.07.31 23:59 FANN-EA_tmp USDJPY,M5: f2M_destroy(1) 戻り値: 0
22:44:41 2008.07.31 23:59 FANN-EA_tmp USDJPY,M5: f2M_save(0, E:\ANNUSDJPY-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の変遷を追記します...。

実験のため、30/N/N/1次元の46個のネットからなる委員会をブルートフォースで訓練することにした(つまり、各バーについて:〜300k)。

明確にしてください。 46個のネットはそれぞれ異なる出力を持っているのでしょうか?

スケールの幅は?

可能であれば、1つの委員会グリッドのプロフィールを添付してください。

 
Kharin >> :

EAをテストしたところ、次のようなことが判明しました。

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

このため、ネットワークIDが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 писал(а)>>

網をランダムに破壊したり、最初から最後まで破壊すると問題が発生する場合があります。つまり、ネットが作られた順番と逆になっているはずです。

補足させていただきます。あるいは端末のクラッシュ時。しかし、その解決策は見つかったようだ。

質問が違う。Vladislav、あなたは「仲介者」なしでC++のコードを読んでいるのだと思います。

グリッド委員会の回答が同一で、ウェイトの値が正しく初期化されている問題について、コメントをお願いします。(詳しくはこちらと 過去ログ重さについての 質問はこちら)

 

ラッソと VladislavVG

ありがとうございました

 
lasso >> :

明確にしてください。 46のネットワークはそれぞれ出力が違うのでしょうか?

ウエイトのサイズ展開について教えてください。

可能であれば、1つの委員会グリッドのプロフィールを添付してください。

入力はグリッドごとに異なりますが、これは重要ではありません。標準的なシグナル、例えば同じRSIで1グリッドでも、どんな入力でもブルートフォースでマイナス値を得ることができるのです。

重みの初期化 -1, 1。

プロフィールについて...学習したネットワークの結果ファイルのことでしょうか?