我在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
或任何你认为适合输入数据分布的函数。
免责声明:我从来没有遇到过这样的情况,也没有在文献中看到过这种类型的解决方案。然而,我相信这是有意义的,至少值得一试。