首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么深度自适应输入归一化(DAIN)对跨行的时间序列数据进行归一化?

为什么深度自适应输入归一化(DAIN)对跨行的时间序列数据进行归一化?
EN

Stack Overflow用户
提问于 2020-11-21 04:36:07
回答 1查看 205关注 0票数 0

DAIN paper描述了网络如何自己学习标准化时间序列数据,here是作者如何实现它的。这段代码让我认为规范化是跨行进行的,而不是跨列进行的。有人能解释一下为什么要这样实现吗?因为我一直认为只有跨列归一化时间序列才能保留每个特征的真实信息。

下面是进行规范化的部分:

代码语言:javascript
复制
```python

DAIN_Layer类(nn.Module):

代码语言:javascript
复制
def __init__(self, mode='adaptive_avg', mean_lr=0.00001, gate_lr=0.001, scale_lr=0.00001, input_dim=144):
代码语言:javascript
复制
    super(DAIN_Layer, self).__init__()
代码语言:javascript
复制
    print("Mode = ", mode)
代码语言:javascript
复制
    self.mode = mode
代码语言:javascript
复制
    self.mean_lr = mean_lr
代码语言:javascript
复制
    self.gate_lr = gate_lr
代码语言:javascript
复制
    self.scale_lr = scale_lr
代码语言:javascript
复制
    # Parameters for adaptive average
代码语言:javascript
复制
    self.mean_layer = nn.Linear(input_dim, input_dim, bias=False)
代码语言:javascript
复制
    self.mean_layer.weight.data = torch.FloatTensor(data=np.eye(input_dim, input_dim))
代码语言:javascript
复制
    # Parameters for adaptive std
代码语言:javascript
复制
    self.scaling_layer = nn.Linear(input_dim, input_dim, bias=False)
代码语言:javascript
复制
    self.scaling_layer.weight.data = torch.FloatTensor(data=np.eye(input_dim, input_dim))
代码语言:javascript
复制
    # Parameters for adaptive scaling
代码语言:javascript
复制
    self.gating_layer = nn.Linear(input_dim, input_dim)
代码语言:javascript
复制
    self.eps = 1e-8
代码语言:javascript
复制
def forward(self, x):
代码语言:javascript
复制
    # Expecting  (n_samples, dim,  n_feature_vectors)
代码语言:javascript
复制
    # Nothing to normalize
代码语言:javascript
复制
    if self.mode == None:
代码语言:javascript
复制
        pass
代码语言:javascript
复制
    # Do simple average normalization
代码语言:javascript
复制
    elif self.mode == 'avg':
代码语言:javascript
复制
        avg = torch.mean(x, 2)
代码语言:javascript
复制
        avg = avg.resize(avg.size(0), avg.size(1), 1)
代码语言:javascript
复制
        x = x - avg
代码语言:javascript
复制
    # Perform only the first step (adaptive averaging)
代码语言:javascript
复制
    elif self.mode == 'adaptive_avg':
代码语言:javascript
复制
        avg = torch.mean(x, 2)
代码语言:javascript
复制
        adaptive_avg = self.mean_layer(avg)
代码语言:javascript
复制
        adaptive_avg = adaptive_avg.resize(adaptive_avg.size(0), adaptive_avg.size(1), 1)
代码语言:javascript
复制
        x = x - adaptive_avg
代码语言:javascript
复制
    # Perform the first + second step (adaptive averaging + adaptive scaling )
代码语言:javascript
复制
    elif self.mode == 'adaptive_scale':
代码语言:javascript
复制
        # Step 1:
代码语言:javascript
复制
        avg = torch.mean(x, 2)
代码语言:javascript
复制
        adaptive_avg = self.mean_layer(avg)
代码语言:javascript
复制
        adaptive_avg = adaptive_avg.resize(adaptive_avg.size(0), adaptive_avg.size(1), 1)
代码语言:javascript
复制
        x = x - adaptive_avg
代码语言:javascript
复制
        # Step 2:
代码语言:javascript
复制
        std = torch.mean(x ** 2, 2)
代码语言:javascript
复制
        std = torch.sqrt(std + self.eps)
代码语言:javascript
复制
        adaptive_std = self.scaling_layer(std)
代码语言:javascript
复制
        adaptive_std[adaptive_std <= self.eps] = 1
代码语言:javascript
复制
        adaptive_std = adaptive_std.resize(adaptive_std.size(0), adaptive_std.size(1), 1)
代码语言:javascript
复制
        x = x / (adaptive_std)
代码语言:javascript
复制
    elif self.mode == 'full':
代码语言:javascript
复制
        # Step 1:
代码语言:javascript
复制
        avg = torch.mean(x, 2)
代码语言:javascript
复制
        adaptive_avg = self.mean_layer(avg)
代码语言:javascript
复制
        adaptive_avg = adaptive_avg.resize(adaptive_avg.size(0), adaptive_avg.size(1), 1)
代码语言:javascript
复制
        x = x - adaptive_avg
代码语言:javascript
复制
        # # Step 2:
代码语言:javascript
复制
        std = torch.mean(x ** 2, 2)
代码语言:javascript
复制
        std = torch.sqrt(std + self.eps)
代码语言:javascript
复制
        adaptive_std = self.scaling_layer(std)
代码语言:javascript
复制
        adaptive_std[adaptive_std <= self.eps] = 1
代码语言:javascript
复制
        adaptive_std = adaptive_std.resize(adaptive_std.size(0), adaptive_std.size(1), 1)
代码语言:javascript
复制
        x = x / adaptive_std
代码语言:javascript
复制
        # Step 3: 
代码语言:javascript
复制
        avg = torch.mean(x, 2)
代码语言:javascript
复制
        gate = F.sigmoid(self.gating_layer(avg))
代码语言:javascript
复制
        gate = gate.resize(gate.size(0), gate.size(1), 1)
代码语言:javascript
复制
        x = x * gate
代码语言:javascript
复制
    else:
代码语言:javascript
复制
        assert False
代码语言:javascript
复制
    return x
代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

发布于 2020-12-04 20:27:06

我也不确定,但它们确实在前向函数中转置:x= MLP类的x.transpose(1,2)。因此,在我看来,随着时间的推移,它们对每个功能都是正常的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64936553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档