如何使用深度神经网络进行回归?

时间:2017-04-20 10:31:41

标签: matlab machine-learning deep-learning regression

我使用Softmax编写了这个脚本(Matlab)进行分类。现在我想通过用Sigmoid或ReLU激活函数替换 Softmax 输出层来使用相同的脚本进行回归。但我无法做到这一点。

X=houseInputs ;
T=houseTargets;
%Train an autoencoder with a hidden layer of size 10 and a linear transfer function for the decoder. Set the L2 weight regularizer to 0.001, sparsity regularizer to 4 and sparsity proportion to 0.05.

hiddenSize = 10;
autoenc1 = trainAutoencoder(X,hiddenSize,...
    'L2WeightRegularization',0.001,...
    'SparsityRegularization',4,...
    'SparsityProportion',0.05,...
    'DecoderTransferFunction','purelin');
%% 
%Extract the features in the hidden layer.

features1 = encode(autoenc1,X);
%Train a second autoencoder using the features from the first autoencoder. Do not scale the data.

hiddenSize = 10;
autoenc2 = trainAutoencoder(features1,hiddenSize,...
    'L2WeightRegularization',0.001,...
    'SparsityRegularization',4,...
    'SparsityProportion',0.05,...
    'DecoderTransferFunction','purelin',...
    'ScaleData',false);

features2 = encode(autoenc2,features1);

%% 
softnet = trainSoftmaxLayer(features2,T,'LossFunction','crossentropy');
%Stack the encoders and the softmax layer to form a deep network.

deepnet = stack(autoenc1,autoenc2,softnet);
%Train the deep network on the wine data.

deepnet = train(deepnet,X,T);
%Estimate the deep network, deepnet.

y = deepnet(X);

2 个答案:

答案 0 :(得分:0)

可以使用神经网络执行回归任务,但对于许多任务来说可能是一种过度杀伤。真实回归意味着执行一组连续输入到另一组连续输出的映射:

f: x -> ý

更改神经网络的体系结构以使其执行回归任务通常非常简单。不必像在您的情况下那样使用Softmax函数将连续输入数据映射到特定类,您必须使网络仅使用单个输出节点。

此节点将仅对前一层(最后一个隐藏层)的输出求和,并将求和的激活乘以 1 。在训练过程中,此输出ý将与数据集附带的正确地面实况值 y 进行比较。作为损失函数,您可以使用Root-means-squared-error (RMSE)

训练这样的网络将导致模型将任意数量的自变量 x 映射到因变量ý,这基本上是一个回归任务。

回到Matlab实现,将当前的Softmax输出层更改为激活函数(如Sigmoid或ReLU)是不正确的。相反,您必须为您的网络实施自定义 RMSE 输出层,该输出层由来自网络最后隐藏层的激活总和提供。

答案 1 :(得分:0)

回归是分类的另一个问题。您必须将损失函数更改为适合回归的函数,例如均方误差,当然会将神经元的数量改为1(你只能在最后一层输出1个值)。