Проблемы реализации регрессионной нейронной сети - PullRequest
0 голосов
/ 05 июля 2018

Я некоторое время пытался реализовать свою первую регрессионную нейронную сеть в MATLAB, следуя примеру из рисунка 5.3 на стр. 231 из книги Распознавание образов и машинное обучение от C. Bishop.

В этом примере двухслойная нейронная сеть использовалась для реализации нескольких преобразований, таких как sin , квадрат , heavyiside и абсолютное значение функции. Следовательно, входной и выходной слои имеют только один нейрон, тогда как скрытый слой имеет три из них. Как упомянуто в заголовке изображения, скрытые слои используют функции активации tanh , тогда как выходные данные являются линейными.

Единственная функция, для которой я иногда "" близко "" "(чтобы найти, что означают апострофы на прилагаемом рисунке), была греховной. Остальные все еще так далеки от того, к чему я стремлюсь. Разве решение не должно работать во всех случаях, как в примере?

Пожалуйста, найдите мою фотографию и мой код (это измененная версия здесь ). Заранее большое спасибо за ваше руководство.

%% 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

...