3

共有重み接続を利用する PyBrain でニューラル ネットワークを作成しようとしていますが、そうするのに問題があります。これらのタイプの接続を使用する例はあまり見つかりませんでしたが、見つけたものとソース コードからそれらの使用方法を収集したと思っていました。しかし、明らかに私はそれほど幸運ではありませんでした。

簡単な例として、次の共有重みニューラル ネットワークを作成しようとしています。 単純な SWNN

各パスに沿った重みが同じであるという点で、共有したい長方形で示されている接続を共有します (入力ベクトル [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

そのため、これが設定されている方法について何か誤解しているに違いないと思います。これらのコマンドの理解のどこで私が迷っているかを指摘できる人に感謝します!

4

1 に答える 1

2

私は問題を理解したかもしれません。topHiddenとbottomHiddenの隠しレイヤー定義にoutSlicesを含めるべきだったと思います。

topHidden=ModuleSlice(h1,inSliceFrom=0,inSliceTo=1,outSliceFrom=0,outSliceTo=1)
bottomHidden=ModuleSlice(h1,inSliceFrom=1,inSliceTo=2,outSliceFrom=1,outSliceTo=2)

単純に、隠れ層のすべての出力が出力層に接続されていたので、これは必要ないと思いました。ただし、これを行わないと、隠れ層に正しいoutdim(ension)がないように見え、上記のエラーが発生します。
さらに、MotherConnectionsは次のように定義されている必要があります。

mc=MotherConnection(1,name='mother')
mc2=MotherConnection(1,name='mother2')

このネットワークはまだ広範囲にテストしていませんが、上記の問題は発生していないようです。

于 2013-01-09T21:50:03.943 に答える