实现回归神经网络的问题

时间:2018-07-05 10:35:58

标签: matlab machine-learning neural-network regression backpropagation

按照C. Bishop的“ Pattern Recognition and Machine Learning”书第231页图5.3中的示例,我一直在尝试在MATLAB中实现我的第一个回归神经网络。

在此示例中,使用了两层神经网络来实现几种转换,例如 sin square 重糖苷绝对值功能。因此,输入和输出层仅具有一个神经元,而隐藏层却具有三个神经元。如图像标题中所述,隐藏层使用 tanh 激活函数,而输出是线性的。

我有时会获得““” close“”“(发现所附图片中的撇号是什么意思)的唯一功能就是罪过。它们的其余部分距离我的目标还很远。解决方案难道不应该像示例中那样适用于所有情况吗?

请同时找到我的照片和随附的代码(这是here中照片的修改版本)。提前非常感谢您的指导。

%% INITIALIZATION
h = [3];
X = linspace(-1,1,1000);
T = sin(X*pi);

%% NEURAL NETWORK
eta = 1/size(X,2);
h = [size(X,1);h(:);size(T,1)];
L = numel(h);
W = cell(L-1,1);
for l = 1:L-1
    W{l} = randn(h(l),h(l+1)); % Should I maybe initialize this differently?
end
Z = cell(L,1);
Z{1} = X;
maxiter = 10000;
mse = zeros(1,maxiter);
%     forward
for iter = 1:maxiter
    for l = 2:L-1
        Z{l} = tanh(W{l-1}'*Z{l-1});   % 5.10, 5.49
    end
    Z{L} = W{L-1}'*Z{L-1}; % Linear output activation function
%     backward
    E = T-Z{L}; % E = dk       
    mse(iter) =  mean(dot(E,E),1);
    dW = Z{L-1}*E';
    W{L-1} = W{L-1}+eta*dW;
    for l = L-2:-1:1
        df = 1-Z{l+1}.^2;    % Derivative of tanh function
        dj = df.*(W{l+1}*E);
        dW = Z{l}*dj';    % 5.67
        W{l} = W{l}+eta*dW;
        E = dj;
    end
end
mse = mse(1:maxiter);
model.W = W;

%% RESULTS
plot(mse);
disp(['T = [' num2str(T) ']']);
W = model.W;
Y = X;
for l = 1:length(W)-1
    Y = tanh(W{l}'*Y);
end
Y = W{length(W)}'*Y;
disp(['Y = [' num2str(Y) ']']);

figure
plot(X, T, 'o');
hold on
plot(X, Y);
legend('T (target output)','Y (trained output)', 'Location', 'southeast');
hold off

Target output versus trained output Variation of error with the number of iterations

您可能已经注意到,我远不是该领域的专家。如果您除了上述书籍之外还知道任何在线课程/不错的参考资料,可以在其中找到一些编码示例,我将非常高兴。请随时提出您的想法或发表评论。

最好的问候, Aitor

0 个答案:

没有答案