Ok, więc jestem w środku Andrew Ng's machine learning course on coursera i chcieliby dostosować sieć neuronową, która została zakończona w ramach cesji 4.Sieci neuronowe: Funkcja Sigmoid Aktywacja do ciągłej wyjściowej zmiennej
W szczególności sieć neuronowa które zakończyły prawidłowo jako część zadania następująco:
- funkcji aktywacji Sigmoid:
g(z) = 1/(1+e^(-z))
- 10 urządzenia wyjściowe, z których każdy może się 0 lub 1
- 1 hi dden warstwa
- metoda wstecznej propagacji stosowane w celu minimalizacji funkcji kosztu funkcja
- Koszt:
gdzie L=number of layers
, s_l = number of units in layer l
, m = number of training examples
, K = number of output units
Teraz chcę, aby dostosować ćwiczenia tak, że istnieje jedna ciągła jednostka wyjściowa, która przyjmuje dowolną wartość między [0,1] a próbuję ustalić, co należy zmienić, tak aby ar Mam
- Zastępuje dane z własną, czyli takie, które wyjście jest zmienną ciągłą pomiędzy 0 a 1
- Zaktualizowane odniesienia do liczby jednostek wyjściowych
- Poprawiono funkcję kosztów w plecy - algorytm repropagacji do: gdzie
a_3
jest wartością jednostki wynikowej określonej na podstawie propagacji do przodu.
Jestem pewien, że coś innego musi się zmienić, ponieważ metoda sprawdzania gradientu pokazuje gradient określony przez propagację wsteczną i że przez aproksymację numeryczną już nie pasuje. Nie zmieniłem gradientu esicy; pozostaje f(z)*(1-f(z))
, gdzie f(z)
jest funkcją sigmoidową 1/(1+e^(-z)))
, ani też nie zaktualizowałem numerycznego przybliżenia formuły pochodnej; po prostu (J(theta+e) - J(theta-e))/(2e)
.
Czy ktoś może doradzić, jakie inne czynności byłyby wymagane?
kodowane w Matlab następująco:
% FORWARD PROPAGATION
% input layer
a1 = [ones(m,1),X];
% hidden layer
z2 = a1*Theta1';
a2 = sigmoid(z2);
a2 = [ones(m,1),a2];
% output layer
z3 = a2*Theta2';
a3 = sigmoid(z3);
% BACKWARD PROPAGATION
delta3 = a3 - y;
delta2 = delta3*Theta2(:,2:end).*sigmoidGradient(z2);
Theta1_grad = (delta2'*a1)/m;
Theta2_grad = (delta3'*a2)/m;
% COST FUNCTION
J = 1/(2 * m) * sum((a3-y).^2);
% Implement regularization with the cost function and gradients.
Theta1_grad(:,2:end) = Theta1_grad(:,2:end) + Theta1(:,2:end)*lambda/m;
Theta2_grad(:,2:end) = Theta2_grad(:,2:end) + Theta2(:,2:end)*lambda/m;
J = J + lambda/(2*m)*(sum(sum(Theta1(:,2:end).^2)) + sum(sum(Theta2(:,2:end).^2)));
mam ponieważ zrozumiał, że kwestia ta jest podobna do tej poproszony przez @Mikhail Erofeev on StackOverflow, jednak w tym przypadku życzę zmienna ciągła się między 0 a 1, a zatem używać funkcja sigmoidalna.
Czy sprawiłeś, że zadziałał, aby uzyskać ciągły wynik? Zrobiłem to uruchomić, ale zatrzymuje się około 40. iteracji i nie daje dobrego wyniku. Byłoby wspaniale, gdybyś mógł podzielić się tym, co otrzymałeś? –