2017-05-16 8 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이고 두 개 모두 double 값으로 채워집니다. 하지만 줄에

var trainingSet = new BasicMLDataSet (입력, 이상적);

프로그램에서 NullPointerException 오류가 발생합니다. 두 배열은 모두 명확하게 초기화되고 null 또는 비어 있지 않지만 여전히 오류가 발생합니다. 어떤 도움을 주셔서 감사합니다. 고맙습니다. FritzFurtz

답변

0

Encog는 CNN을 지원하지 않으므로 Encog 신경망에 대한 모든 입력은 1D 벡터입니다. 따라서 이미지를 Encog에 공급하려면 이미지를 1D 벡터로 스쿼시하여 BasicMLData 객체로 래핑해야합니다. Encog는 컴퓨터 비전/CNN을위한 최상의 솔루션이 아닐 것입니다. C#의 경우, CNTK을 보았습니다.