目前在做柔性超声成像系统相关研究,欢迎感兴趣的朋友联系我。

深刻理解神经网络计算原理

笔者初入深度学习先是使用TensorFlow后转PyTorch,但都是在框架上进行开发,只能理解各种网络结构的“头口”原理。在学习的中后期或者是要做落地的时候,就会困扰一个非常常见的问题——我们的网络到底需要多少的计算资源?我们暂且将计算资源在两方面考虑:显存和浮点计算次数。这就需要对网络计算过程的底层有透彻直接的认识,也就是本文的重点

很多厉害的大佬可以根据经验、直觉直接判断哪些网络可以在嵌入式平台上跑,但是笔者还是偏爱将过程量化

全连接网络

梯度下降

为了方便讨论,我们选取单隐藏层的全连接网络进行讨论。首先,声明该网络的输入为:

$$
x_0 = \begin{bmatrix}
x_0^{(1)} \\
x_0^{(2)} \\
\vdots \\
x_0^{(m_0)}
\end{bmatrix} \sim [m_0,1]
$$

本文中所有公式中~后的为矩阵、向量的维度。然而,在训练过程中,我们通常一次使用几个样本一起训练网络(mini-batch),那么一次输入网络的数据就是:

$$
X_0 = \begin{bmatrix}
x_{0,1} ,
x_{0,2} ,
\cdots ,
x_{0,N}
\end{bmatrix} \sim [m_0,N]
$$

阅读更多...

神经网络训练优化器及工具

前言:在上一篇ResNet实战博客中,笔者采用的都是最简单的激活函数和梯度下降训练算法,并且在训练到瓶颈期还需要手动停止训练并调整学习率。所以在本篇中我们将讨论训练优化算法和一些自动训练工具。

Basic:随机梯度下降

SGD:Stochastic gradient descent

这部分属于入门知识,可以看吴恩达老师的课程,讲得非常通俗易懂。

梯度下降

我们的模型(神经网络)本质上是一组不断调整参数的函数组合而成一个我们想要的复杂函数。而根据微积分和高维空间的知识我们知道,任何函数都存在导数(或Jacobian矩阵)并且都存在凹凸特性。而神经网络的训练就是基于这一点,通过人工设计一个目标损失函数,然后以最小化(或最大化)该函数为目标,不断计算输入数据在该损失上的梯度,并不断迭代寻找到函数最低点(上图)。我们将模型和目标损失函数表示为:

$$
\text{网络模型:}\hat{Y} = F(X)
\\
\text{损失函数:}L(\hat{Y},Y)|_{w,b}
$$

SGD训练参数过程:

$$
w := w-\alpha\cdot \frac{\partial L}{\partial w}
\\
b := b-\alpha\cdot \frac{\partial L}{\partial b}
$$

阅读更多...

Pytorch实现ResNet18

前言:ResNet是计算机视觉做人工智能分类的有力工具,也是后续深度学习开发超深网络的基础。笔者使用了一周的时间从全连接网络学习到了CNN及ResNet,并且使用pytorch手写了一版ResNet18对CIFAR-10数据集的识别,将在本篇中记录学习的心得。

What’s ResNet

首先引用一张图来说明为什么会诞生ResNet及其用处

Why

图片摘自发明该技术的何凯明原论文

正如上图中左部分,普通的神经网络当深度加深时,在同一数据集上训练的效果变差;但是从直觉和理论的角度来说,当网络加深时,对复杂特征函数的表达将更好,起码不能变差。

造成该现象的原因是,神经网络是基于梯度训练的,存在着梯度爆炸梯度消失问题,而深度网络越深则反向传播时深层获得的梯度激励更小,就越难训练,也就是说训练效果变差。

而采用ResNet后,如上图中右部分,深度网络变得如我们预期的那样——更深的网络带来更好的效果。那么这是怎么回事呢?下图是组成ResNet的基本元件,叫做Residual Unit(残差单元)

ResUnit

精髓就是右边的那一根短路线,简单的理解就是对这个部分求导会得到一个(1+dF),所以梯度传播到了深层最起码也有个1在,减小了梯度消失出现的概率。看这个块可能还有点愣,那么看一下具体实现的ResNet吧!

阅读更多...
  • Copyrights © 2022-2024 RY.J
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信