使用交叉验证为 Apache Spark 中的多层感知器选择网络架构

Using cross-validation to choose network-architecture for multilayer perceptron in Apache Spark

我正在尝试为 Apache Spark 中的 multilayerPerceptron 确定最佳架构,并且想知道我是否可以为此使用交叉验证。

一些代码:

// 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) 中定义了一些架构。

照原样,我必须多次拟合模型,手动更改学习算法的层参数。

我想要的是在传递给 CrossValidator(ParamMap 中注释掉的行)的 ParamMap 中提供不同的架构。

我怀疑这是可能的,因为 ParamGridBuilder 似乎知道 layers() 方法,但它不接受提供的参数。

如果我的这个假设是正确的,我做错了什么,我怎样才能让它按预期工作?

查看代码似乎在语法上是正确的。 它不工作可能是一个错误或有意为之,因为它在计算上相当昂贵。所以我想不,你不能为此使用 cv。

我最终使用了以下公式:

Number of units in hidden-layer = ceil((Number of inputs + outputs) * (2/3))

来源:http://www.faqs.org/faqs/ai-faq/neural-nets/part3/section-10.html.