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