Được rồi, vì vậy tôi đang ở giữa Andrew Ng's machine learning course on coursera và muốn thích nghi với các mạng thần kinh được hoàn thành như là một phần của nhiệm vụ 4.Neural Networks: sigmoid Kích hoạt chức năng cho biến đầu ra liên tục
Đặc biệt, mạng lưới thần kinh mà tôi đã hoàn thành một cách chính xác như là một phần của công việc là như sau:
- chức năng kích hoạt sigmoid:
g(z) = 1/(1+e^(-z))
- 10 đơn vị đầu ra, mỗi mà có thể mất 0 hoặc 1
- 1 hi lớp dden
- phương pháp Back-tuyên truyền sử dụng để giảm thiểu hàm chi phí chức năng
- Chi phí:
nơi L=number of layers
, s_l = number of units in layer l
, m = number of training examples
, K = number of output units
Bây giờ tôi muốn điều chỉnh việc thực hiện để có một đơn vị đầu ra liên tục nhận bất kỳ giá trị nào giữa [0,1] và tôi đang cố gắng tìm ra những gì cần thay đổi, vì vậy f ar Tôi đã
- thay thế dữ liệu với riêng tôi, tức là, như vậy mà đầu ra có thể thay đổi liên tục giữa 0 và 1
- tài liệu tham khảo cập nhật đến số lượng đơn vị sản lượng
- Cập nhật các chức năng chi phí ở phía sau thuật toán -propagation tới: trong đó
a_3
là giá trị của đơn vị đầu ra được xác định từ quá trình truyền thuận.
Tôi chắc chắn rằng điều gì đó khác phải thay đổi khi phương pháp kiểm tra độ dốc cho thấy độ dốc được xác định bằng cách truyền lại và bằng xấp xỉ bằng số không còn khớp nữa. Tôi không thay đổi gradient sigmoid; nó được để ở số f(z)*(1-f(z))
trong đó f(z)
là hàm sigmoid 1/(1+e^(-z)))
cũng như tôi không cập nhật số xấp xỉ của công thức phái sinh; chỉ đơn giản là (J(theta+e) - J(theta-e))/(2e)
.
Có ai có thể tư vấn về các bước khác sẽ được yêu cầu không?
Coded trong Matlab như sau:
% 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)));
Tôi có kể từ khi nhận ra rằng câu hỏi này là tương tự như hỏi bởi @Mikhail Erofeev on StackOverflow, tuy nhiên trong trường hợp này tôi muốn biến liên tục được giữa 0 và 1 và do đó sử dụng một hàm sigmoid.
Bạn đã làm cho nó hoạt động, cho một kết quả liên tục? Tôi đã chạy nó nhưng nó dừng lại xung quanh lần lặp thứ 40 và không tạo ra kết quả tốt. Sẽ là tuyệt vời nếu bạn có thể chia sẻ những gì bạn đã kết thúc với? –