2

numpyを使用してニューラルフィールドをプログラミングしています。100*100ニューロンのマップの場合、10000*10000接続マップを管理する必要があります。

そこで、meshgridを使用して接続マップを作成し、MexicanHat関数の適応を適用しようとしています。ここに、試すことができるコードがあります。taille = 60またはtaille = 70(ニューラルマップの幅)を入力すると、機能します(私のPCでは問題ありません)が、を使用するとtaille = 100、MemoryErrorが発生します。

import numpy as np

def connection_map4(width, se1, se2, K, inh):
    x = np.arange(0, width**2, 1)
    y = np.arange(0, width**2, 1)
    X,Y = np.meshgrid(x, y)
    print "Meshgrid cree"
    A1 = 1.0 + inh
    A2 = inh
    # exp(|x-xc|/b + |y-yc|) -> Mexican Hat equation
    # 2D/1D transformation relation: i = width.y + x
    # ligne = (X/witdh - Y/width)**2
    ligne = (X-Y)/width ## empirically, it's the division that doesn't pass.
    print "avant carre"
    ligne *= ligne
    print "ligne"
    colonne = (X%width-Y%width)**2

    print "colonne"
    M1 = A1*np.exp(-(  (colonne)/(2*se1**2) + (ligne)/(2*se2**2) ) )
    print "Premiere operation finie"
    M2 = -A2*np.exp(-(  (colonne)/(2*(K*se1)**2) + (ligne)/(2*(K*se2)**2) ) )
    print "Seconde operation finie"
    return(M1+M2)

taille = 100    
connection_map4(taille, 7.5, 4.0, 2.0, 2.0)

経験的に、デバッグを何度か試した後、メッシュグリッドの各操作を分離しましたが、合格しないのは除算とモジュロのようです。

この分割を行うための解決策はありますか?ループを使用して計算を遅くしたくありません。

4

2 に答える 2

6

numpy 配列に対する基本的な算術演算は、コピーを作成します。

>>> a = numpy.arange(10)
>>> b = a + 1
>>> c = b + 1
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> c
array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

私のマシンでは、int の 10000x10000 配列が 800 MB (ほぼギガバイト) を占有します。あなたはそれらのうちの2つを持っていますXY、そして減算操作は別のものを作ります。その後、分割がさらに別の分割を作成します...これがどこに向かっているのかがわかると思います。

私の提案は、操作をその場で行うことです。これを行うには、対応するnumpy組み込み関数を使用してout値を指定します。

>>> d = numpy.subtract(c, 1, out=c)
>>> c
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
>>> d[0] = 5
>>> c
array([ 5,  2,  3,  4,  5,  6,  7,  8,  9, 10])

ご覧のとおり、同じデータを参照してくださいdcもちろん、同じ効果を実現する簡単な方法は、インプレース操作を使用することです。

>>> c -= 1
>>> c
array([4, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> d
array([4, 1, 2, 3, 4, 5, 6, 7, 8, 9])

コピーを作成していないため、このアプローチはメモリの消費量が少ないはずです。できるだけ少ない 800 MB の配列を作成します。既に 2 つの (XY) があるため、コンピューターのメモリ容量の上限に達している可能性があります。

于 2012-06-27T13:24:31.393 に答える
3

なので、インプレース運用でも2GB以上は使っています。実際、32 ビット アプリケーションは Windows で 2GB を超える RAM を使用できないことを覚えています。そのため、64 ビットの Python と 64 ビットの Numpy をダウンロードしました ( http://www.lfd.uci.edu/~gohlke/pythonlibs/にあります)。Numpy は公式には 64 ビットには存在しないことに注意してください。これは、計算ライブラリとしては奇妙です。そして、それは今動作します!これが他の人に役立つことを願っています。

于 2012-06-27T14:50:42.540 に答える