2014-10-17 2 views
1

나는 시퀀스 데이터의 회귀를 수행하는 LSTM 네트워크를 구축했습니다. 숨겨진 레이어 (LSTM 레이어)의 활성화를 시도하면 0을 반환합니다. 네트워크에는 하나의 숨겨진 레이어, 하나의 입력 및 하나의 출력 레이어 만 있습니다.pybrain LSTM 레이어 활성화가 0입니다

다음 스 니펫으로 숨겨진 레이어 값을 가져 오려고합니다.

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

네트워크가 작동하지만 숨겨진 레이어의 활성화를 인쇄하면 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

을 입력하면 출력 활성화 인 결과 변수가 인쇄됩니다. print net [ 'hidden0']에 의해 hidden0 값을 인쇄 해보십시오. outputbuffer [net [ 'hidden0']. offset] 나는 모두 0으로 출력됩니다. – dnth

+1

위 코드의 맨 위에 넣으십시오 :import pprint ... 그리고 이것을 맨 아래에 두십시오 : pp = pprint.PrettyPrinter (들여 쓰기 = 4) pp.pprint (net [ 'hidden0'] .__ dict__) ... 그리고 당신이 가진 것을보십시오. LSTMLayer 클래스의 모든 내용에 익숙하지 않지만 거기에 0이 아닌 값이 많이 있습니다. 오프셋은 실제로 당신이 원하는 것이 아닙니다. 예를 들어, outputbuffer는 실제로 두리스트의 목록이고, 첫 번째 것은 매우 0이 아닙니다. 죄송합니다. 실제로 답변이 아니지만 숨겨진 레이어 안에 0이 아닌 데이터가 많이 있음을 보여줍니다. 즐거운 사냥! – rossdavidh