为了加深理解,用Scala实现全链接的二分类神经网络, 风格偏函数式, 没有使用循环, 不使用var变量, 需要使用Breeze线性代数库.
用Python制造了一组相对难分的训练数据并写入文件,如图.
代码如下
先导入一些库
package ann
import java.io.File
import breeze.linalg.{*, max, min, sum, DenseMatrix => BDM, DenseVector => BDV} //那个*号居然是广播运算用的
import breeze.linalg.InjectNumericOps
import breeze.{numerics => BN} // 导入函数库
import breeze.plot._ //作图库
import scala.annotation.tailrec
import scala.math
import scala.util.Random
定义网络, 神经网络的本质就是一个函数, 给个输入,有个输出
//封装一下网络参数, 主要是权重,偏置和激活函数
case class LayerPara(weight:BDM[Double] , bias:BDV[Double],activationFunc: ActivationFunc)
trait Layer{
def apply(input:BDM[Double] ):BDM[Double]
//定一个类似List的操作,表示网络链接
def <=:(nextLayerPara:LayerPara):HLayer = HLayer(nextLayerPara,this) //这是个具体方法, 会被直接装配到子类里面
}
//输入层只有一个, 弄个单例
object Input extends Layer{
def apply(input:BDM[Double] ):BDM[Double] = input
}
//隐层,
case class HLayer