1.首先caffe 安装我就不解释了 如果有人安装不会的话 可以加我qq 1050316096 ,我会按照使用方式来介绍,首先打开caffe 的github开源项目
caffe 有一个缺点就是依赖的库太多,所以安装理解可能比较麻烦,好处就是网络定义使用google的 protoBuf方式 以及 层定义之间很明确 清晰。
首先我来讲一下 深度学习怎么来的。
普通的 普通的模拟神经元 其实 就是 y=wx+b 多个来源 也就是权重 W 以及 偏重 B 参数的调整,于是 就可以通过计算LOSS损失函数 来控制梯度下降。所谓梯度下降 就是调整参数让他往空间斜率的方向跑。 OK ,于是问题来了 ,这其实就是一个线性回归模型
后面人们发现可以通过多层的神经元相互组合 形成多层神经元NN 进行训练,通过调整隐藏神经元从而达到你所需要的结果
其实这里面大体是一样的
OK 下面是国外一个教程的截图,其实就是每一层的参数都可以用上一层wx+b来代替 ,最后转换成第一层的wx+b 与最后一层的h(x)的问题,求解的问题,于是引入了loss损失函数来保证梯度下降。
我们知道 每一层的输出 其实就是一个wx+b 然后层层带入,因为我们可以用第一层的表示后面的相应的多层输入,我们也能知道结果,上图的H(X) 然后我们就能得到一个用第一层的wx+b表示的 公司,所以最后求数学上的损失 以及 控制梯度下降 都是转换成wx+b的问题,最后其实跟w x b相关的一个函数,我们知道现实中数据 不是线性可分的 有很多,线性回归问题,不能直接wx+b的线性回归模型来求解,于是人们采用多层模型 嵌套,是的线性不可分的问题,像切蛋糕,一样 类似于SVM, ,在空间平面上 切 切 切 ,是的能够求解这类问题,后面,人们发现引入激活函数,调整参数 会有更好的收敛性而且不容易陷入局部最优解 梯度下降,比如下到半山腰。
常用的激活函数有sigol 还有tanh 这些数学 就是一些数学上的曲线收敛函数、不过relu的收敛性比他们效果更好,所以现在深度学习 在激活层上都一般采用relu
我下面说说我的理解 。深度学习 在 上面的多层网络基础上 ,实现了整理梯度下降 ,每一次都有BP反馈,以及前向更改,以及批次量的训练 以及 xvier的 初始化权重 这样来保证整理上梯度下降 而不会陷入over fitting,另外计算机速度越来越快,所以深度学习遍发展起来了。
下面我们讲一讲caffe 的网络结构情况 首先看到caffe下面的
我们可以看到 有三个prototxt文件,因为caffe 定义网络是protoBuf定义的协议定义在src/caffe/proto/caffe.proto 这个文件里面,然后prototxt定义网络的层定义,当运行时候会读取txt 反系列化proto解析,并初始化定义文件里面的每一层每一层分布,初始化网络 然后就开始训练。首先看看solver文件。他是入口,定义了网络的一些训练参数
这里面最注意到的是net 里面的train_val.pototxt 他是用来做训练测试时候的运行网络,但是实际的网络 后面部署 使用的网络是deploy.txt 也就是说,
这2个文件 deploy 与 train_val有一些区别,
1.因为是train_val 所以 有测试 有训练 ,你也可以分开2个文件来写,写成一个文件 需要使用
include{
phase:Train/Test
}
这是表明该网络是在什么时候使用,是train/Test 还有就是他外部有个最大的最外层的layer 用来作为label 校验 以及 input输入的最底层网络输入,所以因为他是用来校验调整,所以 一般在后面会看到 有两个bottom 以及 top 而且 SoftMax分类器 是SoftMaxLoss 这样 可以让层经过这个时候有个BP反馈。 这是一些细微的差别。然后其他方面大体一致。因为deploy只是一个部署模型model 使用时候的网络文件,当然不会有这些loss 以及 label 测试 等相关输入以及输出。
理解了这三个文件之后 ,我们来看看一个caffe的网络的layer构成组成 。
通过type定义层的类型
下面讲一下 几个基本常用的层的理解 。详细所有的可以看看我下面的链接里面,有详细的介绍。
1.convetion 卷积层 ,因为图像有局部特征 可以共享参数,所以可以通过局部特征特性来减少输入维度 以及隐藏的参数。主要原理是,一个图像WXH的矩阵 可以转换成 一个 卷积核个数以及 图像矩阵的卷积核抽取的向量展开成的一维特征的矩阵,AXB 然后
每一张图像能抽取C个矩阵,这个可以算出来一个BxC的特征,然后矩阵剩法, 至于GPU 就是在这些矩阵方面运行非常快 加速了所以GPU训练比较快。
这样可以得到一个AXC的特征 这就是做卷积的大概的结果。
2,pool 池化层,为了防止overfitting问题,类似于图像的金字塔法则 ,用平均 最大 等来代替卷积特征的 ,这样可以进一步缩小 输出的抽象特征
3. relu激活层 ,一般都是relu 有较好的速度与性能 ,主要是原子层上的一层参数的调整。
4. softmax分类器loss损失层 ,主要做多元分类 ,、
5.全连接层 主要把特征多维变成NX1X1X1 的输出特征,其实就是以前神经网络的NN一样,
然后多层网络之间 上一层输出 作为下一层的输入,
如果有实际上不理解的 可以一起交流。这一方面
这是一个很好的教程,有哪些层 ,以及 这些层的原理 作用 都有详细的介绍 我觉得非常好的教程了。
这里我们大概知道了层的定义
所以有卷积层C 就叫做CNN 如果全部是连接层 以及 其他relu 以及 dropdown 等等 就叫做DNN
如果每一层之间向下forward 时候 以及 BP向上 会考虑过去几层的权重 以及 相关loss 数据等等 就叫做 RNN
如果每一层上一层输出的b 保留 交给下一层 计算进去 就叫做深度残差网络、。resnet
了解了上面的需求后,我们就可以参考 caffe一些开源model 来构建自己的网络定义了。并使用到实际中。
我是一个java工程师 ,并不是专业学计算机深度学习研究的 。不能理解内部的完整的数学算法,博士教授研究的东西 数学也不够好,所以这只是我的一个理解,所以有什么不足 很见谅。但是大家可以入门 理解下。
先做到会使用就行了 ,慢慢的深入研究。会使用了 就能够运用到实际中来。 我现在比如用LSTM 来写诗句,用CNN来做训练 图像 理解。
这是运行的截图 。注意到里面的shape么 就是每一层 输入输出的NXD向量
这是结果
下面的是测试结果