使用大的输入值与自动编码器



我在MATLAB中创建了一个自动编码器神经网络。我在第一层有相当大的输入,我必须通过网络的输出层来重建。我不能使用大的输入,所以我使用MATLAB的sigmf函数将其转换为[0,1]之间。它给我的值是100万对于所有大的值。我试过设置格式,但是没有帮助。

是否有一个解决方案,使用大值与我的自动编码器?

将输入转换为范围[0,1]的过程称为归一化,但是,正如您注意到的,sigmf函数不适用于此任务。这个链接也许对你有用。

假设你的输入是由一个N行M列的矩阵给出的,其中每行代表一个输入模式,每列是一个特征。如果你的第一列是:

vec =
   -0.1941
   -2.1384
   -0.8396
    1.3546
   -1.0722

然后可以使用以下命令将其转换为[0,1]:

%# get max and min
maxVec = max(vec);
minVec = min(vec);
%# normalize to -1...1
vecNormalized = ((vec-minVec)./(maxVec-minVec))
vecNormalized =
    0.5566
         0
    0.3718
    1.0000
    0.3052

正如@Dan在评论中指出的那样,另一种选择是标准化数据。这个过程的目标是缩放输入,使其均值为0,方差为1。在这种情况下,您需要减去该列的平均值并除以标准差:

meanVec = mean(vec);
stdVec = std(vec);
vecStandarized = (vec-meanVec)./ stdVec
vecStandarized =
    0.2981
   -1.2121
   -0.2032
    1.5011
   -0.3839

在我给你答案之前,让我们思考一下自动编码器(AE)背后的基本原理:
自动编码器的目的是以一种无监督的方式学习输入数据的底层结构。AE是如何实现这一目标的?如果它设法从输出信号(通常是低维的)重建输入信号,这意味着它没有丢失信息,并且它有效地设法学习更紧凑的表示。

在大多数示例中,为简单起见,假设,输入信号和输出信号的范围都在[0..1]。因此,相同的非线性(sigmf)既用于获取输出信号,也用于从输出重建输入。就像

output = sigmf( W*input + b ); % compute output signal
reconstruct = sigmf( W'*output + b_prime ); % notice the different constant b_prime

则AE学习阶段尝试最小化训练误差|| output - reconstruct ||

但是,谁说重建非线性必须与用于计算输出的非线性相同?

在您的示例中,假设输入范围为[0..][1]不成立。因此,您似乎需要使用不同的非线性进行重建。你应该选择一个与你输入的实际范围一致的。

如果,例如,您的输入范围在(0..inf),您可以考虑使用exp().^2作为重建非线性。你可以使用不同程度的多项式,log或任何你认为适合输入数据分布的函数。


免责声明:我从来没有遇到过这样的情况,也没有在文献中看到过这种类型的解决方案。然而,我相信这是有意义的,至少值得一试。

相关内容

  • 没有找到相关文章

最新更新