代码之家  ›  专栏  ›  技术社区  ›  Andre Nuechter

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

  •  0
  • Andre Nuechter  · 技术社区  · 7 年前

    我正在努力确定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()方法,但它不接受提供的参数。

    如果我在这个假设中是正确的,那么我做错了什么?我如何才能使它按预期工作?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Andre Nuechter    6 年前

    看看代码,它在语法上似乎是正确的。 它不工作可能是一个错误或故意的,因为这将是相当昂贵的计算。所以我想不,你不能用简历。

    我最终使用了以下公式:

    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 .