2017-04-19 47 views
0

请帮助我!我正在使用deeplearning4j开展一个项目。 MNIST示例运行得非常好,但是我的数据集出现错误。 我的数据集有两个输出。使用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

您正在初始化神经网络错误。如果你仔细观察 cnn example在dl4j示例回购(提示:这是您应该从哪里拉代码的规范来源,其他任何可能无效或过时:https://github.com/deeplearning4j/dl4j-examples) 您会注意到在我们所有的例子中,我们有一个的inputType配置: https://github.com/deeplearning4j/dl4j-examples/blob/master/dl4j-examples/src/main/java/org/deeplearning4j/examples/convolution/LenetMnistExample.java#L114

有很多种,你应该使用手动你应该从未集n在。只是nOut。

对于mnist,我们使用卷积平面并将它转换为自动为您设置的4d数据集。

Mnist作为一个平面向量开始,但cnn只能理解3d数据。我们为您做了这种转变并重塑了它。