как элегантно продублировать график (нейронная сеть) - PullRequest
0 голосов
/ 02 июня 2010

У меня есть график (сеть), который состоит из слоев, который содержит узлы (нейроны). Я хотел бы написать процедуру для дублирования всего графа наиболее изящным способом - то есть с минимальными накладными расходами или без них, добавленными в структуру узла или слоя.

Или, другими словами, процедура может быть сложной, но сложность не должна «просачиваться» в конструкции. Они не должны быть сложными только потому, что их можно копировать.

Я написал код на C #, пока он выглядит так:

  • нейрон имеет дополнительное поле - copy_of, которое является указателем на нейрон, с которого скопирована база, это мое дополнительные накладные расходы
  • нейрон имеет метод без параметров Clone ()
  • в нейроне есть метод Reconnect () - который обменивается соединением от «исходного» нейрона (параметр) к «целевому» нейрону (параметр)
  • слой имеет метод Clone () без параметров - он просто вызывает Clone () для всех нейронов
  • сеть имеет метод без параметров Clone () - он вызывает Clone () для каждого слоя, а затем выполняет итерацию по всем нейронам и создает сопоставления neuron => copy_of, а затем вызывает Reconnect для обмена всей "проводкой"

Я надеюсь, что мой подход ясен. Вопрос в том, есть ли более элегантный метод, мне особенно не нравится хранить дополнительный указатель в нейронном классе на случай копирования! Я хотел бы собрать данные в одной точке (сетевой клон) и затем полностью утилизировать их (хотя метод клонирования не может иметь аргумента).

1 Ответ

1 голос
/ 02 июня 2010

Используйте хеш-таблицу для копирования общего графика:

h = new HashTable()
def copyAll(node):
   if h has key node: return h[node]
   copy = node.copy()
   h[node] = copy
   for each successor of node:
     copy.addSuccessor(copy(successor))
   return copy

Ваш конкретный график кажется ациклическим со специальной структурой, поэтому вам не нужна хеш-таблица (вместо этого вы можете использовать массив), и подход, который вы описываете, кажется, лучший способ скопировать его.

Если вы пишете нейронную сеть, вы должны просто использовать векторы и матрицы чисел для представления нейронов. Сейчас это может показаться менее изящным, но, поверьте мне, это гораздо более изящно (и на несколько порядков быстрее).

Рассмотрим нейронную сеть с 2 слоями: вход (n узлов) и выход (m узлов). Теперь предположим, что у нас есть вектор с плавающей точкой in, который представляет значения входного слоя, и мы хотим вычислить вектор с именем out, который представляет значения выходного слоя. Сама нейронная сеть состоит из n by m матрицы M поплавков. M[i][j] представляет, насколько сильна связь между входным узлом i и выходным узлом j. Прелесть в том, что оценка сети такая же, как матричное умножение с последующим применением функции активации к каждому элементу вектора результата:

out = f(M*in)

Где f - функция активации, а * - матричное умножение. Это оценка нейронной сети в 1 строке! Вы не можете получить это так элегантно с ОО-дизайном нейронной сети.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...