我正在使用LibSVM记录阅读器将稀疏数据加载到神经网络中。
这在使用MLP模型时工作正常,但当我尝试将数据加载到其中一个问题中给出的示例CNN中时:
ComputationGraphConfiguration config = new NeuralNetConfiguration.Builder()
.trainingWorkspaceMode(WorkspaceMode.SINGLE).inferenceWorkspaceMode(WorkspaceMode.SINGLE)
//.trainingWorkspaceMode(WorkspaceMode.SEPARATE).inferenceWorkspaceMode(WorkspaceMode.SEPARATE)
.weightInit(WeightInit.RELU)
.activation(Activation.LEAKYRELU)
.updater(Updater.ADAM)
.convolutionMode(ConvolutionMode.Same)
.regularization(true).l2(0.0001)
.learningRate(0.01)
.graphBuilder()
.addInputs("input")
.addLayer("cnn3", new ConvolutionLayer.Builder()
.kernelSize(3, vectorSize)
.stride(1, vectorSize)
.nIn(1)
.nOut(cnnLayerFeatureMaps)
.build(), "input")
.addLayer("cnn4", new ConvolutionLayer.Builder()
.kernelSize(4, vectorSize)
.stride(1, vectorSize)
.nIn(1)
.nOut(cnnLayerFeatureMaps)
.build(), "input")
.addLayer("cnn5", new ConvolutionLayer.Builder()
.kernelSize(5, vectorSize)
.stride(1, vectorSize)
.nIn(1)
.nOut(cnnLayerFeatureMaps)
.build(), "input")
.addVertex("merger", new MergeVertex(), "cnn3", "cnn4", "cnn5")
.addLayer("globalPool", new GlobalPoolingLayer.Builder()
.poolingType(globalPoolingType)
.dropOut(0.5)
.build(), "merger")
.addLayer("out", new OutputLayer.Builder()
.lossFunction(LossFunctions.LossFunction.MCXENT)
.activation(Activation.SOFTMAX)
.nIn(3*cnnLayerFeatureMaps)
.nOut(classes.length)
.build(), "globalPool")
.setOutputs("out")
.setInputTypes(InputType.convolutionalFlat(32,45623,1))
.build();
我得到的错误似乎是说它获得了二维数据,但它需要三维数据(第三维是一个微不足道的数据)。
Exception in thread "main" java.lang.IllegalArgumentException: Invalid input: expect output columns must be equal to rows 32 x columns 45623 x channels 1 but was instead [32, 45623]
如何为其提供1通道维度?
如果不这样做,我如何让CNN识别无频道数据,或者如何提供CNN稀疏数据呢?
谢谢
答案 0 :(得分:1)
设置cnns时遇到的典型问题是输入类型设置错误。 Deeplearning4j相当于"输入层"是一种输入类型,我们根据您正在处理的数据类型配置常见配置,如rnns或cnn flat。通常,如果您使用的是cnns,则需要查看InputType.convolutionalFlat 方法
这将采用平面向量并将其转换为适合与cnns一起使用的1通道张量。如果使用输入类型,它还会自动为您设置输入和输出的数量。