5

アーキテクチャを持つニューラル ネットワークがあります1024, 512, 256, 1(入力層には1024ユニットがあり、出力層には1ユニットがあります)。の最適化アルゴリズムの 1 つを使用して、このネットワークをトレーニングしたいと考えていますscipy.optimize

問題は、これらのアルゴリズムが関数パラメーターが 1 つのベクトルで与えられることを想定していることです。これは、私の場合、長さのベクトルですべての重みを展開する必要があることを意味します

1024*512 + 512*256 + 256*1 = 655616

一部のアルゴリズム ( などfmin_bfgs) は恒等行列を使用する必要があるため、次のような呼び出しを行います。

I = numpy.eye(655616)

驚くことではありませんが、これにより が生成されMemoryErrorます。scipy.optimize自分のニーズにアルゴリズムを適応させる以外に、すべての重みを 1 つのベクトルに展開する必要を回避する方法はありますか?

4

2 に答える 2

1

L-BFGS を使用して重みを NN に当てはめようとしないでください。これは特にうまく機能しません (Yann LeCun の初期の論文を参照)。これは 2 次の方法であるため、ヘッセ行列を近似しようとします。これは、その多くの重みに対して 655,000 x 650,000 の行列です。単純に正当化されないパフォーマンスのオーバーヘッド。

ネットワークはそれほど深くありません。標準のバックプロップを避ける理由はありますか? これは、ライブラリの実装にアクセスできる場合の勾配降下にすぎません。勾配の計算は安価であり、1 次メソッドにすぎないため、パフォーマンスのオーバーヘッドは同じではありません。

編集:

バックプロパゲーションとは、ステップ t での w_i の更新規則が次のとおりであることを意味します。

w_i(t) = w_i(t-1) - \alpha (dError / dw_i)

また、ビジョンの人々が畳み込み NNを頻繁に使用する理由に遭遇しました。疎な接続により、ピクセルごとに 1 つのニューロンがある場合、重みベクトルのサイズが大幅に縮小されます。

于 2013-03-18T13:01:54.043 に答える
0

メモリマッピングで問題が解決すると思います。numpy 配列用に最適化されたnumpy.memmapを使用することをお勧めします。メモリマッピングは非常に高速ですが、スラッシングに注意する必要があることに注意してください。

一般的な文化では、mmapモジュールは、標準ライブラリに含まれるより汎用的なメモリ マッピング ライブラリです。

于 2013-03-18T09:32:13.957 に答える