1

次の問題を解決するコードがありますが、使用するには遅すぎるようです (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 で記述する必要があります。

どんなアイデアでも大歓迎!ありがとう。

4

0 に答える 0