2016-08-21 17 views
11

Tôi đã đi qua toàn bộ tài liệu và không tìm thấy cách thiết lập mạng RBF. Tôi tìm thấy một số ví dụ RBF trong ConsoleExmpales/Ví dụ/Radial, nhưng có vẻ như nó không hoạt động nữa, bởi vì một số phương pháp đã được thay đổi trong Encog.Encog C# Mạng RBF, cách bắt đầu?

Cho đến nay tôi bị mắc kẹt về vấn đề này:

public static double[][] XORInput = { 
     new[] {0.0, 0.0}, 
     new[] {1.0, 0.0}, 
     new[] {0.0, 1.0}, 
     new[] {1.0, 1.0} 
    }; 

    public static double[][] XORIdeal = { 
     new[] {0.0}, 
     new[] {1.0}, 
     new[] {1.0}, 
     new[] {0.0} 
    }; 

     int dimension = 8; 
     int numNeuronsPerDimension = 64; 
     double volumeNeuronWidth = 2.0/numNeuronsPerDimension; 
     bool includeEdgeRBFs = true; 

     RBFNetwork n = new RBFNetwork(dimension, numNeuronsPerDimension, 1, RBFEnum.Gaussian); 
     n.SetRBFCentersAndWidthsEqualSpacing(0, 1, RBFEnum.Gaussian, volumeNeuronWidth, includeEdgeRBFs); 
     //n.RandomizeRBFCentersAndWidths(0, 1, RBFEnum.Gaussian); 

     INeuralDataSet trainingSet = new BasicNeuralDataSet(XORInput, XORIdeal); 
     SVDTraining train = new SVDTraining(n, trainingSet); 

     int epoch = 1; 
     do 
     { 
      train.Iteration(); 
      Console.WriteLine("Epoch #" + epoch + " Error:" + train.Error); 
      epoch++; 
     } while ((epoch < 1) && (train.Error > 0.001)); 

Khi tôi chạy này, tôi nhận được lỗi "Tổng số tế bào thần kinh RBF phải là một số nguyên với sức mạnh của 'chiều'." trên SetRBFCentersAndWidthsEqualSpacing. Nó hoạt động nếu tôi thay đổi phương thức này cho RandomizeRBFCentersAndWidths cho đến khi train.iteration() đạt được, nơi tôi nhận được "Chỉ số nằm ngoài giới hạn của mảng".

Tôi hiểu cách hoạt động của mạng RBF, nhưng tôi bị nhầm lẫn với mọi tham số trong phương thức SetRBFCentersAndWidthsEqualSpacing, ai đó có thể giải thích chi tiết hơn ?.

Trả lời

2

Câu hỏi rất hay.

  1. SetRBFCentersAndWidthsEqualSpacingand here là phương pháp đào tạo mạng nơron tương đối mới và Jeff Heaton đã quyết định triển khai.
  2. Có vẻ như có sự khác biệt giữa Java versionC# version tại dòng 230 - 240 và lỗi IMHO nằm trong phiên bản Java.

  3. Tôi đã sửa đổi mã của bạn để cho nó là hoàn toàn khả thi với ý kiến ​​bổ sung:

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using Encog.MathUtil.RBF; 
    using Encog.Neural.Data.Basic; 
    using Encog.Neural.NeuralData; 
    using Encog.Neural.Rbf.Training; 
    using Encog.Neural.RBF; 
    
    namespace TestRBF 
    { 
        class Program 
        { 
         public static double[][] XORInput = { 
         new[] {0.0, 0.0}, 
         new[] {1.0, 0.0}, 
         new[] {0.0, 1.0}, 
         new[] {1.0, 1.0} 
        }; 
    
         public static double[][] XORIdeal = { 
         new[] {0.0}, 
         new[] {1.0}, 
         new[] {1.0}, 
         new[] {0.0} 
        }; 
    
         static void Main(string[] args) 
         { 
          int dimension = 2; // XORInput provides two-dimensional inputs. Not 8. 
          /* 
          If XORInput is 8 dimensional it should be like this: 
    
          public static double[][] XORInput = { 
          new[] {0.0, 0.0,0.0, 0.0,0.0, 0.0,0.0, 0.0}, 
          . 
          . 
          .*/ 
          int numNeuronsPerDimension = 4; // could be also 16, 64, 256. I suppose it should accept 8, 32 but it needs additional investigation 
          double volumeNeuronWidth = 2.0/numNeuronsPerDimension; 
          bool includeEdgeRBFs = true; 
    
          RBFNetwork n = new RBFNetwork(dimension, numNeuronsPerDimension, 1, RBFEnum.Gaussian); 
          n.SetRBFCentersAndWidthsEqualSpacing(0, 1, RBFEnum.Gaussian, volumeNeuronWidth, includeEdgeRBFs); 
          //n.RandomizeRBFCentersAndWidths(0, 1, RBFEnum.Gaussian); 
    
          INeuralDataSet trainingSet = new BasicNeuralDataSet(XORInput, XORIdeal); 
          SVDTraining train = new SVDTraining(n, trainingSet); 
    
          int epoch = 1; 
          do 
          { 
           train.Iteration(); 
           Console.WriteLine("Epoch #" + epoch + " Error:" + train.Error); 
           epoch++; 
          } while ((epoch < 1) && (train.Error > 0.001)); 
    
         } 
        } 
    } 
    
+1

Tôi quên để thay đổi không gian của tôi, 2 là đúng. Cảm ơn bạn đã trỏ tới numNeuronsPerDimension, giờ nó hoạt động! Tôi đã thử 8, 32 và nó không hoạt động, do đó, chỉ có 16, 64, 256. – EdWood

+1

WRT sức mạnh của kích thước là yêu cầu của các trung tâm RBF và chiều rộng bằng nhau khoảng cách thuật toán –

+0

Tôi nghĩ rằng có một lỗi trong phiên bản .NET trên dòng 232: var expectedSideLength = (int) Math.Pow (totalNumHiddenNeurons, 1.0d/dimension); double cmp = Math.Pow (totalNumHiddenNeurons, 1.0d/dimensions); if (expectedSideLength! = cmp) hai biến này không thể bằng nhau, bởi vì "(int)" làm tròn số. Đó là trùng hợp ngẫu nhiên rằng nó hoạt động cho ví dụ XOR, với dimenson khác nhau như 19 nó sẽ không hoạt động. – EdWood