使用交叉验证为 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.
我正在尝试为 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.