我目前正致力于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
答案 0 :(得分:0)
Encog不支持CNN,Encog神经网络的所有输入都是1D向量。因此,如果要将图像提供给Encog,则需要将其压缩为1D向量并将其包装在BasicMLData对象中。 Encog可能不是计算机视觉/ CNN的最佳解决方案。对于C#,我会看CNTK。