原创文章,转载请注明: 转载自慢慢的回味
本文链接地址: Multiple Layer Perceptron Classifier(多层神经网络分类) in ML
Content:
引言
在Logistic Regression(逻辑回归) in ML的基础上,现在来介绍多层神经网络分类方法。
神经网络分类就是模拟人类大脑认识物体的方式对输入进行分类。一般为了提高精确性和鲁棒性,都会设置多层进行分析,其中第一层为输入层,一般进行数据初分类,修剪等,最后一层为输出层,中间的为隐藏层。
每一层有多个神经元节点组成,它们都有各自的weight权值,越高越能决定输出值。本文根据Spark中的代码进行介绍,理论知识可参考《数字图像处理与机器视觉 Visual C++与Matlab实现》第12章介绍。
和逻辑回归的相比较,主要是它们的梯度计算器和更新器不一样,且神经网络的梯度计算和损失计算都是多层的。
代码分析
测试代码
以MultilayerPerceptronClassifierSuite类中的测试 test(“3 class classification with 2 hidden layers”)为例。
此单元测试用了多层神经网络和逻辑回归两种方式进行模型训练,并对训练结果进行了比较。
test("3 class classification with 2 hidden layers") { val nPoints = 1000 // The following coefficients are taken from OneVsRestSuite.scala // they represent 3-class iris dataset val coefficients = Array( -0.57997, 0.912083, -0.371077, -0.819866, 2.688191, -0.16624, -0.84355, -0.048509, -0.301789, 4.170682) val xMean = Array(5.843, 3.057, 3.758, 1.199) val xVariance = Array(0.6856, 0.1899, 3.116, 0.581) // the input seed is somewhat magic, to make this test pass //用输入的系数,均值和方差生成多类逻辑回归输入数据 val data = generateMultinomialLogisticInput( coefficients, xMean, xVariance, true, nPoints, 1).toDS() val dataFrame = data.toDF("label", "features") val numClasses = 3//3类 val numIterations = 100//最大迭代次数100 //层神经元数量,输入为4个,输出为3个,隐藏层分别为5,4 val layers = Array[Int](4, 5, 4, numClasses) val trainer = new MultilayerPerceptronClassifier() .setLayers(layers) .setBlockSize(1) .setSeed(11L) // currently this seed is ignored .setMaxIter(numIterations) val model = trainer.fit(dataFrame)//下一节继续 val numFeatures = dataFrame.select("features").first().getAs[Vector](0).size assert(model.numFeatures === numFeatures) val mlpPredictionAndLabels = model.transform(dataFrame).select("prediction", "label").rdd.map { case Row(p: Double, l: Double) => (p, l) } // train multinomial logistic regression val lr = new LogisticRegressionWithLBFGS() .setIntercept(true) .setNumClasses(numClasses) lr.optimizer.setRegParam(0.0) .setNumIterations(numIterations) val lrModel = lr.run(data.rdd.map(OldLabeledPoint.fromML)) val lrPredictionAndLabels = lrModel.predict(data.rdd.map(p => OldVectors.fromML(p.features))).zip(data.rdd.map(_.label)) // MLP's predictions should not differ a lot from LR's. val lrMetrics = new MulticlassMetrics(lrPredictionAndLabels) val mlpMetrics = new MulticlassMetrics(mlpPredictionAndLabels) assert(mlpMetrics.confusionMatrix.asML ~== lrMetrics.confusionMatrix.asML absTol 100) } |
继续阅读“Multiple Layer Perceptron Classifier(多层神经网络分类) in ML”本作品采用知识共享署名 4.0 国际许可协议进行许可。