5

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

在我的自动编码器中使用大值是否有解决方法?

4

2 回答 2

4

将输入转换为 [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
于 2014-07-14T10:10:48.887 回答
3

在我给出答案之前,让我们先思考一下自动编码器 (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或者您认为适合输入数据分布的任何函数。


免责声明:我实际上从未遇到过这样的案例,也没有在文献中看到过这种类型的解决方案。但是,我相信这是有道理的,至少值得尝试。

于 2014-07-14T14:26:26.033 回答