Подтвердить что ты не робот

Реализация разреженных соединений в нейронной сети (Theano)

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

Кажется, что наиболее эффективным способом программирования разреженных соединений в Theano было бы использовать theano.tensor.nnet.blocksparse.SparseBlockGemv. Альтернативой было бы сделать умножение матрицы, где много весов были установлены на 0 (= нет соединения), но это было бы очень неэффективно по сравнению с SparseBlockGemv, поскольку каждый нейрон был связан только с 2-6 нейронами в предыдущем слое из ~ 100000 нейронов. Более того, весовая матрица 100000x100000 не поместилась бы в мой RAM/GPU. Может ли кто-нибудь представить пример того, как реализовать разреженные соединения с помощью метода SparseBlockGemv или другого метода с эффективными вычислениями?

Прекрасным примером будет расширение MLP Theano Tutorial с дополнительным слоем после скрытого слоя (и до softmax), где каждый нейрон имеет только соединения с подмножество нейронов в предыдущем слое. Тем не менее, другие примеры также очень приветствуются!

Изменить: Обратите внимание, что слой должен быть реализован в Theano, так как он является лишь небольшой частью более крупной архитектуры.

4b9b3361

Ответ 1

Вывод полностью подключенного слоя задается точечным произведением ввода и весами этого слоя. В anano или numpy вы можете использовать метод dot.

y = x.dot(w)

Если у вас есть только соединения с некоторыми нейронами предыдущего слоя, и эти соединения предопределены, вы можете сделать что-то вроде этого:

y = [x[edges[i]].dot(w[i])) for i in neurons]

Где edges[i] содержит индексы для нейронов, подключенных к нейрону i и w[i] весам этого соединения.

Обратите внимание, что theano не знает о слоях или других деталях высокого уровня.