共有重み接続を利用する PyBrain でニューラル ネットワークを作成しようとしていますが、そうするのに問題があります。これらのタイプの接続を使用する例はあまり見つかりませんでしたが、見つけたものとソース コードからそれらの使用方法を収集したと思っていました。しかし、明らかに私はそれほど幸運ではありませんでした。
簡単な例として、次の共有重みニューラル ネットワークを作成しようとしています。
各パスに沿った重みが同じであるという点で、共有したい長方形で示されている接続を共有します (入力ベクトル [x,y] を [y,x] と交換すると、同じ出力が得られるはずです)。
次のコードを使用して、このアーキテクチャを構築しようとしました。
from pybrain.structure.modules.linearlayer import LinearLayer
from pybrain.structure.modules.sigmoidlayer import SigmoidLayer
from pybrain.structure.moduleslice import ModuleSlice
from pybrain.structure.networks.feedforward import FeedForwardNetwork
from pybrain.structure.connections.shared import MotherConnection,SharedFullConnection
net=FeedForwardNetwork()
# make modules
inp=LinearLayer(2,name='input')
h1=SigmoidLayer(2,name='hidden')
outp=LinearLayer(1,name='output')
# now add modules
net.addOutputModule(outp)
net.addInputModule(inp)
net.addModule(h1)
# now we need to create the connections
mc=MotherConnection(2,name='mother')
mc2=MotherConnection(2,name='mother2')
topInput=ModuleSlice(inp,outSliceFrom=0,outSliceTo=1)
bottomInput=ModuleSlice(inp,outSliceFrom=1,outSliceTo=2)
topHidden=ModuleSlice(h1,inSliceFrom=0,inSliceTo=1)
bottomHidden=ModuleSlice(h1,inSliceFrom=1,inSliceTo=2)
net.addConnection(SharedFullConnection(mc,topInput,topHidden))
net.addConnection(SharedFullConnection(mc,bottomInput,bottomHidden))
net.addConnection(SharedFullConnection(mc2,topHidden,outp))
net.addConnection(SharedFullConnection(mc2,bottomHidden,outp))
# finish up
net.sortModules()
#print net.activate([2,1])
上記のコードでは、mc と mc2 という 2 つの MotherConnections を作成しました。この 2 つのオブジェクトは、図に示すように、それぞれ 1 つ目と 2 つ目の四角形で共有の重みを保持するという考えです。次に、ModuleSlice を使用して、入力モジュールと隠しモジュールを 2 つのグループに分けました。次に、これらのパスを接続するために mc および mc2 コンテナーを使用して addConnections を試みました。
上記のコードを実行してもエラーは発生しません。しかし、最後の net.activate ステートメントのコメントを外してネットワークをテストしようとすると、次のエラーが発生します。
Traceback (most recent call last):
File "test.py", line 38, in <module>
print net.activate([2,1])
File "/usr/local/lib/python2.7/dist-packages/PyBrain-0.3.1-py2.7.egg/pybrain/structure/networks/feedforward.py", line 19, in activate
return super(FeedForwardNetworkComponent, self).activate(inpt)
File "/usr/local/lib/python2.7/dist-packages/PyBrain-0.3.1- py2.7.egg/pybrain/structure/modules/module.py", line 123, in activate
self.forward()
File "/usr/local/lib/python2.7/dist-packages/PyBrain-0.3.1-py2.7.egg/pybrain/structure/modules/module.py", line 75, in forward
self.outputbuffer[self.offset])
File "/usr/local/lib/python2.7/dist-packages/PyBrain-0.3.1- py2.7.egg/pybrain/structure/networks/feedforward.py", line 32, in _forwardImplementation
c.forward()
File "/usr/local/lib/python2.7/dist-packages/PyBrain-0.3.1-py2.7.egg/pybrain/structure/connections/connection.py", line 77, in forward
self.outmod.inputbuffer[outmodOffset, self.outSliceFrom:self.outSliceTo])
File "/usr/local/lib/python2.7/dist-packages/PyBrain-0.3.1-py2.7.egg/pybrain/structure/connections/shared.py", line 64, in _forwardImplementation
FullConnection._forwardImplementation(self, inbuf, outbuf)
File "/usr/local/lib/python2.7/dist-packages/PyBrain-0.3.1-py2.7.egg/pybrain/structure/connections/full.py", line 19, in _forwardImplementation
outbuf += dot(reshape(self.params, (self.outdim, self.indim)), inbuf)
File "/usr/lib/python2.7/dist-packages/numpy/core/fromnumeric.py", line 171, in reshape
return reshape(newshape, order=order)
ValueError: total size of new array must be unchanged
そのため、これが設定されている方法について何か誤解しているに違いないと思います。これらのコマンドの理解のどこで私が迷っているかを指摘できる人に感謝します!