PyBrain:如何打印神经网络(节点和权重)

11
最终,我成功地从文件中训练了一个网络 :) 现在我想打印节点和权重,特别是权重,因为我想用PyBrain训练网络,然后在其他地方实现使用它的神经网络。

我需要一种方法来打印层、节点和节点之间的权重,以便我可以轻松地复制它。到目前为止,我看到我可以使用n['in']访问层,例如,然后例如可以执行:

dir(n['in']) ['class', 'delattr', 'dict', 'doc', 'format', 'getattribute', 'hash', 'init', 'module', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_backwardImplementation', '_forwardImplementation', '_generateName', '_getName', '_growBuffers', '_name', '_nameIds', '_resetBuffers', '_setName', 'activate', 'activateOnDataset', 'argdict', 'backActivate', 'backward', 'bufferlist', 'dim', 'forward', 'getName', 'indim', 'inputbuffer', 'inputerror', 'name', 'offset', 'outdim', 'outputbuffer', 'outputerror', 'paramdim', 'reset', 'sequential', 'setArgs', 'setName', 'shift', 'whichNeuron']

但我不知道如何在这里访问权重。还有一个params属性,例如我的网络是2 4 1带有偏差,它说:

n.params array([-0.8167133 , 1.00077451, -0.7591257 , -1.1150532 , -1.58789386,

很难说哪个是哪个,至少需要知道权重是连接哪些节点的。这就是我所需要的全部信息。

3个回答

21

有许多方法可以访问网络的内部,即通过其“modules”列表或其“connections”字典。参数存储在这些连接或模块中。例如,以下内容应该打印任意网络的所有信息:

for mod in net.modules:
    print("Module:", mod.name)
    if mod.paramdim > 0:
        print("--parameters:", mod.params)
    for conn in net.connections[mod]:
        print("-connection to", conn.outmod.name)
        if conn.paramdim > 0:
             print("- parameters", conn.params)
    if hasattr(net, "recurrentConns"):
        print("Recurrent connections")
        for conn in net.recurrentConns:
            print("-", conn.inmod.name, " to", conn.outmod.name)
            if conn.paramdim > 0:
                print("- parameters", conn.params)

如果你想更细粒度地控制神经网络(在单个神经元而非整个层面上),你需要进一步分解这些参数向量,或者从单神经元层构建你的网络。


我可以认为结果是有序的吗?这样三个连续的数字就是来自同一个神经元的权重吗? - Dr Sokoban
我使用了上面的代码。你能解释一下它是如何工作的吗?我还有一个问题。我的网络中in_to_hiddens的数量是5200。使用上面的代码,它写成了这样:[1.55300577 -0.62533809 -0.08147982 ..., 1.29706926 0.50138988] 但我需要全部而不是一些省略号。我该怎么办?谢谢。 - m.khodakarami
请问您能回答我的问题吗?我快要疯了。似乎我就是无法完成我的论文。 - m.khodakarami

11

试试这个,对我有效:

def pesos_conexiones(n):
    for mod in n.modules:
        for conn in n.connections[mod]:
            print conn
            for cc in range(len(conn.params)):
                print conn.whichBuffers(cc), conn.params[cc]

结果应该像这样:

<FullConnection 'co1': 'hidden1' -> 'out'>
(0, 0) -0.926912942354
(1, 0) -0.964135087592
<FullConnection 'ci1': 'in' -> 'hidden1'>
(0, 0) -1.22895643048
(1, 0) 2.97080368887
(2, 0) -0.0182867906276
(3, 0) 0.4292544603
(4, 0) 0.817440427069
(0, 1) 1.90099230604
(1, 1) 1.83477578625
(2, 1) -0.285569867513
(3, 1) 0.592193396226
(4, 1) 1.13092061631

3
也许这能帮到你(针对Python 3.2的PyBrain)?
C:\tmp\pybrain_examples>\Python32\python.exe
Python 3.2 (r32:88445, Feb 20 2011, 21:29:02) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pybrain.tools.shortcuts import buildNetwork
>>> from pybrain.structure.modules.tanhlayer import TanhLayer
>>> from pybrain.structure.modules.softmax import SoftmaxLayer
>>>
>>> net = buildNetwork(4, 3, 1,bias=True,hiddenclass = TanhLayer, outclass =   SoftmaxLayer)
>>> print(net)
FeedForwardNetwork-8
Modules:
[<BiasUnit 'bias'>, <LinearLayer 'in'>, <TanhLayer 'hidden0'>, <SoftmaxLayer 'out'>]
Connections:
[<FullConnection 'FullConnection-4': 'hidden0' -> 'out'>, <FullConnection   'FullConnection-5': 'bias' -> 'out'>, <FullConnection
'FullConnection-6': 'bias' -> 'hidden0'>, <FullConnection 'FullConnection-7': 'in' -> 'hidden0'>]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接