2016-04-05 25 views
20

ニューラルネットワークのユースケースの中には、2つの連続する層の間にすべてのニューロンが接続されているわけではありません。私のニューラルネットワークアーキテクチャでは、各ニューロンは、前の層のいくつかの予め指定されたニューロン(畳み込み層のようなパターンではなく、やや恣意的な場所)にのみ接続する層を持つ必要があります。これは、特定のグラフ上のデータをモデル化するために必要です。私はTheanoにこの "Sparse"レイヤーを実装する必要がありますが、私はTheanoのプログラミング方法に慣れていません。ニューラルネットワーク(Theano)で疎結合を実装する

Theanoでスパース接続をプログラミングする最も効率的な方法は、theano.tensor.nnet.blocksparse.SparseBlockGemvを使用することです。代わりに、多くの重みが0(=接続なし)に設定されているマトリクス乗算を行うことがありますが、各ニューロンが〜100000のうちの前のレイヤの2-6ニューロンにのみ接続されるため、SparseBlockGemvと比べて非常に非効率的ですニューロン。さらに、100000x100000の重み行列は私のRAM/GPUには適合しません。したがって、誰かがSparseBlockGemvメソッドまたは別の計算効率の良いメソッドを使用してスパース接続を実装する方法の例を提供できますか?

完全な例は、隠れ層の後(かつsoftmaxの前)に余分な層を拡張することであり、各ニューロンは前の層のニューロンのサブセットにしか接続していない。しかし、他の例も大歓迎です!

編集:大規模なアーキテクチャのほんの一部であるため、レイヤーはTheanoで実装する必要があります。

+0

私は、SparseBlockGemvは一般的なスパースブロックマトリックス(BSRなど)ではなく、入力/出力の組み合わせが制限された大きなWマトリックスでのドット操作を意味することに気付きました。 – tdihp

答えて

1

完全に接続されたレイヤの出力は、入力とそのレイヤの重みの内積によって与えられます。 theanoまたはnumpyではdotメソッドを使用できます。

y = x.dot(w) 

前の層の一部のニューロンおよびそれらの接続にあなたしかいないの接続が事前定義されている場合は、このような何かを行うことができます:

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

edges[i]は、ニューロンiに接続されたニューロンのインデックスが含まれており、 w[i]この接続の重み。

theanoはレイヤーやその他の詳細情報を知らないことに注意してください。

関連する問題