2017-05-16 7 views
0

Ich arbeite gerade an einem CNN, das den Unterschied zwischen einem Hund und einer Katze unterscheiden kann. Dies ist der Code, den ich bisher gearbeitet:NullPointer Exception bei der Initialisierung von BasicMLDataSet mit Input und Ideal Double 2d Arrays

public bool trained = false; 
public BasicNetwork network; 
public Form1() 
{ 
    InitializeComponent(); 
} 
[..] 
private void trainNN() 
{  
    double[][] input = LoadImages(); 
    double[][] ideal = LoadIdeal(); 
    var trainingSet = new BasicMLDataSet(input, ideal); 
    var train = new ResilientPropagation(network, trainingSet); 
    network = CreateNetwork(); 
} 
    private double[][] LoadImages() 
    { 
     status.Text = "Loading images..."; 
     String[] dogimgs = Directory.GetFiles(Directory.GetCurrentDirectory() + "\\dog_img\\", "*", SearchOption.TopDirectoryOnly); 
     String[] catimgs = Directory.GetFiles(Directory.GetCurrentDirectory() + "\\cat_img\\", "*", SearchOption.TopDirectoryOnly); 
     int dogimgscount = dogimgs.Length; 
     int catimgscount = catimgs.Length; 
     int totalimgscount = dogimgscount + catimgscount; 
     double[][] images = new double[totalimgscount][]; 
     for (int dogloop = 0; dogloop < dogimgscount; dogloop++) 
     { 
      status.Text = "Loading images... [" + (dogloop + 1) + "/" + totalimgscount + "]"; 
      images[dogloop] = Image2Matrix(new Bitmap(dogimgs[dogloop])); 
     } 
     for (int catloop = 0; catloop < catimgscount; catloop++) 
     { 
      status.Text = "Loading images... [" + (catloop + dogimgscount) + "/" + totalimgscount + "]"; 
      images[catloop + dogimgscount - 1] = Image2Matrix(new Bitmap(catimgs[catloop])); 
     } 
     status.Text = "Images loaded."; 
     return images; 
    } 
    private double[][] LoadIdeal() 
    { 
     String[] dogimgs = Directory.GetFiles(Directory.GetCurrentDirectory() + "\\dog_img\\", "*", SearchOption.TopDirectoryOnly); 
     String[] catimgs = Directory.GetFiles(Directory.GetCurrentDirectory() + "\\cat_img\\", "*", SearchOption.TopDirectoryOnly); 
     int dogimgscount = dogimgs.Length; 
     int catimgscount = catimgs.Length; 
     int totalimgscount = dogimgscount + catimgscount; 
     double[][] ideal = new double[totalimgscount][]; 
     for (int dogloop = 0; dogloop < dogimgscount; dogloop++) 
     { 
      ideal[dogloop] = new[] { 0.0, 1.0 }; 
     } 
     for (int catloop = 0; catloop < catimgscount; catloop++) 
     { 
      ideal[catloop + dogimgscount - 1] = new[] { 1.0, 0.0 }; 
     } 
     return ideal; 
    } 

Ich weiß, dass dies nicht der cleverste Weg sein könnte, um die Bilder zu laden, aber ich will nur das Konzept der Arbeit sehen, bevor ich Leistungssteigerung beginnen. Mein Problem ist folgendes: Wenn ich 4 Bilder einlege, 2 in dog_img, 2 in cat_img, lädt das Programm die Bilder fein und sowohl das Eingabe- als auch das ideale Array haben eine Länge von 4 und beide sind mit doppelten Werten gefüllt. Aber auf der Linie

var trainingSet = neue BasicMLDataSet (Eingabe, ideal);

Das Programm löst einen NullPointerException Error aus. Beide Arrays sind eindeutig initialisiert und nicht null oder leer, dennoch wird der Fehler ausgegeben. Jede Hilfe wird geschätzt. Vielen Dank. FritzFurtz

Antwort

0

Encog unterstützt keine CNNs, alle Eingaben in Encog neuronale Netze sind 1D Vektoren. Wenn Sie also ein Bild an Encog übergeben möchten, müssen Sie es in einen 1D-Vektor zerlegen und in ein BasicMLData-Objekt einbinden. Encog ist wahrscheinlich nicht die beste Lösung für Computer Vision/CNN. Für C# würde ich CNTK betrachten.

Verwandte Themen