1

我有解决以下问题的代码,但使用起来似乎太慢了(我认为 O(n^4))。帮助 python 初学者将正确的代码变成可用的代码!

神经元可以通过其层和二维索引来指定。例如,N{0}(1,1) 是第一层第二行第二列的神经元。每个神经元位于二维空间中,并且两层均匀地填充相同的空间。因此,我们可以根据每个神经元的二维索引及其层具有的行/列数为每个神经元分配一个 (x,y) 坐标。例如:假设第一层有 s0 行和列。那么,N{0}(1,1) 将位于 (x,y) = (1.5/s0,1.5/s0)

我必须指定两层神经元之间的连接模式。假设第一层是 s0 乘 s0,下一层是 s1 乘 s1。对于每一层,我可以通过先行列来给神经元一个唯一的索引。然后我的函数的输出将是一个包含 s0*s0 行和 s1*s1 列的矩阵:每个条目指定从第 0 层到第 1 层的连接强度。我希望这个连接的强度是高斯函数在两个神经元的空间位置 (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