当前位置: 首页 > 编程日记 > 正文

tiny-cnn开源库的使用(MNIST)

tiny-cnn是一个基于CNN的开源库,它的License是BSD 3-Clause。作者也一直在维护更新,对进一步掌握CNN很有帮助,因此下面介绍下tiny-cnn在windows7 64bit vs2013的编译及使用。

1.      从https://github.com/nyanp/tiny-cnn下载源码:

$ git clone https://github.com/nyanp/tiny-cnn.git  版本号为77d80a8,更新日期2016.01.22

2.      源文件中已经包含了vs2013工程,vc/tiny-cnn.sln,默认是win32的,examples/main.cpp需要OpenCV的支持,这里新建一个x64的控制台工程tiny-cnn;

3.      仿照源工程,将相应.h文件加入到新控制台工程中,新加一个test_tiny-cnn.cpp文件;

4.      将examples/mnist中test.cpp和train.cpp文件中的代码复制到test_tiny-cnn.cpp文件中;

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <tiny_cnn/tiny_cnn.h>
#include <opencv2/opencv.hpp>using namespace tiny_cnn;
using namespace tiny_cnn::activation;// rescale output to 0-100
template <typename Activation>
double rescale(double x)
{Activation a;return 100.0 * (x - a.scale().first) / (a.scale().second - a.scale().first);
}void construct_net(network<mse, adagrad>& nn);
void train_lenet(std::string data_dir_path);
// convert tiny_cnn::image to cv::Mat and resize
cv::Mat image2mat(image<>& img);
void convert_image(const std::string& imagefilename, double minv, double maxv, int w, int h, vec_t& data);
void recognize(const std::string& dictionary, const std::string& filename, int target);int main()
{//trainstd::string data_path = "D:/Download/MNIST";train_lenet(data_path);//teststd::string model_path = "D:/Download/MNIST/LeNet-weights";std::string image_path = "D:/Download/MNIST/";int target[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };for (int i = 0; i < 10; i++) {char ch[15];sprintf(ch, "%d", i);std::string str;str = std::string(ch);str += ".png";str = image_path + str;recognize(model_path, str, target[i]);}std::cout << "ok!" << std::endl;return 0;
}void train_lenet(std::string data_dir_path) {// specify loss-function and learning strategynetwork<mse, adagrad> nn;construct_net(nn);std::cout << "load models..." << std::endl;// load MNIST datasetstd::vector<label_t> train_labels, test_labels;std::vector<vec_t> train_images, test_images;parse_mnist_labels(data_dir_path + "/train-labels.idx1-ubyte",&train_labels);parse_mnist_images(data_dir_path + "/train-images.idx3-ubyte",&train_images, -1.0, 1.0, 2, 2);parse_mnist_labels(data_dir_path + "/t10k-labels.idx1-ubyte",&test_labels);parse_mnist_images(data_dir_path + "/t10k-images.idx3-ubyte",&test_images, -1.0, 1.0, 2, 2);std::cout << "start training" << std::endl;progress_display disp(train_images.size());timer t;int minibatch_size = 10;int num_epochs = 30;nn.optimizer().alpha *= std::sqrt(minibatch_size);// create callbackauto on_enumerate_epoch = [&](){std::cout << t.elapsed() << "s elapsed." << std::endl;tiny_cnn::result res = nn.test(test_images, test_labels);std::cout << res.num_success << "/" << res.num_total << std::endl;disp.restart(train_images.size());t.restart();};auto on_enumerate_minibatch = [&](){disp += minibatch_size;};// trainingnn.train(train_images, train_labels, minibatch_size, num_epochs,on_enumerate_minibatch, on_enumerate_epoch);std::cout << "end training." << std::endl;// test and show resultsnn.test(test_images, test_labels).print_detail(std::cout);// save networksstd::ofstream ofs("D:/Download/MNIST/LeNet-weights");ofs << nn;
}void construct_net(network<mse, adagrad>& nn) {// connection table [Y.Lecun, 1998 Table.1]
#define O true
#define X falsestatic const bool tbl[] = {O, X, X, X, O, O, O, X, X, O, O, O, O, X, O, O,O, O, X, X, X, O, O, O, X, X, O, O, O, O, X, O,O, O, O, X, X, X, O, O, O, X, X, O, X, O, O, O,X, O, O, O, X, X, O, O, O, O, X, X, O, X, O, O,X, X, O, O, O, X, X, O, O, O, O, X, O, O, X, O,X, X, X, O, O, O, X, X, O, O, O, O, X, O, O, O};
#undef O
#undef X// construct netsnn << convolutional_layer<tan_h>(32, 32, 5, 1, 6)  // C1, 1@32x32-in, 6@28x28-out<< average_pooling_layer<tan_h>(28, 28, 6, 2)   // S2, 6@28x28-in, 6@14x14-out<< convolutional_layer<tan_h>(14, 14, 5, 6, 16,connection_table(tbl, 6, 16))              // C3, 6@14x14-in, 16@10x10-in<< average_pooling_layer<tan_h>(10, 10, 16, 2)  // S4, 16@10x10-in, 16@5x5-out<< convolutional_layer<tan_h>(5, 5, 5, 16, 120) // C5, 16@5x5-in, 120@1x1-out<< fully_connected_layer<tan_h>(120, 10);       // F6, 120-in, 10-out
}void recognize(const std::string& dictionary, const std::string& filename, int target) {network<mse, adagrad> nn;construct_net(nn);// load netsstd::ifstream ifs(dictionary.c_str());ifs >> nn;// convert imagefile to vec_tvec_t data;convert_image(filename, -1.0, 1.0, 32, 32, data);// recognizeauto res = nn.predict(data);std::vector<std::pair<double, int> > scores;// sort & print top-3for (int i = 0; i < 10; i++)scores.emplace_back(rescale<tan_h>(res[i]), i);std::sort(scores.begin(), scores.end(), std::greater<std::pair<double, int>>());for (int i = 0; i < 3; i++)std::cout << scores[i].second << "," << scores[i].first << std::endl;std::cout << "the actual digit is: " << scores[0].second << ", correct digit is: "<<target<<std::endl;// visualize outputs of each layer//for (size_t i = 0; i < nn.depth(); i++) {//	auto out_img = nn[i]->output_to_image();//	cv::imshow("layer:" + std::to_string(i), image2mat(out_img));//}visualize filter shape of first convolutional layer//auto weight = nn.at<convolutional_layer<tan_h>>(0).weight_to_image();//cv::imshow("weights:", image2mat(weight));//cv::waitKey(0);
}// convert tiny_cnn::image to cv::Mat and resize
cv::Mat image2mat(image<>& img) {cv::Mat ori(img.height(), img.width(), CV_8U, &img.at(0, 0));cv::Mat resized;cv::resize(ori, resized, cv::Size(), 3, 3, cv::INTER_AREA);return resized;
}void convert_image(const std::string& imagefilename,double minv,double maxv,int w,int h,vec_t& data) {auto img = cv::imread(imagefilename, cv::IMREAD_GRAYSCALE);if (img.data == nullptr) return; // cannot open, or it's not an imagecv::Mat_<uint8_t> resized;cv::resize(img, resized, cv::Size(w, h));// mnist dataset is "white on black", so negate requiredstd::transform(resized.begin(), resized.end(), std::back_inserter(data),[=](uint8_t c) { return (255 - c) * (maxv - minv) / 255.0 + minv; });
}

5.      编译时会提示几个错误,解决方法是:

(1)、error C4996,解决方法:将宏_SCL_SECURE_NO_WARNINGS添加到属性的预处理器定义中;

(2)、调用for_函数时,error C2668,对重载函数的调用不明教,解决方法:将for_中的第三个参数强制转化为size_t类型;

6.      运行程序,train时,运行结果如下图所示:


7.      对生成的model进行测试,通过画图工具,每个数字生成一张图像,共10幅,如下图:


通过导入train时生成的model,对这10张图像进行识别,识别结果如下图,其中6和9被误识为5和1:


GitHub:https://github.com/fengbingchun/NN

相关文章:

玩嗨的2亿快手“老铁”和幕后的极致视觉算法

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;创立八年&#xff0c;短视频平台快手目前已经有超过两亿人在每天登陆使用&#xff0c;每天还有超过 1500 万条短视频被制作和上传&#xff0c;每天的累计观看数更是达到 150 亿。拥有如此庞大的用户数&…

lsmod命令详解

基础命令学习目录首页 原文链接&#xff1a;http://blog.sina.com.cn/s/blog_e6b2465d0101fuev.html lsmod——显示已载入系统的模块 lsmod 其实就是list modules的缩写&#xff0c;即 列出所有模块. 功能说明&#xff1a;显示已载入系统的模块。 语法&#xff1a;lsmod 说明&a…

javascript模块化、模块加载器初探

最常见网站的javascript架构可能是这样的&#xff1a; 一个底层框架文件&#xff0c;如jQuery一个网站业务框架文件&#xff0c;包含整站公用业务模块类(如弹框、ajax封装等)多个业务文件&#xff0c;包含每个具体页面有关系的业务代码为了减少一个HTTP请求&#xff0c;我们可能…

tiny-cnn执行过程分析(MNIST)

在http://blog.csdn.net/fengbingchun/article/details/50573841中以MNIST为例对tiny-cnn的使用进行了介绍&#xff0c;下面对其执行过程进行分析&#xff1a;支持两种损失函数&#xff1a;(1)、mean squared error(均方差)&#xff1b;(2)、cross entropy(交叉熵)。在MNIST中使…

关于element的select多选选择器,数据回显的问题

关于element的select多选&#xff0c;数据回显的问题 在工作中遇到这样一个问题&#xff0c;新建表单时用element的select多选以后&#xff0c;在编辑的时候打开表单发现其他数据能正常显示&#xff0c;多选却无法正常回显。在网上找了很多后&#xff0c;终于解决了这个问题&am…

360金融发布Q2财报:净利6.92亿,同比增长114%,大数据与AI加持的科技服务是新亮点?

8月23日&#xff0c;360金融发布未经审计的2019年第二季度业绩报告。财务数据显示&#xff0c;2019年第二季度&#xff0c;360金融实现收入22.27亿元人民币&#xff0c;较2018年二季度9.79亿元增长128%&#xff1b;净利润为6.18亿元&#xff0c;而去年同期为净亏损1.42亿元&…

SPRING3.X JSON 406 和 中文乱码问题

2019独角兽企业重金招聘Python工程师标准>>> 简要 最近使用Spring3.2.3 版本 在使用 JSON message convertion 的时候&#xff0c;老是出现406 返回类型不匹配的问题&#xff0c;去网上google 了一番 也没有一个明确的说法&#xff0c;只能自己去调试。 Maven 依…

VLFeat开源库介绍及在VS2013中的编译

VLFeat是一个开源的计算机视觉算法库&#xff0c;内容主要包括feature detectors、feature extractors、k-means clustering、randomized kd-tree matching、super-pixelization。它是跨平台的&#xff0c;能够应用在Linux、Mac、Windows平台。它的License是BSD。 在VS2013中编…

人工智能写手,好用吗?

作者 | 王树义来源 | 玉树芝兰&#xff08;ID&#xff1a;nkwangshuyi&#xff09;1、印象之前给学生上课的时候&#xff0c;我介绍过利用循环神经网络&#xff0c;仿照作家风格进行创作的机器学习模型。不过&#xff0c;那模型写出来的东西嘛……我的评价是&#xff1a;望之&a…

表单系列之input number总结

各浏览器表现 <input type"number" /> chrome 除数字字符&#xff0c;只可输入e和.IE 除数字字符&#xff0c;其他字符均可输入&#xff0c;无报错Firefox 除数字字符&#xff0c;其他字符均可输入&#xff0c;但会报错移除箭头 //谷歌去除箭头 input::-webki…

Android中Service深入学习

概述 1、当用户在与当前应用程序不同的应用程序时&#xff0c;Service可以继续在后台运行。 2、Service可以让其他组件绑定&#xff0c;以便和它交互并进行进程间通信。 3、Service默认运行在创建它的应用程序的主线程中。 Service的使用主要是因为应用程序里面可能需要长时间地…

卷积神经网络(CNN)的简单实现(MNIST)

卷积神经网络(CNN)的基础介绍见http://blog.csdn.net/fengbingchun/article/details/50529500&#xff0c;这里主要以代码实现为主。CNN是一个多层的神经网络&#xff0c;每层由多个二维平面组成&#xff0c;而每个平面由多个独立神经元组成。以MNIST作为数据库&#xff0c;仿照…

Tensorflow源码解析5 -- 图的边 - Tensor

1 概述 前文两篇文章分别讲解了TensorFlow核心对象Graph&#xff0c;和Graph的节点Operation。Graph另外一大成员&#xff0c;即为其边Tensor。边用来表示计算的数据&#xff0c;它经过上游节点计算后得到&#xff0c;然后传递给下游节点进行运算。本文讲解Graph的边Tensor&…

物联网成网络安全防护新重点!

在昨天的 2019 北京网络安全大会上&#xff0c;工信部负责人表示&#xff0c;我国面向 5G 和车联网将建设网安防护体系&#xff0c;提升监测预警和应急响应能力。其中物联网设备已成为网安防护新重点。为什么工信部会这么重视物联网&#xff1f;物联网开发者的现状又是如何呢&a…

【分享】Java的几个重要词语

Java 是一种解释型语言,由SUN公司开发,基本上属于一个完全面向对象的语言&#xff0c;并且语言的设计仍然以简捷为重点。初学Java肯定会被一些名词给弄晕了&#xff0c;现在集中几个解释一下下。1、JVMJVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&…

64位Ubuntu上编译32位程序操作步骤

1. 确认主机为64位架构的内核&#xff0c;应该输出为adm64&#xff0c;执行&#xff1a;$ dpkg --print-architecture2. 确认打开了多架构支持功能&#xff0c;应该输出为i386&#xff0c;执行&#xff1a;$ dpkg --print-foreign-architectures如果没有&#xff0c;…

分布式事务中间件 Fescar—RM 模块源码解读

2019独角兽企业重金招聘Python工程师标准>>> 前言 在SOA、微服务架构流行的年代&#xff0c;许多复杂业务上需要支持多资源占用场景&#xff0c;而在分布式系统中因为某个资源不足而导致其它资源占用回滚的系统设计一直是个难点。我所在的团队也遇到了这个问题&…

二维码检测哪家强?五大开源库测评比较

作者 | 周强来源 | 我爱计算机视觉&#xff08;ID&#xff1a;aicvml&#xff09;二维码已经进入人们的日常生活中&#xff0c;尤其是日本Denso Wave公司1994年发明的QR码&#xff0c;由于其易于检测、写入信息量大、提供强大的纠错机制&#xff0c;应用最为广泛&#xff0c;可…

linux 内核 出错-HP 方案

2019独角兽企业重金招聘Python工程师标准>>> SUPPORT COMMUNICATION - CUSTOMER ADVISORY Document ID: c03456595 Version: 1 Advisory: Red Hat Enterprise Linux 6 - "P4-Clockmod: Warning: EST-Capable CPU Detected" Messages Logged in /var/log…

Windows7 64bit VS2013 Caffe test MNIST操作步骤

在http://blog.csdn.net/fengbingchun/article/details/49849225中用Caffe对MNIST数据库进行训练&#xff0c;产生了model。下面介绍下如何将产生的model应用在实际的数字图像识别中。用到的测试图像与http://blog.csdn.net/fengbingchun/article/details/50573841中相同&#…

记住这35个英文单词,你就可以在RPA界混了!

无论是想玩转RPA&#xff08;机器人流程自动化&#xff09;&#xff0c;还是有意了解、进入这项行业&#xff0c;只有先了解该领域的专有名词&#xff08;行业术语&#xff09;&#xff0c;才能为之后的活动提供更多的可能。UiBot现为您编译整理了这份机器人流程自动化术语表&a…

福利 | 送你一张通往「2019 AI开发者大会」的门票

2019 AI开发者大会(AI ProCon 2019)是由中国IT社区CSDN主办的AI技术与产业年度盛会。多年经验淬炼&#xff0c;如今蓄势待发&#xff1a;2019年9月6-7日&#xff0c;大会将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京&#xff0c;进行技术解读和产业论证。…

收缩日志文件夹

-- MSSQL2005 USE mastergo DECLARE dbname sysname;SET dbnameBSV100;-- 清空日志EXEC (DUMP TRANSACTION [dbname] WITH NO_LOG); -- 截断事务日志&#xff1a;EXEC (BACKUP LOG [dbname] WITH NO_LOG); -- 收缩数据库文件(如果不压缩,数据库的文件不会减小EXEC (DBCC SHR…

腾讯AI开源框架Angel 3.0重磅发布:超50万行代码,支持3种算法,打造全栈机器学习平台...

出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】2019年8月22日&#xff0c;腾讯首个AI开源项目Angel正式发布3.0版本。Angel 3.0尝试打造一个全栈的机器学习平台&#xff0c;功能特性涵盖了机器学习的各个阶段&#xff1a;特征工程&#xff0c;模…

路印协议受邀参加澳洲新南威尔士政府孵化器Haymarket HQ分享论坛

2019年2月15日&#xff0c;澳洲新南威尔士政府孵化器Haymarket HQ和Next Genius 社区联合举办了区块链解决方案分享论坛&#xff0c;路印协议CMO周杰受邀介绍当前交易所现状和路印协议的去中心化解决方案。参与此次论坛的还有区块链开发人员、企业家和去中心化技术爱好者&#…

一步一步指引你在Windows7上配置编译使用Caffe(https://github.com/fengbingchun/Caffe_Test)

之前写过几篇关于Caffe源码在Windows764位上配置编译及使用过程&#xff0c;只是没有把整个工程放到网上&#xff0c;最近把整个工程整理清理了下&#xff0c;把它放到了GitHub上。下面对这个工程的使用作几点说明&#xff1a;1. 整个工程Caffe在Windows7 64位VS2013下编译…

演示:思科IPS在线模式下Inline Interface Mode的响应行为(区别各个防御行为)

演示&#xff1a;思科IPS在线模式下Inline Interface Mode的响应行为演示目标&#xff1a;科IPS在线模式下InlineInterface Mode的响应行为。演示环境&#xff1a;仍然使用图5.16所示的网络环境。演示背景&#xff1a;在VLAN3的主机192.168.4.2上发起对主机192.168.4.1的漏洞扫…

【笔记】重学前端-winter

本文为&#xff1a;winter 发布在极客时间 【重学前端】系列课程的的笔记和总结支持正版哦: https://time.geekbang.org/col... 导语 如果深入进去了解&#xff0c;你会发现&#xff0c;表面上看他们可能是一时忘记了&#xff0c;或者之前没注意但实际上是他们对于前端的知识体…

如何用知识图谱挖掘商业数据背后的宝藏?

这是一个商业时代&#xff0c;一个数据为王的时代&#xff0c;也是一个 AI 迎来黄金发展期的时代。据史料记载&#xff0c;商业在商朝已初具规模。斗转星移&#xff0c;时光流转&#xff0c;到 2019 年&#xff0c;商业形式已发生翻天覆地的变化&#xff0c;但是商业的本质——…

通过define _CRTDBG_MAP_ALLOC宏来检测windows上的code是否有内存泄露

VS中自带了内存泄露检测工具&#xff0c;若要启用内存泄露检测&#xff0c;则在程序中包括以下语句&#xff1a; #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> 它们的先后顺序不能改变。通过包括 crtdbg.h&#xff0c;将malloc和free函数映射到其”Debug”版本_malloc…