2012-03-12 40 views
7

Tôi đang cố gắng triển khai và huấn luyện năm mạng nơron thần kinh với sự truyền lại cho hàm XOR trong Java. Mã của tôi (xin tha nó hideousness):Mạng nơron XOR trong Java

public class XORBackProp { 

private static final int MAX_EPOCHS = 500; 

//weights 
private static double w13, w23, w14, w24, w35, w45; 
private static double theta3, theta4, theta5; 
//neuron outputs 
private static double gamma3, gamma4, gamma5; 
//neuron error gradients 
private static double delta3, delta4, delta5; 
//weight corrections 
private static double dw13, dw14, dw23, dw24, dw35, dw45, dt3, dt4, dt5; 
//learning rate 
private static double alpha = 0.1; 
private static double error; 
private static double sumSqrError; 
private static int epochs = 0; 
private static boolean loop = true; 

private static double sigmoid(double exponent) 
{ 
    return (1.0/(1 + Math.pow(Math.E, (-1) * exponent))); 
} 

private static void activateNeuron(int x1, int x2, int gd5) 
{ 
    gamma3 = sigmoid(x1*w13 + x2*w23 - theta3); 
    gamma4 = sigmoid(x1*w14 + x2*w24 - theta4); 
    gamma5 = sigmoid(gamma3*w35 + gamma4*w45 - theta5); 

    error = gd5 - gamma5; 

    weightTraining(x1, x2); 
} 

private static void weightTraining(int x1, int x2) 
{ 
    delta5 = gamma5 * (1 - gamma5) * error; 
    dw35 = alpha * gamma3 * delta5; 
    dw45 = alpha * gamma4 * delta5; 
    dt5 = alpha * (-1) * delta5; 

    delta3 = gamma3 * (1 - gamma3) * delta5 * w35; 
    delta4 = gamma4 * (1 - gamma4) * delta5 * w45; 

    dw13 = alpha * x1 * delta3; 
    dw23 = alpha * x2 * delta3; 
    dt3 = alpha * (-1) * delta3; 
    dw14 = alpha * x1 * delta4; 
    dw24 = alpha * x2 * delta4; 
    dt4 = alpha * (-1) * delta4; 

    w13 = w13 + dw13; 
    w14 = w14 + dw14; 
    w23 = w23 + dw23; 
    w24 = w24 + dw24; 
    w35 = w35 + dw35; 
    w45 = w45 + dw45; 
    theta3 = theta3 + dt3; 
    theta4 = theta4 + dt4; 
    theta5 = theta5 + dt5; 
} 

public static void main(String[] args) 
{ 

    w13 = 0.5; 
    w14 = 0.9; 
    w23 = 0.4; 
    w24 = 1.0; 
    w35 = -1.2; 
    w45 = 1.1; 
    theta3 = 0.8; 
    theta4 = -0.1; 
    theta5 = 0.3; 

    System.out.println("XOR Neural Network"); 

    while(loop) 
    { 
     activateNeuron(1,1,0); 
     sumSqrError = error * error; 
     activateNeuron(0,1,1); 
     sumSqrError += error * error; 
     activateNeuron(1,0,1); 
     sumSqrError += error * error; 
     activateNeuron(0,0,0); 
     sumSqrError += error * error; 

     epochs++; 

     if(epochs >= MAX_EPOCHS) 
     { 
      System.out.println("Learning will take more than " + MAX_EPOCHS + " epochs, so program has terminated."); 
      System.exit(0); 
     } 

     System.out.println(epochs + " " + sumSqrError); 

     if (sumSqrError < 0.001) 
     { 
      loop = false; 
     } 
    } 
} 
} 

Nếu nó giúp bất kỳ, đây là một diagram of the network.

Giá trị ban đầu cho tất cả các trọng số và tốc độ học được lấy trực tiếp từ ví dụ trong sách giáo khoa của tôi. Mục đích là để đào tạo mạng cho đến khi tổng các lỗi bình phương nhỏ hơn 0,001. Sách giáo khoa cũng cung cấp các giá trị của tất cả các trọng số sau lần lặp đầu tiên (1,1,0) và tôi đã kiểm tra mã của mình và kết quả của nó khớp với kết quả của sách giáo khoa một cách hoàn hảo. Nhưng theo cuốn sách, điều này chỉ nên lấy 224 kỷ nguyên để hội tụ. Nhưng khi tôi chạy nó, nó luôn đạt MAX_EPOCHS trừ khi nó được thiết lập đến vài nghìn. Tôi đang làm gì sai?

+1

Trong biểu đồ của bạn, mũi tên 'w14' được gắn nhãn sai là' w24'. – Gabe

+0

Tôi đã thay đổi tỷ lệ học tập thành 19.801 (thường là quá cao) và đạt đến lỗi mong muốn trong 300 kỷ nguyên. Tôi nghĩ rằng họ đã học một tỷ lệ khác. Nhưng cũng có thể có lỗi trong mã của bạn. – alfa

Trả lời

1

Cố gắng làm tròn của gamma3, gamma4, gamma5 trong khi ở giai đoạn kích hoạt cho instace:

if (gamma3 > 0.7) gamma3 = 1; 
if (gamma3 < 0.3) gamma3 = 0; 

và tăng chút ít learnig biến (alpha)

alpha = 0.2; 

học kết thúc bằng 466 kỷ nguyên.

Tất nhiên nếu u làm tròn lớn hơn và alpha cao hơn u thiết u có thể đạt được kết quả thậm chí tốt hơn so với 224.

2
//Add this in the constants declaration section. 
    private static double alpha = 3.8, g34 = 0.13, g5 = 0.21; 

    // Add this in activate neuron 
    gamma3 = sigmoid(x1 * w13 + x2 * w23 - theta3); 
    gamma4 = sigmoid(x1 * w14 + x2 * w24 - theta4);   
    if (gamma3 > 1 - g34) {gamma3 = 1;} 
    if (gamma3 < g34) {gamma3 = 0;} 
    if (gamma4 > 1- g34) {gamma4 = 1;} 
    if (gamma4 < g34) {gamma4 = 0;} 
    gamma5 = sigmoid(gamma3 * w35 + gamma4 * w45 - theta5); 
    if (gamma5 > 1 - g5) {gamma5 = 1;} 
    if (gamma5 < g5) {gamma5 = 0;} 

ANN nên học trong 66 lần lặp lại, nhưng là trên bờ vực của sự phân kỳ.

1

Toàn bộ điểm của mạng này là để chỉ cách xử lý tình huống khi nhóm không dựa trên "top = yes, bottom = no", mà đúng hơn là có một đường trung tâm (đi qua các điểm (0,1)) và (1,0) trong trường hợp này) và nếu giá trị gần với dòng, thì câu trả lời là "có", trong khi nếu nó ở xa, thì câu trả lời là "không". Bạn không thể cụm hệ thống như vậy chỉ với một lớp. Tuy nhiên hai lớp là đủ.

Các vấn đề liên quan