pybrain: как напечатать сеть (узлы и веса)
Наконец, мне удалось обучить сеть из файла:) Теперь я хочу напечатать узлы и веса, особенно веса, потому что я хочу обучить сеть с помощью pybrain, а затем внедрить NN где-нибудь еще, который будет ее использовать.
Мне нужен способ печати слоев, узлов и веса между узлами, чтобы я мог легко его воспроизвести. Пока я вижу, что могу получить доступ к слоям, например, используя n['in'], а затем, например, я могу сделать:
dir (n['in']) [' class ', ' delattr ', ' dict ', ' doc ', ' format ', ' getattribute ', ' hash ', ' init ', ' module ', ' new ', " уменьшить ", " уменьшить_экс ", " repr ", " setattr ", " sizeof ", " str ", " subclasshook ", "слабый", "_backwardImplementation", "_forwardImplementation", "_generateName", "_getName", "_growBuffers" ', '_name', '_nameIds', '_resetBuffers', '_setName', 'activ ',' activOnDataset', '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 ([-0.8167133, 1.00077451, -0.7591257, -1.1150532, -1.58789386, 0.11625991, 0.98547457, -0.99397871, -1.8324281, -2.42200963, 1.90617387, 1.93741167, -2.884442682, 2.882686869).
Сложно сказать, что к чему, хотя бы с весом связывает какие узлы. Это все, что мне нужно.
3 ответа
Существует много способов доступа к внутренним частям сети, а именно через список "модулей" или словарь "подключений". Параметры хранятся в этих соединениях или модулях. Например, следующее должно напечатать всю эту информацию для произвольной сети:
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)
Если вы хотите что-то более детальное (на уровне нейронов, а не на уровне слоев), вам придется дополнительно декомпозировать эти векторы параметров или, альтернативно, построить свою сеть из однонейронных слоев.
Попробуйте это, это сработало для меня:
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
Может быть, это помогает (PyBrain для Python 3.2)?
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'>]