2011-01-18 45 views
22

Tôi đã quyết định chơi với một số khái niệm đơn giản liên quan đến mạng nơron trong Java, và thích ứng với mã phần vô dụng mà tôi tìm thấy trên diễn đàn, tôi có thể tạo ra một mô hình rất đơn giản cho người mới bắt đầu XOR mô phỏng:java thiết lập mạng nơ-ron đơn giản


public class MainApp { 
    public static void main (String [] args) { 
     Neuron xor = new Neuron(0.5f); 
     Neuron left = new Neuron(1.5f); 
     Neuron right = new Neuron(0.5f); 
     left.setWeight(-1.0f); 
     right.setWeight(1.0f); 
     xor.connect(left, right); 

     for (String val : args) { 
      Neuron op = new Neuron(0.0f); 
      op.setWeight(Boolean.parseBoolean(val)); 
      left.connect(op); 
      right.connect(op); 
     } 

     xor.fire(); 

     System.out.println("Result: " + xor.isFired()); 

    } 
} 

public class Neuron { 
    private ArrayList inputs; 
    private float weight; 
    private float threshhold; 
    private boolean fired; 

    public Neuron (float t) { 
     threshhold = t; 
     fired = false; 
     inputs = new ArrayList(); 
    } 

    public void connect (Neuron ... ns) { 
     for (Neuron n : ns) inputs.add(n); 
    } 

    public void setWeight (float newWeight) { 
     weight = newWeight; 
    } 

    public void setWeight (boolean newWeight) { 
     weight = newWeight ? 1.0f : 0.0f; 
    } 

    public float getWeight() { 
     return weight; 
    } 

    public float fire() { 
     if (inputs.size() > 0) { 
      float totalWeight = 0.0f; 
      for (Neuron n : inputs) { 
       n.fire(); 
       totalWeight += (n.isFired()) ? n.getWeight() : 0.0f; 
      } 
      fired = totalWeight > threshhold; 
      return totalWeight; 
     } 
     else if (weight != 0.0f) { 
      fired = weight > threshhold; 
      return weight; 
     } 
     else { 
      return 0.0f; 
     } 
    } 

    public boolean isFired() { 
     return fired; 
    } 
} 

trong lớp học chính của tôi, tôi đã tạo ra mô phỏng đơn giản trong sơ đồ mô hình Jeff Heaton của: XOR diagram

Tuy nhiên, tôi muốn đảm bảo thực hiện của tôi cho lớp Neuron là cor rect..Tôi đã thử nghiệm tất cả các yếu tố đầu vào có thể ([true true], [true false], [false true], [false false]) và tất cả đều đã qua xác minh thủ công của tôi. Ngoài ra, vì chương trình này chấp nhận các đầu vào làm đối số, nó cũng có vẻ như chuyển xác minh thủ công cho các đầu vào như [true false false], [true true false], v.v.

Nhưng về mặt khái niệm, việc triển khai này có chính xác không ? Hay làm thế nào tôi có thể cải thiện nó trước khi tôi bắt đầu phát triển và nghiên cứu sâu hơn về chủ đề này?

Cảm ơn bạn!

+0

Chỉ cần để tiết kiệm bộ nhớ trong các ứng dụng lớn hơn mà có CPU cần thiết, nó có thể là tốt hơn để thêm một tốc độ phân hủy, có giá trị có thể được định nghĩa trong một constructor thứ hai – user2425429

Trả lời

0

Từ công việc (giới hạn) tôi đã thực hiện với lưới thần kinh, việc triển khai và mô hình đó có vẻ đúng với tôi - đầu ra là những gì tôi mong đợi và nguồn trông chắc chắn.

+1

Cảm ơn phản hồi của bạn, từ bất kỳ kinh nghiệm mà bạn có, có bất kỳ vấn đề nào bạn thấy trong khả năng mở rộng của lớp Neuron này không? Theo quan điểm của tôi, tôi đã cố gắng làm cho nó đủ rộng để thích ứng với nhiều lớp tế bào thần kinh bên trong, nhưng hai quan điểm thì tốt hơn một. – jerluc

9

Dường như là điểm khởi đầu tốt. Tôi có một vài gợi ý:

  1. Để tăng khả năng mở rộng, lửa() cần được cấu trúc lại để một nơron đã được kích hoạt với bộ nhập hiện tại không phải tính toán lại mỗi lần. Đây là trường hợp nếu bạn có một lớp ẩn khác, hoặc nhiều hơn một nút đầu ra.

  2. Cân nhắc tách calc ngưỡng của bạn thành phương pháp riêng. Sau đó, bạn có thể phân lớp Neuron và sử dụng các loại chức năng kích hoạt khác nhau (lưỡng cực sigmoid, RBF, tuyến tính, vv).

  3. Để tìm hiểu thêm các hàm phức tạp, hãy thêm đầu vào thiên vị vào từng nơron. Về cơ bản nó giống như một đầu vào khác với giá trị trọng số riêng của nó, nhưng đầu vào luôn được cố định ở 1 (hoặc -1).

  4. Đừng quên cho phép phương pháp đào tạo. Backpropagation sẽ cần một cái gì đó giống như nghịch đảo của lửa(), để có một đầu ra mục tiêu và gợn thay đổi trọng lượng thông qua mỗi lớp.

+2

Cảm ơn các đề xuất của bạn! Tuy nhiên, tôi sẽ cần phải nghiên cứu nhiều hơn về chủ đề này, là tôi cảm thấy xa khi biết hầu hết những gì bạn gợi ý có nghĩa là haha – jerluc

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