Схема гауссовой связи между двумя разными слоями нейронов разного размера - PullRequest
1 голос
/ 24 сентября 2011

У меня есть код для решения следующей проблемы, но он кажется слишком медленным для использования (я думаю, O (n ^ 4)).Помогите начинающему питону превратить правильный код в пригодный для использования код!

Нейрон может быть задан своим слоем и двумерным индексом.Например, N {0} (1,1) - это нейрон в первом слое, 2-й строке, 2-м столбце.Каждый нейрон расположен в двухмерном пространстве, и оба слоя равномерно заполняют одно и то же пространство.Поэтому мы можем назначить координаты (x, y) каждому нейрону на основе его двумерного индекса и количества строк / столбцов в его слое.Например: скажем, первый слой имеет s0 строк и столбцов.Тогда N {0} (1,1) будет расположен в (x, y) = (1.5 / s0,1.5 / s0)

Я должен указать схему соединения между 2 слоями нейронов.Скажем, первый слой s0 на s0, а следующий - s1 на s1.Для каждого слоя я могу дать нейрону уникальный индекс, перейдя сначала по столбцу.Результатом моей функции будет матрица с s0 * s0 строками и s1 * s1 столбцами: каждая запись указывает силу соединения от уровня 0 до уровня 1. Я хочу, чтобы сила этого соединения была значениемГауссовская функция оценивается по разнице между пространственным расположением (x, y) двух нейронов.

Мой первый подход заключался в использовании вложенных циклов, но это ужасно медленно:

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

Возможно, есть какой-то способ рассчитать все значения, которые вам понадобятся заранее?Есть ли какие-нибудь трюки с питоном, чтобы помочь мне ускорить это?Если бы это был Matlab, я бы попытался векторизовать код, но мне нужно написать это на Python.

Любые идеи приветствуются!Спасибо.

...