【发布时间】:2020-09-18 03:02:49
【问题描述】:
我正在寻找可以扩展的 Pytorch 中的 LSTM 单元的实现,我在接受的答案 here 中找到了它的实现。我会把它贴在这里,因为我想参考它。有很多我不明白的实现细节,我想知道是否有人可以澄清一下。
import math
import torch as th
import torch.nn as nn
class LSTM(nn.Module):
def __init__(self, input_size, hidden_size, bias=True):
super(LSTM, self).__init__()
self.input_size = input_size
self.hidden_size = hidden_size
self.bias = bias
self.i2h = nn.Linear(input_size, 4 * hidden_size, bias=bias)
self.h2h = nn.Linear(hidden_size, 4 * hidden_size, bias=bias)
self.reset_parameters()
def reset_parameters(self):
std = 1.0 / math.sqrt(self.hidden_size)
for w in self.parameters():
w.data.uniform_(-std, std)
def forward(self, x, hidden):
h, c = hidden
h = h.view(h.size(1), -1)
c = c.view(c.size(1), -1)
x = x.view(x.size(1), -1)
# Linear mappings
preact = self.i2h(x) + self.h2h(h)
# activations
gates = preact[:, :3 * self.hidden_size].sigmoid()
g_t = preact[:, 3 * self.hidden_size:].tanh()
i_t = gates[:, :self.hidden_size]
f_t = gates[:, self.hidden_size:2 * self.hidden_size]
o_t = gates[:, -self.hidden_size:]
c_t = th.mul(c, f_t) + th.mul(i_t, g_t)
h_t = th.mul(o_t, c_t.tanh())
h_t = h_t.view(1, h_t.size(0), -1)
c_t = c_t.view(1, c_t.size(0), -1)
return h_t, (h_t, c_t)
1- 为什么要将 self.i2h 和 self.h2h 的隐藏大小乘以 4(在 init 方法中)
2- 我不明白参数的重置方法。特别是我们为什么要这样重置参数?
3- 为什么我们在 forward 方法中对 h、c 和 x 使用view?
4- 我也对 forward 方法的 activations 部分中的列边界感到困惑。例如,为什么gates 的上限是 3 * self.hidden_size?
【问题讨论】: