C+实现神经网络之壹—Net类的设计和神经网络的初始化

闲言少叙,直接开始

既然是要用C++来实现,那么我们自然而然的想到设计一个神经网络类来表示神经网络,这里我称之为Net类。由于这个类名太过普遍,很有可能跟其他人写的程序冲突,所以我的所有程序都包含在namespace liu中,由此不难想到我姓刘。在之前的博客反向传播算法资源整理中,我列举了几个比较不错的资源。对于理论不熟悉而且学习精神的同学可以出门左转去看看这篇文章的资源。这里假设读者对于神经网络的基本理论有一定的了解。

神经网络要素

在真正开始coding之前还是有必要交代一下神经网络基础,其实也就是设计类和写程序的思路。简而言之,神经网络的包含几大要素:

神经元节点

层(layer)

权值(weights)

偏置项(bias)

神经网络的两大计算过程分别是前向传播和反向传播过程。每层的前向传播分别包含加权求和(卷积?)的线性运算和激活函数的非线性运算。反向传播主要是用BP算法更新权值。 虽然里面还有很多细节,但是对于作为第一篇的本文来说,以上内容足够了。

Net类——基于Mat

神经网络中的计算几乎都可以用矩阵计算的形式表示,这也是我用OpenCV的Mat类的原因之一,它提供了非常完善的、充分优化过的各种矩阵运算方法;另一个原因是我最熟悉的库就是OpenCV......有很多比较好的库和框架在实现神经网络的时候会用很多类来表示不同的部分。比如Blob类表示数据,Layer类表示各种层,Optimizer类来表示各种优化算法。但是这里没那么复杂,主要还是能力有限,只用一个Net类表示神经网络。

还是直接让程序说话,Net类包含在Net.h中,大致如下:

这不是完整的形态,只是对应于本文内容的一个简化版,简化之后看起来更加清晰明了。

成员变量与成员函数

现在Net类只有四个成员变量,分别是:

每一层神经元数目(layerneuronnum)

层(layer)

权值矩阵(weights)

偏置项(bias)

权值用矩阵表示就不用说了,需要说明的是,为了计算方便,这里每一层和偏置项也用Mat表示,每一层和偏置都用一个单列矩阵来表示。

Net类的成员函数除了默认的构造函数和析构函数,还有:

initNet():用来初始化神经网络

initWeights():初始化权值矩阵,调用initWeight()函数

initBias():初始化偏置项

forward():执行前向运算,包括线性运算和非线性激活,同时计算误差

backward():执行反向传播,调用updateWeights()函数更新权值。

这些函数已经是神经网络程序核心中的核心。剩下的内容就是慢慢实现了,实现的时候需要什么添加什么,逢山开路,遇河架桥。

神经网络初始化——initNet()函数

先说一下initNet()函数,这个函数只接受一个参数——每一层神经元数目,然后借此初始化神经网络。这里所谓初始化神经网络的含义是:生成每一层的矩阵、每一个权值矩阵和每一个偏置矩阵。听起来很简单,其实也很简单。

实现代码在Net.cpp中:

这里生成各种矩阵没啥难点,唯一需要留心的是权值矩阵的行数和列数的确定。值得一提的是这里把权值默认全设为0。

权值初始化——initNet()函数

权值初始化函数initWeights()调用initWeight()函数,其实就是初始化一个和多个的区别。

偏置初始化是给所有的偏置赋相同的值。这里用Scalar对象来给矩阵赋值。

至此,神经网络需要初始化的部分已经全部初始化完成了。

初始化测试

我们可以用下面的代码来初始化一个神经网络,虽然没有什么功能,但是至少可以测试下现在的代码是否有BUG:

亲测没有问题。

本文先到这里,前向传播和反向传播放在下一篇内容里面。所有的代码都已经托管在Github上面,感兴趣的可以去下载查看。欢迎提意见。

源码链接

回复“神经网络”获取神经网络源码的Github链接。

继续送书!

圣诞的时候送的三本书已经发出,而且其中的两人已经收到,路途较远的那个还在路上。当时主页君原话是这样的:

由于准备仓促,此次赠书数量不多,不过以后还有机会,主页君会为大家多多争取。大家一起努力,大家越给力,主页君越有底气。

是的,上次送了三本,但是大家很不过瘾,主页君说了会为大家多多争取的!这次主页君蒙电子工业出版社赞助,为大家准备了6个三本:包含OpenCV类书籍四本,机器学习类书籍两本,每本书送出三份,一共十八个名额。这六种书籍都是干货满满的书籍。这六种书分别是:

《OpenCV3编程入门》

《OpenCV算法精解:基于Python与C++》

《OpenCV编程案例详解》

《OpenCV图像处理编程实例》

《机器学习——Python实践》

《机器学习之路——Caffe、Keras、scikit-learn实战》

本次神经网络系列一共六篇,每篇送出一种书,三本。六种书的介绍可以出门左转看到。

今天要送的书

我们先介绍下今天要送出的第一本书籍,毛星云大神的《OpenCV3编程入门》。这本书就在我桌上放着(之后的两本也在我桌上放着,我桌上同时还有几本这里没有的几本OpenCV书籍),是我当年学习OpenCV的入门书,也是我最近仍经常翻看当文档查的一本书。这本书非常适合有一定C++基础的人入门OpenCV,讲解非常细致,从安装到各种图像处理基础到特征提取等,非常细致,而且对于OpenCV2与OpenCV3的变化也都给出了不同的代码。这是我最推荐入门的一本书。适合入门,也适合作为文档查阅,所以放在第一篇介绍。我觉得学习OpenCV的人大部分应该都见过或者手头就有这本书。长下面这样:

书籍简介

OpenCV在计算机视觉领域扮演着重要的角色。作为一个基于开源发行的跨平台计算机视觉库,OpenCV实现了图像处理和计算机视觉方面的很多通用算法。《OpenCV3编程入门》以当前最新版本的OpenCV最常用最核心的组件模块为索引,深入浅出地介绍了OpenCV2和OpenCV3中的强大功能、性能,以及新特性。

书本配套的OpenCV2和OpenCV3双版本的示例代码包中,含有总计两百多个详细注释的程序源代码与思路说明。读者可以按图索骥,按技术方向进行快速上手和深入学习。

本文来自企鹅号 - CVPy媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据科学与人工智能

【开源工具】国外程序员整理的机器学习资源大全

本列表选编了一些机器学习领域牛B的框架、库以及软件(按编程语言排序)。 C++ 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 ...

3989
来自专栏IT派

用python怎样识别验证码?(含源码)

验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。本文介绍了一套...

5360
来自专栏架构之路

蓄水池抽样-Reservoir Sampling

 英文原文:hadoop-stratified-randosampling-algorithm         译者:bruce-accumulate    ...

3363
来自专栏专知

机器翻译新时代:Facebook 开源无监督机器翻译模型和大规模训练语料

【导读】基于深度学习的机器翻译往往需要数量非常庞大的平行语料,这一前提使得当前最先进的技术无法被有效地用于那些平行语料比较匮乏的语言之间。为了解决这一问题,Fa...

59511
来自专栏ATYUN订阅号

【教程】OpenCV—Node.js教程系列:Node.js+OpenCV面部脸识别

最近我将OpenCV普通发布版本设计的面部识别算法添加到了opencv4nodejs,它是一个npm包,允许你在Node.js应用程序中使用OpenCV。今天,...

7568
来自专栏机器之心

教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏

本教程面向所有对强化学习感兴趣的人,不会涉及太深的机器学习基础,但主题中涵盖了高级策略网络和价值网络的相关知识。此外,我建议阅读 Voldymyr Mnih 的...

1773
来自专栏专知

100个GitHub Star数上升最快的深度学习开源项目

截止7月18日,Star数上升最快(与6月10日相比)的100个GitHub Star数上升最快的深度学习开源项目,按Star数排序。

1333
来自专栏CDA数据分析师

史上最全!国外程序员整理的机器学习资源

本文汇编了一些机器学习领域的框架、库以及软件(按编程语言排序)。 C++ 计算机视觉 CCV —基于C语言/提供缓存/核心的机器视觉库,新颖的机器视觉库 Ope...

26110
来自专栏量子位

AI跟Bob Ross学画画,杂乱色块秒变风景油画 | PyTorch教程+代码

王新民 编译整理 量子位 出品 | 公众号 QbitAI 正在研究机器学习的全栈码农Dendrick Tan在博客上发布了一份教程+代码:用PyTorch实现将...

3765
来自专栏用户2442861的专栏

深度学习caffe的代码怎么读?

作者:Gein Chen 链接:https://www.zhihu.com/question/27982282/answer/80242005 来源:知乎 ...

3151

扫码关注云+社区

领取腾讯云代金券