在上一篇的结尾提到了神经网络的预测函数predict(),说道predict调用了forward函数并进行了输出的解析,输出我们看起来比较方便的值。
神经网络的预测函数predict()
函数和函数的区别相信很容易从名字看出来,那就是输入一个样本得到一个输出和输出一组样本得到一组输出的区别,显然应该是循环调用实现的。所以我们先看一下的代码:
可以在第二个if语句里面看到最主要的内容就是两行:
分别是前面提到的前向传播和输出解析。
前向传播得到最后一层输出层layerout,然后从layerout中提取最大值的位置,最后输出位置的y坐标。
输出的组织方式和解析
之所以这么做,就不得不提一下标签或者叫目标值在这里是以何种形式存在的。以激活函数是sigmoid函数为例,sigmoid函数是把实数映射到[0,1]区间,所以显然最后的输出y:0
这里采用的方案是,把输出层设置为一个单列十行的矩阵,标签是几就把第几行的元素设置为1,其余都设为0。由于编程中一般都是从0开始作为第一位的,所以位置与0-9的数字正好一一对应。我们到时候只需要找到输出最大值所在的位置,也就知道了输出是几。
当然上面说的是激活函数是sigmoid的情况。如果是tanh函数呢?那还是是几就把第几位设为1,而其他位置全部设为-1即可。
如果是ReLU函数呢?ReLU函数的至于是0到正无穷。所以我们可以标签是几就把第几位设为几,其他为全设为0。最后都是找到最大值的位置即可。
这些都是需要根据激活函数来定。代码中是调用opencv的函数来寻找矩阵中最大值的位置。
输入的组织方式和读取方法
既然说到了输出的组织方式,那就顺便也提一下输入的组织方式。生成神经网络的时候,每一层都是用一个单列矩阵来表示的。显然第一层输入层就是一个单列矩阵。所以在对数据进行预处理的过程中,这里就是把输入样本和标签一列一列地排列起来,作为矩阵存储。标签矩阵的第一列即是第一列样本的标签。以此类推。
值得一提的是,输入的数值全部归一化到0-1之间。
由于这里的数值都是以类型保存的,这种数值的矩阵Mat不能直接保存为图片格式,所以这里我选择了把预处理之后的样本矩阵和标签矩阵保存到xml文档中。在源码中可以找到把原始的csv文件转换成xml文件的代码。在中。而我转换完成的MNIST的部分数据保存在data文件夹中,可以在Github上找到。
在opencv中xml的读写非常方便,如下代码是写入数据:
而读取代码的一样简单明了:
我写了一个函数从xml文件中从指定的列开始提取一定数目的样本和标签。默认从第0列开始读取,只是上面函数的简单封装:
至此其实已经可以开始实践,训练神经网络识别手写数字了。只有一部分还没有提到,那就是模型的保存和加载。下一篇将会讲模型的save和load,然后就可以实际开始进行例子的训练了。等不及的小伙伴可以直接去github下载完整的程序开始跑了。
源码链接
回复“神经网络”获取神经网络源码的Github链接。
你们不要看到送书就忽略代码了,一边读书一边调代码,理论与实践并重才是王道啊。
继续送书!
圣诞送的三本书已经全部抵达幸运小伙伴的手中。而且本期送书活动的前两本书的三个名额的结果也已经揭晓,出门左转即可看到。
上次主页君原话是这样的:
由于准备仓促,此次赠书数量不多,不过以后还有机会,主页君会为大家多多争取。大家一起努力,大家越给力,主页君越有底气。
是的,上次送了三本,但是大家很不过瘾,主页君说了会为大家多多争取的!这次主页君蒙电子工业出版社赞助,为大家准备了6个三本:包含OpenCV类书籍四本,机器学习类书籍两本,每本书送出三份,一共十八个名额。这六种书籍都是干货满满的书籍。这六种书分别是:
《OpenCV3编程入门》
《OpenCV算法精解:基于Python与C++》
《OpenCV编程案例详解》
《OpenCV图像处理编程实例》
《机器学习——Python实践》
《机器学习之路——Caffe、Keras、scikit-learn实战》
本次神经网络系列一共六篇,每篇送出一种书,三本。六种书的介绍也可以出门左转看到。今天送出我们的第四个三本。
后面几本书主页君就没看过了,所以木有“主页君书评”。
今天要送的书
OpenCV图像处理编程实例
本文来自企鹅号 - CVPy媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - CVPy媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。