Scala实现神经网络 ANN , 偏函数式风格

本文通过Scala实现了一个全连接的二分类神经网络,采用函数式编程风格,避免使用循环和`var`变量。借助Breeze线性代数库,作者创建了一组复杂的训练数据,并使用尾递归进行训练,最终达到基本正确的分类效果。
摘要由CSDN通过智能技术生成

为了加深理解,用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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值