2017-04-19 20 views
0

도와주세요! 나는 deeplearning4j을 사용하는 프로젝트에서 일하고 있습니다. MNIST 예제는 잘 작동하지만 데이터 세트에 오류가 발생합니다. 내 데이터 세트에는 2 개의 출력이 있습니다. 아닌 행렬 입력;MNIST를 사용한 코드 오류 deeplearning4j 예제

int height = 45; 
int width = 800; 
int channels = 1; 
int rngseed = 123; 
Random randNumGen = new Random(rngseed); 
int batchSize = 128; 
int outputNum = 2; 
int numEpochs = 15; 
File trainData = new File("C:/Users/JHP/Desktop/learningData/training"); 
File testData = new File("C:/Users/JHP/Desktop/learningData/testing"); 
FileSplit train = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); 
FileSplit test = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); 
ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator(); 

ImageRecordReader recordReader = new ImageRecordReader(height, width, channels, labelMaker); 
ImageRecordReader recordReader2 = new ImageRecordReader(height, width, channels, labelMaker); 
recordReader.initialize(train); 
recordReader2.initialize(test); 

DataSetIterator dataIter = new RecordReaderDataSetIterator(recordReader, batchSize, 1, outputNum); 
DataSetIterator testIter = new RecordReaderDataSetIterator(recordReader2, batchSize, 1, outputNum); 

DataNormalization scaler = new ImagePreProcessingScaler(0, 1); 
scaler.fit(dataIter); 
dataIter.setPreProcessor(scaler); 

System.out.println("Build model...."); 
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder() 
     .seed(rngseed) 
     .optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT) 
     .iterations(1) 
     .learningRate(0.006) 
     .updater(Updater.NESTEROVS).momentum(0.9) 
     .regularization(true).l2(1e-4) 
     .list() 
     .layer(0, new DenseLayer.Builder() 
       .nIn(height * width) 
       .nOut(1000) 
       .activation(Activation.RELU) 
       .weightInit(WeightInit.XAVIER) 
       .build() 
       ) 
     .layer(1, newOutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD) 
       .nIn(1000) 
       .nOut(outputNum) 
       .activation(Activation.SOFTMAX) 
       .weightInit(WeightInit.XAVIER) 
       .build() 
       ) 
     .pretrain(false).backprop(true) 
     .build(); 

MultiLayerNetwork model = new MultiLayerNetwork(conf); 
model.init(); 
model.setListeners(new ScoreIterationListener(1)); 

System.out.println("Train model...."); 
for (int i = 0; i < numEpochs; i++) { 
    try { 
     model.fit(dataIter); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 
} 

오류

org.deeplearning4j.exception.DL4JInvalidInputException은 예상 매트릭스 (순위 2), 모양 와 순위 4 배열 [128, 1, 45, 800]

+0

DataSetIterator 함수를 다른 함수로 변경해야한다고 생각합니다. MNIST 예제의 경우 데이터를 함수로 가져 오는 것과 같습니다. ** DataSetIterator mnistTrain = new MnistDataSetIterator (batchSize, true, rngseed); ** 어떤 기능을 사용해야할지 모르겠습니다. – user7887249

+0

@ TriV TriV 개선 할 부분을 알려 주신 데 대해 감사드립니다! 스택 오버플로를 처음 사용했기 때문에 몰랐습니다. 대단히 감사합니다! – user7887249

답변

0

당신은 신경 그물 잘못을 초기화하고 있어요. 을 가까이에서 보면 dn4j 예제의 repo (힌트 : 이것은 코드를 가져와야하는 정규 소스이며 다른 것은 유효하지 않거나 오래됨 : https://github.com/deeplearning4j/dl4j-examples) 알 수 있습니다. https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/LenetMnistExample.java#L114

당신이 수동으로해야 결코 세트 닌를 사용해야합니다 다양한 종류가 있습니다 : 우리의 모든 예에서 우리는 inputType의 설정을 가지고있다. 그냥 안돼.

mnist의 경우 컨볼 루션 플랫을 사용하고 4d 데이터 세트 automaticall로 변환합니다.

Mnist는 평면 벡터로 시작하지만 cnn은 3D 데이터 만 인식합니다. 우리는 당신을 위해 그 변화와 변화를합니다.