2013-03-06 7 views
5

私はアーキテクチャ1024, 512, 256, 1(入力層には1024単位、出力層には1単位などがあります)を持つニューラルネットワークを持っています。 scipy.optimizeの最適化アルゴリズムの1つを使用してこのネットワークを訓練したいと思います。多くの重みを持つネットワークのメモリ問題を扱う

問題は、これらのアルゴリズムでは、関数パラメータが1つのベクトルで指定されることが必要であるということです。これは私の場合、私は長さのベクトルですべての重みをアンロールしなければならない、ということ

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

を意味します(fmin_bfgsのような)いくつかのアルゴリズムは、単位行列を使用する必要があるので、彼らは

I = numpy.eye(655616) 
のように電話をかけます非常に驚くことではないが、 MemoryErrorを生成する。

scipy.optimizeのアルゴリズムを私のニーズに合わせるのに足りない、すべての重みを1つのベクトルに展開する必要がないようにする方法はありますか?

+0

うわー、それはフィットするには多くの重さです。 (+1) – NPE

+0

@NPE私は自分が何をしているのか分かりません。私は32x32サイズの画像を訓練しています。画像をさらに小さくする必要がありますか? –

+0

次に、画像のサイズを '16x16 'に縮小し、アーキテクチャ' 256,128,1'を使用して、私はまだ長さ '32896'の重みベクトルを展開しています。 –

答えて

0

私はあなたの問題を解決するメモリマッピングと思います。 numpy配列に最適化されたnumpy.memmapを使用することをお勧めします。メモリマッピングは十分に速いかもしれませんが、thrashingを気にする必要があります。

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

1

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

ネットワークはそれほど深くはありません。標準的なバックプロップを避ける理由はありますか?これは、ライブラリの実装にアクセスできる場合、グラデーションの降下に過ぎません。グラジエントは計算が安価で、最初の方法であるため、同じパフォーマンスオーバーヘッドはありません。

EDIT:

Backpropogationステップtにおけるw_iの更新ルールであることを意味する:

w_i(T)= w_i(T-1) - \アルファ(dError/dw_i)

また、ビジョンの人々がしばしば使用する理由を実行しましたConvolutional NNs:スパース接続は、ピクセルあたり1つのニューロンを持つウェイトベクトルのサイズを大幅に縮小します。

+0

+1メモリの問題がHessianによって引き起こされていることを指摘します。私は標準的なバックプロップを避けていません、私はエラーの勾配を計算するためにバックプロップを使用します。ネットワークの重み。私はまだ最小値を見つけるためにエラーサーフェス(バックプロップで計算されたグラジエントを使用)をトラバースできる最適化アルゴリズムが必要です。 –

+0

Backpropは、少なくとも私が用語を使用するので、勾配降下を使用することを意味します。確率的に(順番に各例)、またはバッチで行うことができます。私。更新はステップサイズに勾配の負数を掛けた値になります。 –

+0

別の便利なおいしいものが私に出てきたので私の答えを編集しました。このために畳み込みネットが使われています。 –

関連する問題