【发布时间】:2020-02-10 03:37:35
【问题描述】:
假设我有一个 PyTorch 张量,排列为 [N, C, L] 形状,其中 N 是批量大小,C 是通道数或特征数,L 是长度。在这种情况下,如果希望执行实例规范化,可以执行以下操作:
N = 20
C = 100
L = 40
m = nn.InstanceNorm1d(C, affine=True)
input = torch.randn(N, C, L)
output = m(input)
这将为每个 N*C = 2000 个数据切片在 L 维维度上执行归一化,减去 2000 个均值,按 2000 个标准差缩放,并按 100 个可学习的权重和偏差参数重新缩放(每个通道一个)。这里不言而喻的假设是所有这些值都存在并且是有意义的。
但我有一种情况,对于切片 N=1,我想排除(例如)L=35 之后的所有数据。对于切片 N=2(比如说),所有数据都是有效的。对于切片 N=3,排除 L=30 之后的所有数据等。这模拟了具有多个特征但长度不同的一维时间序列的数据。
如何在 PyTorch 中对此类数据执行实例规范、获取正确的统计数据并维护可微性/AutoGrad 信息?
更新:在保持 GPU 性能的同时,或者至少不会杀死它。
我不能……
- ...使用零值的掩码,因为这会破坏计算机均值和方差,从而导致错误结果
- ...使用 np.nan 或 np.inf 进行掩码,因为 PyTorch 张量不会忽略这些值,而是将它们视为错误。它们很粘,并导致垃圾结果。 PyTorch 目前缺少 np.nanmean 和 np.nanvar 的等效项。
- ...置换或转置为合适的数据排列;没有这样的方法可以满足我的需要
- ...使用 pack_padded_sequence;实例规范化不适用于该数据结构,据我所知,无法将数据导入该结构。此外,数据重新排列仍然是必要的,见上文 3。
我是否错过了一种可以满足我需要的方法?或者也许我错过了一种允许上述 3 或 4 工作的数据重新排列方法?
这是循环神经网络一直面临的问题,因此 pack_padded_sequence 功能,但在这里不太适用。
【问题讨论】:
-
我是否理解正确,如果您指定例如排除最后 35 个条目,您不想更新
InstanceNorms 最后 35 个权重(和偏差)? -
你如何处理其他模块中的最后 35 个值? (比如
Conv1d或Linear之类的?) -
@flawr 并不是我不想更新它们(尽管从技术上讲它们不应该更新。)这是归一化依赖于均值和方差的计算,我希望该计算忽略掩码值。例如,[1, 2, 3, 4, 5, ___, ___, ___, ___, ___] 应该基于 3 的平均值和 2 的总体方差进行归一化,而不管 ___ 表示的掩码值如何。
-
@flawr 计算后,它们将从损失函数中被屏蔽。如有必要,重新屏蔽为零也是一种选择。
-
Sot huis 意味着对于您通过修改后的
InstanceNorm的每一批次,您还传递了一个索引列表/张量(大小为NxC),这些索引定义了哪些值是相关的,哪个应该是蒙面,对吧?
标签: pytorch normalization