使用Input和Ideal Double 2d Arrays初始化BasicMLDataSet时出现NullPointer异常

时间:2017-05-16 09:55:38

标签: c# arrays neural-network encog

我目前正致力于CNN,可以分辨出狗和猫之间的区别。这是我到目前为止编写的代码:

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

我知道这可能不是加载图像的最明智的方法,但我只想在开始提升性能之前看到这个概念。我的问题如下:如果我放了4个图像,2个在dog_img中,2个在cat_img中,程序加载图像很好,输入和理想数组的长度都是4,并且它们都填充了双值。但是就行了

  

var trainingSet = new BasicMLDataSet(input,ideal);

程序抛出NullPointerException错误。两个数组都清楚地初始化,而不是null或空,但它仍然会抛出错误。任何帮助表示赞赏。谢谢。 FritzFurtz

1 个答案:

答案 0 :(得分:0)

Encog不支持CNN,Encog神经网络的所有输入都是1D向量。因此,如果要将图像提供给Encog,则需要将其压缩为1D向量并将其包装在BasicMLData对象中。 Encog可能不是计算机视觉/ CNN的最佳解决方案。对于C#,我会看CNTK