2017-05-16 3 views
0

現在、犬と猫の違いを伝えるCNNに取り組んでいます。InputおよびIdeal Double 2d配列でのBasicMLDataSetの初期化時のNullPointer例外

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; 
    } 

私は、これは画像をロードするための賢い方法ではないかもしれないけど、私はちょうど私がパフォーマンスを高める開始する前に、コンセプトの作品を見たい:これは私がこれまでに出て働いているコードです。 dog_imgに2つ、cat_imgに2つ、画像が4つ置かれた場合、プログラムは画像を細かくロードし、入力と理想的な配列の長さは共に4であり、両方ともdouble値で埋められます。しかし、ライン上で

var trainingSet =新しいBasicMLDataSet(入力、理想);

プログラムはNullPointerExceptionエラーをスローします。どちらの配列も明示的に初期化され、空でも空でもないが、それでもエラーはスローされます。どんな助けもありがとうございます。ありがとうございました。 FritzFurtz

答えて

0

EncogはCNNをサポートしていないため、Encogニューラルネットワークへの入力はすべて1Dベクトルです。したがって、画像をEncogに送る場合は、1次元ベクトルにスカッシュしてBasicMLDataオブジェクトにラップする必要があります。 Encogはおそらくコンピュータビジョン/ CNNのための最良のソリューションではありません。 C#の場合、私はCNTKを見ます。