opencv实现ann mlp(多层感知机)识别手写数字 二

看了文档自带的neuron network的例子。马上来实现一下自己的。
素材选取vs2019 opencv410 c++ ,mnist_train.csv(60000个手写数字)、mnist_test_10.csv(10个手写字符)。

先做个简单版本,所以流程很简单:读取数据(训练数据和标签),设计模型,训练,用模型预测,保存和读取模型。

  1. 读取数据
    mnist数据集的图片是28*28的。这也决定mlp第一层有784个神经元。
    解析csv文件中的图片。读取10000个手写字符,一个数字占据向量的一行。最后得到10000行784列的矩阵。对应的标签则是10000行10列的矩阵。他们的截图如下:上面是标签,下面是训练数据。
    opencv实现ann mlp(多层感知机)识别手写数字 二_第1张图片

opencv实现ann mlp(多层感知机)识别手写数字 二_第2张图片
标签中第几列为1(我设为0.99),就表示数字几,一行只有一个1(0.99).其余的都是0(我设为0.01);将一行训练数据resize的结果并显示如下,显然,能看出数据并没有读取错误

opencv实现ann mlp(多层感知机)识别手写数字 二_第3张图片

  1. 设计网络、训练、预测
    问题比较简单,直接用常见的mlp结构吧。3层,input:784,hidden:20,output:10;这是参考学习的结果,当然,其他的也是可行的。
    训练的流程和上一篇的例子代码中的过程一样,这里不在贴了,值得注意的是,参数要自己更改一下,如:训练权重系数和动量系数。这些参数怎么调,哪组好,这就是另一个问题了。
    训练,我设置了循环5次。
    实际训练图6万张,限于设备我取了1一万,训练5轮。这样几分钟就可以训练完成
    预测也是照着上一篇的代码来就行了。
    贴个预测结果的例子。第七个数值最高,表示网络认为输入的这个数值是7
    opencv实现ann mlp(多层感知机)识别手写数字 二_第4张图片
  2. 模型的保存和载入
    保存,
string model_path = "model.xml";
network->save(model_path);

载入训练好的模型.

network = cv::Algorithm::load("model.xml");

代码基本和上一篇例子代码差不多。非常简单的,得到的模型识别率不高。但是几分钟得到一个90%正确率以上的模型,而且错误识别的都是些奇葩,我觉得也可以接受吧。
贴一些结果
。这个4被正确识别了。
opencv实现ann mlp(多层感知机)识别手写数字 二_第5张图片
opencv实现ann mlp(多层感知机)识别手写数字 二_第6张图片
这个图是9的识别结果
opencv实现ann mlp(多层感知机)识别手写数字 二_第7张图片
opencv实现ann mlp(多层感知机)识别手写数字 二_第8张图片

最后贴一个没识别出来的例子
opencv实现ann mlp(多层感知机)识别手写数字 二_第9张图片
opencv实现ann mlp(多层感知机)识别手写数字 二_第10张图片
算了吧,这识别不出了我也可以接受,谁让只花了3分钟训练呢

你可能感兴趣的:(深度学习,opencv4,opencv,深度学习,神经网络)