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