如何从头设计一个神经网络库

本系列教程分为两部分

  • 1 设计一个神经网络库的基本架构设计
  • 2 每个组建的具体实现细节

1 神经网络库的基本架构设计

为了项目代码的可扩展性,我们选取面向对象的编码方式。我们设计的基本架构主要包括几个主要模块

  • 1.神经网络基本组件( NeuralNetwork N e u r a l N e t w o r k ):主要用于支持神经网络运行的完整流程,其中包括添加网络层,训练网络模型,预测等主要方法。
  • 2 .层组件( Layers L a y e r s ):主要实现神经网络不同组件层:比如说全连接层( Dense D e n s e ),卷积网络层( RNN R N N ),卷积层( Conv2D C o n v 2 D ),批正则化层( BN B N ),池化层( PoolingLayer P o o l i n g L a y e r ), Dropout D r o p o u t 层,激活函数层( Activation A c t i v a t i o n )。层组件主要由层的前向传播,反向传播两个过程组成。
  • 3.激活函数组件。主要实现神经网络中不同激活函数:比如说 Sigmoid S i g m o i d Relu R e l u 。激活函数组件主要有函数的定义以及函数一阶导的定义组成。
  • 4 损失函数组件。主要实现神经网络中的不同的损失函数:比如说对于回归问题的平方损失函数,对于分类问题的交叉熵损失函数。损失函数组件主要由函数定义以及函数一阶导定义组成
  • 5 优化器组件。主要实现神经网络中不同的优化方法:比如说随机梯度下降法,动量梯度下降法,以及 Adam A d a m 等等。优化器组件主要有更新参数方法组成。

图形化的解释
这里写图片描述

2 每个组建的具体实现细节

1.神经网络基本组件

主要用于支持神经网络运行的完整流程,其中包括添加网络层,训练网络模型,预测等主要方法。

2.层组件

(1) Dense D e n s e
前向传播: WX+b W X + b

反向传播:

  1. 首先接收损失函数对于该层输出的导数 δ δ (可以作为参数传进来),
  2. 然后通过链式求导法则, W=δZW ▽ W = δ ∂ Z ∂ W X=δZX ▽ X = δ ∂ Z ∂ X
  3. 更新参数权重,并且回传 X ▽ X

(2) RNN R N N
这里写图片描述
前向传播:
for t from 1 to T for  t  from  1  to  T

  1. stin=XtUT+st1WT s i n t = X t U T + s t − 1 W T
  2. st=Activation(stin) s t = A c t i v a t i o n ( s i n t )
  3. ot=stVT o t = s t V T

反向传播:

  1. 首先接收损失函数对于该层输出的导数 δ δ (可以作为参数传进来),形状是(batch_size,timesteps,input_dim)
  2. 对于每个步长t从1到T,首先计算垂直方向的梯度 V=V+δTtotV ▽ V = ▽ V + δ t T ∂ o t ∂ V , stin=δTtotstststin ▽ s i n t = δ t T ∂ o t ∂ s t ∂ s t ∂ s i n t Xt=stinstinXt ▽ X t = ▽ s i n t ∂ s i n t ∂ X t 。然后再计算时间维度的梯度:从t到0,计算 U=U+δTtstinU ▽ U = ▽ U + δ t T ∂ s i n t ∂ U W=W+δTtstinW ▽ W = ▽ W + δ t T ∂ s i n t ∂ W
  3. 更新参数 U,W,V U , W , V ,并且回传梯度 X ▽ X

(3) Conv2D C o n v 2 D
前向传播:

  1. 将原始的图片矩阵 X X (batch_size,channels,image_width,image_height)整理为(batch_size * out_height * out_width,filter_height*filter_width*channels)。将卷积核矩阵W(n_filters,channels,filter_height,filter_width)
    整理为(n_filters,filter_height*filter_width*channels)。这一步可以理解为卷积操作的准备工作。
  2. 进行卷积操作,即 WXT W X T ,然后整理一下形状接着往下传

反向传播:

  1. 首先接收损失函数对于该层输出的导数 δ δ (可以作为参数传进来),形状是(batch_size,n_filters,out_height,out_width)
  2. W=δztW ▽ W = δ ∂ z t ∂ W X=δztX ▽ X = δ ∂ z t ∂ X
  3. 更新参数W,并且回传 X ▽ X (需要整理形状为(batch_size,channels,image_width,image_height))

(3) PoolingLayer P o o l i n g L a y e r
前向传播:

  1. 将原始的图片矩阵 X X (batch_size,channels,image_width,image_height)整理为(batch_size*channels * out_height * out_width,pool_shape[0]*pool_shape[1])。
  2. 然后计算池化区域的统计量,比如MaxAverage。然后传入下一层。

反向传播:

  1. 首先接收损失函数对于该层输出的导数 δ δ (可以作为参数传进来),形状是(batch_size,n_filters,out_height,out_width)
  2. δ δ 的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是MAX,则把 δ δ 的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置。如果是Average,则把 δ δ 的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做 upsample u p s a m p l e

(4) Dropout D r o p o u t

前向传播

  1. 随机以概率p选取部分神经单元置0,并且记录索引。往下传播

反向传播

  1. 首先接收损失函数对于该层输出的导数 δ δ (可以作为参数传进来)
  2. 然后乘以索引。往前传播

(5) Activation A c t i v a t i o n
前向传播:

  1. 将输入传入激活函数,把输出往传输

后向传播:

  1. 首先接收损失函数对于该层输出的导数 δ δ (可以作为参数传进来)
  2. δσ(.) δ ∗ σ ′ ( . ) ,然后接着往下传输。
3 激活函数组件

激活函数的实现以及一阶导的实现

4 损失函数组件

损失函数的实现以及一阶导的实现

5 优化器组件

优化器更新梯度函数的实现

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 神经网络模型是为了加快在移动设备上运行神经网络模型而设计的。在移动设备上进行机器学习任务是一个挑战,因为传统的机器学习通常过于庞大,不适合在有限的计算资源和存储空间下运行。 Android 神经网络模型提供了一个轻量级的框架,可以在移动设备上进行高效的深度学习任务。它包含了一些预训练的神经网络模型,例如图像分类、目标检测和语音识别等。开发人员可以使用这些预训练模型,而不用从头开始训练自己的模型。 这个还提供了易于使用的 API,开发人员可以使用 Java 或 C++ 编写自己的应用程序。通过这个,开发人员可以在移动设备上快速加载和运行模型,而不用依赖远程服务器进行预测。这不仅提高了响应速度,还减少了对网络连接的依赖。 Android 神经网络模型还支持 GPU 加速,这意味着它可以利用设备上的图形处理单元进行并行计算,提高模型的运行速度。这对于一些复杂的模型来说尤为重要,因为它们可能需要大量的计算资源来进行推理。 总之,Android 神经网络模型为移动设备上的深度学习任务提供了一个高效、轻量级的解决方案。它使开发人员能够更轻松地将神经网络模型集成到自己的应用程序中,并在移动设备上进行实时的预测和推理。这为移动设备带来了更多的智能化功能和更好的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值