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

时间:2014-07-14 08:59:09

标签: matlab autoencoder

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

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

2 个答案:

答案 0 :(得分:4)

将输入转换为范围[0,1]的过程称为规范化,但是,正如您所注意到的, sigmf 功能不适合此任务。这个link可能对你有用。

假设您的输入由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

答案 1 :(得分:2)

在我给你答案之前,让我们先想一想自动编码器(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或您认为可能适合输入数据传播的任何函数。


免责声明:我从未真正遇到过这种情况,也没有在文献中看到过这种类型的解决方案。但是,我认为这是有道理的,至少值得尝试。