我在 MATLAB 中创建了一个自动编码器神经网络。我在第一层有相当大的输入,我必须通过网络的输出层进行重建。我不能按原样使用大输入,所以我使用sigmf
MATLAB 的函数将其转换为 [0, 1] 之间。对于所有大值,它为我提供了 1.000000 的值。我尝试使用设置格式,但没有帮助。
在我的自动编码器中使用大值是否有解决方法?
我在 MATLAB 中创建了一个自动编码器神经网络。我在第一层有相当大的输入,我必须通过网络的输出层进行重建。我不能按原样使用大输入,所以我使用sigmf
MATLAB 的函数将其转换为 [0, 1] 之间。对于所有大值,它为我提供了 1.000000 的值。我尝试使用设置格式,但没有帮助。
在我的自动编码器中使用大值是否有解决方法?
将输入转换为 [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
或者您认为适合输入数据分布的任何函数。
免责声明:我实际上从未遇到过这样的案例,也没有在文献中看到过这种类型的解决方案。但是,我相信这是有道理的,至少值得尝试。