2014-10-17 5 views
1

Я построил сеть LSTM для выполнения регрессии данных последовательности. Когда я пытаюсь получить активацию скрытого слоя (который является слоем LSTM), он возвращает ноль. Сеть имеет только один скрытый слой, один вход и один выходной уровень.Активация для пирамида Уровень LSTM равен нулю

Я пытаюсь получить значение скрытого слоя с помощью следующего фрагмента.

print net.activate(data) 
print net['in'].outputbuffer[net['in'].offset] 
print net['hidden0'].outputbuffer[net['hidden0'].offset] 

Любая идея, почему? Ниже приведен более полный код фрагмента

RopewayIn = RopewayOverallData[:-1, :] 
RopewayOut = RopewayOverallData[1:, :] 
ds.newSequence() 
for i in range(noDataFrames): 
    ds.appendLinked([RopewayIn[i,0],RopewayIn[i,1], RopewayIn[i,2], RopewayIn[i,3], RopewayIn[i,4], RopewayIn[i,5], RopewayIn[i,6], RopewayIn[i,7], RopewayIn[i,8], RopewayIn[i,9]], 
        [RopewayOut[i,0],RopewayOut[i,1], RopewayOut[i,2], RopewayOut[i,3], RopewayOut[i,4], RopewayOut[i,5], RopewayOut[i,6], RopewayOut[i,7], RopewayOut[i,8], RopewayOut[i,9]]) 

net = buildNetwork(10,20,10, hiddenclass=LSTMLayer,outclass=LinearLayer, bias=True, recurrent=True) 
trainer = RPropMinusTrainer(net, dataset=ds, verbose=True, weightdecay=0.01) 

for i in range(10001): 
    trainer.trainEpochs(2) 

print net.activate(RopewayOverallData[0,4]) 
print net['in'].outputbuffer[net['in'].offset] 
print net['hidden0'].outputbuffer[net['hidden0'].offset 
+0

Дополнительная информация поможет. В чем состоит большая часть кода? Работает ли сеть, и только ваша способность распечатывать скрытую активацию слоя - это проблема? – rossdavidh

+0

сеть работает, но когда я распечатываю активацию для скрытого слоя, она дает строку нулей. – dnth

ответ

1

Это не совсем ответ, но он не будет вписываться в комментарий. Я попытался запустить это, смесь коды и предыдущий вопрос (activation values for all nodes in a PyBrain network):

from pybrain.tools.shortcuts import buildNetwork 
from pybrain.datasets import SupervisedDataSet 
from pybrain.supervised.trainers import BackpropTrainer 
from pybrain.structure.modules import LSTMLayer,LinearLayer 

net = buildNetwork(3,3,3, hiddenclass=LSTMLayer,outclass=LinearLayer, bias=True, recurrent=True) 
dataSet = SupervisedDataSet(3, 3) 
dataSet.addSample((0, 0, 0), (0, 0, 0)) 
dataSet.addSample((1, 1, 1), (0, 0, 0)) 
dataSet.addSample((1, 0, 0), (1, 0, 0)) 
dataSet.addSample((0, 1, 0), (0, 1, 0)) 
dataSet.addSample((0, 0, 1), (0, 0, 1)) 

trainer = BackpropTrainer(net, dataSet) 
trained = False 
acceptableError = 0.001 

howmanytries = 0 
# train until acceptable error reached 
while (trained == False) and (howmanytries < 1000): 
    error = trainer.train() 
    if error < acceptableError : 
     trained = True 
    else: 
     howmanytries += 1 

result = net.activate([0.5, 0.4, 0.7]) 
net['in'].outputbuffer[net['in'].offset] 
net['hidden0'].outputbuffer[net['hidden0'].offset] 
print result 

... и распечатан просто отлично, ненулевой результат. Я бы начал с этого и поменять вещи по частям обратно в ваш код и посмотреть, где он перестает работать.

+0

в этом коде вы печатаете переменную результата, которая является активацией вывода. Попробуйте напечатать значение hidden0 по print net ['hidden0']. Outputbuffer [net ['hidden0']. Offset] все, что у меня есть, распечатываются нули .. – dnth

+1

Положить это вверху кода выше: import pprint ... и затем поместите это внизу: pp = pprint.PrettyPrinter (indent = 4) pp.pprint (net ['hidden0'] .__ dict__) ... и посмотрите, что у вас есть. Я не знаком со всем содержимым класса LSTMLayer, но там много ненулевых значений. Возможно, смещение не совсем то, что вы хотите. Например, outputbuffer на самом деле является списком из двух списков, а первый - очень ненулевым. Извините, на самом деле это не ответ, но он показывает, что в вашем скрытом слое много ненулевых данных. Хорошей охоты! – rossdavidh