次の問題を解決するコードがありますが、使用するには遅すぎるようです (O(n^4) だと思います)。Python 初心者が正しいコードを使用可能なコードに変換するのを手伝ってください!
ニューロンは、そのレイヤーと 2 次元インデックスによって指定できます。たとえば、N{0}(1,1) は、1 層目の 2 行 2 列目のニューロンです。各ニューロンは 2 次元空間に配置され、両方の層が同じ空間を均一に満たします。したがって、2 次元のインデックスと、そのレイヤーの行/列の数に基づいて、各ニューロンに (x,y) 座標を割り当てることができます。例: 最初のレイヤーに s0 の行と列があるとします。次に、N{0}(1,1) は (x,y) = (1.5/s0,1.5/s0) に配置されます。
ニューロンの 2 つの層の間の接続パターンを指定する必要があります。最初のレイヤーが s0 by s0 で、次のレイヤーが s1 by s1 だとします。レイヤーごとに、最初に列を作成することで、ニューロンに一意のインデックスを与えることができます。関数の出力は、s0*s0 行と s1*s1 列の行列になります。各エントリは、レイヤー 0 からレイヤー 1 への接続の強度を指定します。この接続の強度を2 つのニューロンの空間位置 (x,y) の差で評価されるガウス関数。
私の最初のアプローチは、ネストされた for ループを使用することでしたが、これは恐ろしく遅いです。
def multiscaleNormalConnection(s0,s1,standardDeviationOfGaussian):
C = zeros((scale1**2),(scale2**2)) #connection matrix
sigma = matrix([[standardDeviationOfGaussian**2, 0],[0, standardDeviationOfGaussian**2]])
coeff = power(2*pi*linalg.det(sigma),-.5)
for i in range(C.shape[0]):
for j in range(C.shape[1]):
inColumn = i/scale1
inX = float(inColumn)/s0
inRow = mod(i,scale1)
inY = float(inRow)/s0
outColumn = j/s1
outX = float(outColumn)/s1
outRow = mod(j,scale1)
outY = float(outRow)/s1
dev = array([outX-inX,outY-inY])
C[i,j] = coeff*exp(-0.5*dot(dot(dev.T,sigma.I),dev))
return C
おそらく、事前に必要なすべての値を計算する方法はありますか? これをスピードアップするのに役立つPythonのトリックはありますか? それが matlab の場合、コードをベクトル化しようとしますが、これを python で記述する必要があります。
どんなアイデアでも大歓迎!ありがとう。