为了搭建这种架构,首先需要对GRU内部进行了解,
来源论文Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling。
GRU的每个递归单元都可以自适应地捕获不同时间尺度的依赖关系,使用门控单元用于调制单元内部的信息流且没有单独的存储单元。
通过论文GRU-ODE-Bayes 及其源码,我门可以得到一个GRUODE 单元的思路和实现如下:
对于GRU相邻间隔时间的差分方程为
从而可以得到如下的ODE:
,代码为:
class GRUODECell(torch.nn.Module):
def __init__(self, input_size, hidden_size, bias=True):
super().__init__()
#self.lin_xh = torch.nn.Linear(input_size, hidden_size, bias=bias)
#self.lin_xz = torch.nn.Linear(input_size, hidden_size, bias=bias)
#self.lin_xr = torch.nn.Linear(input_size, hidden_size, bias=bias)
self.lin_x = torch.nn.Linear(input_size, hidden_size * 3, bias=bias)
self.lin_hh = torch.nn.Linear(hidden_size, hidden_size, bias=False)
self.lin_hz = torch.nn.Linear(hidden_size, hidden_size, bias=False)
self.lin_hr = torch.nn.Linear(hidden_size, hidden_size, bias=False)
def forward(self, x, h):
xr, xz, xh = torch.chunk(self.lin_x(x), 3, dim=1)
r = torch.sigmoid(xr + self.lin_hr(h))
z = torch.sigmoid(xz + self.lin_hz(h))
u = torch.tanh(xh + self.lin_hh(r * h))
dh = (1 - z) * (u - h)
return dh
待进一步更新。。。。