我有一个5-5-2的反向传播神经网络,我正在训练,在阅读了LeCun的这个令人敬畏的LeCun后,我开始实践他提出的一些想法。
目前,我正在用我自己设计的10倍交叉验证算法来评估它,基本上是这样的:
for each epoch
for each possible split (training, validation)
train and validate
end
compute mean MSE between all k splits
end我的输入和输出是标准化的(0-均值,方差1),我使用的是tanh激活函数。所有网络算法似乎都能正常工作:我使用相同的实现来逼近sin函数,它做得很好。
现在,问题是顾名思义:是应该分别标准化每个训练/验证集,还是只需要在之后标准化整个数据集?
请注意,如果我做了后者,网络不会产生有意义的预测,但我更喜欢有一个更“理论”的答案,而不是仅仅看输出。
顺便说一句,我用C实现了它,但我对C++也很满意。
发布于 2014-02-11 19:28:24
您很可能会更好地标准化每一套培训集单独。交叉验证的目的是了解您的算法的泛化程度。当您将网络应用于新的输入时,输入将不是用来计算标准化参数的输入。如果一次性标准化整个数据集,则忽略了新输入超出标准化值范围的可能性。
因此,除非您计划在每次处理新输入时重新标准化(我猜这是不可能的),否则您应该只计算正在评估的分区的培训集的标准化参数。此外,应该只在分区的训练集上计算这些参数,而不是验证集(也就是说,10倍分区中的每个分区都将使用90%的数据来计算标准化参数)。
发布于 2014-02-12 01:19:57
假设输入是正态分布的,减去平均值除以标准差,得到N(0,1)分布的输入?
是的,我同意@bogatron,您将每个培训集分别标准化,但我更强烈地说,不使用验证集数据也是“必须”。问题不是训练集中超出范围的值;这很好,仍然为任何值定义到标准法线的转换。您无法计算所有数据的均值/标准差,因为您无论如何都不能使用培训集中的验证数据,即使只是通过这个统计数据。
应该进一步强调的是,您使用的是培训集的平均值和验证集,而不是验证集的平均值。它必须是在训练中使用的相同的特征转换。对验证集进行不同的转换是无效的。
https://stackoverflow.com/questions/21709537
复制相似问题