2017-11-17 3 views
2

"Livelinet : 교육용 동영상의 활력을 예측하기위한 다중 심층 반복 신경망"의 구조를 구현하려고합니다.torch.nn.LSTM 런타임 오류

간단한 설명을 위해 10 초 오디오 클립을 10 초 오디오 클립으로 분할하고 1 초 오디오 클립에서 스펙트로 그램 (그림)을 얻습니다. 그런 다음 CNN을 사용하여 그림에서 표현 벡터를 가져 와서 각 1 초 비디오 클립의 10 개의 벡터를 얻습니다.

다음으로, 나는 10 개의 벡터를 LSTM에 공급하고 거기에 몇 가지 오류가 있습니다. 다음과 같이 내 코드와 오류 추적은 다음과 같습니다

class AudioCNN(nn.Module): 

def __init__(self): 
    super(AudioCNN,self).__init__() 
    self.features = alexnet.features 
    self.features2 = nn.Sequential(*classifier) 
    self.lstm = nn.LSTM(512, 256,2) 
    self.classifier = nn.Linear(2*256,2) 

def forward(self, x): 
    x = self.features(x) 
    print x.size() 
    x = x.view(x.size(0),256*6*6) 
    x = self.features2(x) 
    x = x.view(10,1,512) 
    h_0,c_0 = self.init_hidden() 
    _, (_, _) = self.lstm(x,(h_0,c_0)) # x dim : 2 x 1 x 256 
    assert False 
    x = x.view(1,1,2*256) 
    x = self.classifier(x) 

    return x 

def init_hidden(self): 
    h_0 = torch.randn(2,1,256) #layer * batch * input_dim 
    c_0 = torch.randn(2,1,256) 
    return h_0, c_0 

audiocnn = AudioCNN() 
input = torch.randn(10,3,223,223) 
input = Variable(input) 
audiocnn(input) 

오류 :

RuntimeErrorTraceback (most recent call last) 
<ipython-input-64-2913316dbb34> in <module>() 
----> 1 audiocnn(input) 

/home//local/lib/python2.7/site-packages/torch/nn/modules/module.pyc in __call__(self, *input, **kwargs) 
    222   for hook in self._forward_pre_hooks.values(): 
    223    hook(self, input) 
--> 224   result = self.forward(*input, **kwargs) 
    225   for hook in self._forward_hooks.values(): 
    226    hook_result = hook(self, input, result) 

<ipython-input-60-31881982cca9> in forward(self, x) 
    15   x = x.view(10,1,512) 
    16   h_0,c_0 = self.init_hidden() 
---> 17   _, (_, _) = self.lstm(x,(h_0,c_0)) # x dim : 2 x 1 x 256 
    18   assert False 
    19   x = x.view(1,1,2*256) 

/home/local/lib/python2.7/site-packages/torch/nn/modules/module.pyc in __call__(self, *input, **kwargs) 
    222   for hook in self._forward_pre_hooks.values(): 
    223    hook(self, input) 
--> 224   result = self.forward(*input, **kwargs) 
    225   for hook in self._forward_hooks.values(): 
    226    hook_result = hook(self, input, result) 

/home//local/lib/python2.7/site-packages/torch/nn/modules/rnn.pyc in forward(self, input, hx) 
    160    flat_weight=flat_weight 
    161  ) 
--> 162   output, hidden = func(input, self.all_weights, hx) 
    163   if is_packed: 
    164    output = PackedSequence(output, batch_sizes) 

/home//local/lib/python2.7/site-packages/torch/nn/_functions/rnn.pyc in forward(input, *fargs, **fkwargs) 
    349   else: 
    350    func = AutogradRNN(*args, **kwargs) 
--> 351   return func(input, *fargs, **fkwargs) 
    352 
    353  return forward 

/home//local/lib/python2.7/site-packages/torch/nn/_functions/rnn.pyc in forward(input, weight, hidden) 
    242    input = input.transpose(0, 1) 
    243 
--> 244   nexth, output = func(input, hidden, weight) 
    245 
    246   if batch_first and batch_sizes is None: 

/home//local/lib/python2.7/site-packages/torch/nn/_functions/rnn.pyc in forward(input, hidden, weight) 
    82     l = i * num_directions + j 
    83 
---> 84     hy, output = inner(input, hidden[l], weight[l]) 
    85     next_hidden.append(hy) 
    86     all_output.append(output) 

/home//local/lib/python2.7/site-packages/torch/nn/_functions/rnn.pyc in forward(input, hidden, weight) 
    111   steps = range(input.size(0) - 1, -1, -1) if reverse else range(input.size(0)) 
    112   for i in steps: 
--> 113    hidden = inner(input[i], hidden, *weight) 
    114    # hack to handle LSTM 
    115    output.append(hidden[0] if isinstance(hidden, tuple) else hidden) 

/home//local/lib/python2.7/site-packages/torch/nn/_functions/rnn.pyc in LSTMCell(input, hidden, w_ih, w_hh, b_ih, b_hh) 
    29 
    30  hx, cx = hidden 
---> 31  gates = F.linear(input, w_ih, b_ih) + F.linear(hx, w_hh, b_hh) 
    32 
    33  ingate, forgetgate, cellgate, outgate = gates.chunk(4, 1) 

/home//local/lib/python2.7/site-packages/torch/nn/functional.pyc in linear(input, weight, bias) 
    551  if input.dim() == 2 and bias is not None: 
    552   # fused op is marginally faster 
--> 553   return torch.addmm(bias, input, weight.t()) 
    554 
    555  output = input.matmul(weight.t()) 

/home//local/lib/python2.7/site-packages/torch/autograd/variable.pyc in addmm(cls, *args) 
    922   @classmethod 
    923   def addmm(cls, *args): 
--> 924    return cls._blas(Addmm, args, False) 
    925 
    926   @classmethod 

/home//local/lib/python2.7/site-packages/torch/autograd/variable.pyc in _blas(cls, args, inplace) 
    918    else: 
    919     tensors = args 
--> 920    return cls.apply(*(tensors + (alpha, beta, inplace))) 
    921 
    922   @classmethod 

RuntimeError: save_for_backward can only save input or output tensors, but argument 0 doesn't satisfy this condition 

답변

4

RuntimeError: save_for_backward can only save input or output tensors, but argument 0 doesn't satisfy this condition

는 일반적으로 당신이 할 수없는 텐서 또는 뭔가를 전달하는 것을 나타내는 오류 메시지 내역을 모듈에 입력으로 저장합니다. 귀하의 경우 문제는 Variable 인스턴스 대신 init_hidden()에있는 텐서를 반환한다는 것입니다. 따라서 LSTM이 실행될 때 초기 입력이 백 드롭 그래프의 일부가 아니므로 숨겨진 레이어의 그라디언트를 계산할 수 없습니다.

해결책 :

def init_hidden(self): 
    h_0 = torch.randn(2,1,256) #layer * batch * input_dim 
    c_0 = torch.randn(2,1,256) 
    return Variable(h_0), Variable(c_0) 

은 0의 평균 및 1의 분산을 LSTM 숨겨진 상태의 초기 값으로 도움이되지 않는다 것도 쉽다. 이상적으로는 : 예컨대,뿐만 아니라 네트워크의 가장 초기 상태에 맞는 것을 배울 수있다이 경우

h_0 = torch.zeros(2,1,256) # layer * batch * input_dim 
c_0 = torch.zeros(2,1,256) 
h_0_param = torch.nn.Parameter(h_0) 
c_0_param = torch.nn.Parameter(c_0) 

def init_hidden(self): 
    return h_0_param, c_0_param 

을 학습 가능한 초기 상태를 만들 것입니다. 이 경우 Variableh_0_paramParameter으로 바꿔 쓸 필요가 없습니다. Variablerequire_grad=True입니다.

+0

이것은 내가 찾고있는 대답입니다! 감사! –