代码之家  ›  专栏  ›  技术社区  ›  MBT Nina Golyandina

PyTorch LSTM州

  •  0
  • MBT Nina Golyandina  · 技术社区  · 8 年前

    考虑剪下以下代码:

    lstm = nn.LSTM(10, 5, batch_first=True)
    states = (torch.rand(1, 1, 5), torch.rand(1, 1, 5))
    h, states = lstm(torch.rand(1, 1, 10), states)
    print('h:')
    print(h)
    print('states[0]:')
    print(states[0])
    

    输出:

    h:
    tensor([[[0.2808, 0.3357, 0.1290, 0.1413, 0.2648]]], grad_fn=<TransposeBackward0>)
    states[0]:
    tensor([[[0.2808, 0.3357, 0.1290, 0.1413, 0.2648]]], grad_fn=<ViewBackward>)
    

    因为我必须交出 states forward() 不管怎样,我更喜欢用 states[0] 结束 h

    我刚刚注意到 grad_fn 是不同的,因此我想知道如果使用 小时 国家 以便进一步计算输出。

    国家[0] 但我也很想知道为什么会不同。

    提前谢谢!

    1 回复  |  直到 8 年前
        1
  •  1
  •   Alex    8 年前

    这是最佳实践,使用起来更直观 h 或(通常称为 output states dynamic_rnn 看看为什么会这样。

    这说明你是对的,事实上没有什么不同。我不知道为什么 grad_fn

    import torch
    from torch import nn
    
    lstm = nn.LSTM(10, 5, batch_first=True)
    state = (torch.rand(1, 1, 5), torch.rand(1, 1, 5))
    inp = torch.rand(1, 1, 10)
    h, states = lstm(inp, state)
    
    param = next(lstm.parameters())
    
    l1 = h.sum()
    l1.backward(retain_graph=True)
    g1 = param.grad.clone()
    
    param.grad.zero_()
    
    l2 = states[0].sum()
    l2.backward(retain_graph=True)
    g2 = param.grad.clone()
    
    print((g1 == g2).all())  # 1