PyBrain: Как я могу задать определенные веса в нейронной сети?

Я пытаюсь воссоздать нейронную сеть на основе заданных фактов. У нее есть 3 входа, скрытый слой и выход. Моя проблема в том, что веса также заданы, поэтому мне не нужно тренироваться.

Я подумал, может быть, я мог бы сохранить тренировку аналогичной по структуре нейронной сети и соответствующим образом изменить значения. Как вы думаете, это сработает? Есть другие идеи. Спасибо.

Код нейронной сети:

    net = FeedForwardNetwork()
    inp = LinearLayer(3)
    h1 = SigmoidLayer(1)
    outp = LinearLayer(1)

    # add modules
    net.addOutputModule(outp)
    net.addInputModule(inp)
    net.addModule(h1)

    # create connections
    net.addConnection(FullConnection(inp, h1))
    net.addConnection(FullConnection(h1, outp))

    # finish up
    net.sortModules()


    trainer = BackpropTrainer(net, ds)
    trainer.trainUntilConvergence()

Сохраните обучение и загрузите код из Как сохранить и восстановить обучение PyBrain?

# Using NetworkWriter

from pybrain.tools.shortcuts import buildNetwork
from pybrain.tools.xml.networkwriter import NetworkWriter
from pybrain.tools.xml.networkreader import NetworkReader

net = buildNetwork(2,4,1)

NetworkWriter.writeToFile(net, 'filename.xml')
net = NetworkReader.readFrom('filename.xml') 

person IordanouGiannis    schedule 03.03.2012    source источник
comment
Если вы найдете ответ полезным, отметьте его как принятый;)   -  person sjudǝʊ    schedule 02.08.2016


Ответы (1)


Мне было любопытно, как выполняется чтение уже обученной сети (с помощью инструмента xml). Потому что это означает, что веса сети могут быть каким-то образом установлены. Итак, в документации NetworkReader я обнаружил, что вы можете устанавливать параметры с помощью _setParameters().

Однако это подчеркивание означает частный метод, который потенциально может иметь некоторые побочные эффекты. Также имейте в виду, что вектор с весами должен быть той же длины, что и изначально построенная сеть.

Пример

>>> import numpy
>>> from pybrain.tools.shortcuts import buildNetwork
>>> net = buildNetwork(2,3,1)
>>> net.params

array([...some random values...])

>>> len(net.params)

13

>>> new_params = numpy.array([1.0]*13)
>>> net._setParameters(new_params)
>>> net.params

array([1.0, ..., 1.0])

Другая важная вещь — расставить значения в правильном порядке. Например выше это так:

[  1., 1., 1., 1., 1., 1.,      1., 1., 1.,        1.,       1., 1., 1.    ] 
     input->hidden0            hidden0->out     bias->out   bias->hidden0   

Чтобы определить, какие веса относятся к каким соединениям между слоями, попробуйте это

# net is our neural network from previous example
for c in [connection for connections in net.connections.values() for connection in connections]:
    print("{} -> {} => {}".format(c.inmod.name, c.outmod.name, c.params))

Во всяком случае, я до сих пор не знаю точного порядка весов между слоями...

person sjudǝʊ    schedule 08.01.2013
comment
Порядок весов в векторе параметров определяется однозначно, см. здесь: stackoverflow.com/a/8161274/528041 - person schaul; 04.02.2013