我正在努力确定Apache Spark中多层接收器的最佳架构,我想知道是否可以使用交叉验证。
一些代码:
// define layers
int[] layers = new int[] {784, 78, 35, 10};
int[] layers2 = new int[] {784, 28, 28, 10};
int[] layers3 = new int[] {784, 84, 10};
int[] layers4 = new int[] {784, 392, 171, 78, 10};
MultilayerPerceptronClassifier mlp = new MultilayerPerceptronClassifier()
.setMaxIter(25)
.setLayers(layers4);
ParamMap[] paramGrid = new ParamGridBuilder()
.addGrid(mlp.seed(), new long[] {895L, 12345L})
//.addGrid(mlp.layers(), new int[][] {layers, layers2, layers3})
.build();
CrossValidator cv = new CrossValidator()
.setEstimator(mlp)
.setEvaluator(new MulticlassClassificationEvaluator())
.setEstimatorParamMaps(paramGrid).setNumFolds(10);
CrossValidatorModel model = cv.fit(train);
如您所见,我在整数数组(layers-layers4)中定义了一些架构。
实际上,我必须多次拟合模型,手动更改学习算法的层参数。
我想要的是在传递给交叉验证器(ParamMap中注释掉的行)的ParamMap中提供不同的架构。
我怀疑这是可能的,因为ParamGridBuilder似乎知道layers()方法,但它不接受提供的参数。
如果我在这个假设中是正确的,那么我做错了什么?我如何才能使它按预期工作?