Caffe中计算图像均值的实现(cifar10)
在深度学习中,在进行test时经常会减去train数据集的图像均值,这样做的好处是:属于数据预处理中的数据归一化,降低数据间相似性,可以将数值调整到一个合理的范围。
以下code是用于计算cifar10中训练集的图像均值:
#include "funset.hpp"
#include <string>
#include <vector>
#include <map>
#include "common.hpp"int campute_image_mean(const std::string& db_type, const std::string& db_path, std::vector<float>& image_mean)
{
#ifdef CPU_ONLYcaffe::Caffe::set_mode(caffe::Caffe::CPU);
#elsecaffe::Caffe::set_mode(caffe::Caffe::GPU);
#endif// reference: caffe/tools/compute_image_mean.cppboost::scoped_ptr<caffe::db::DB> db(caffe::db::GetDB(db_type));db->Open(db_path, caffe::db::READ);boost::scoped_ptr<caffe::db::Cursor> cursor(db->NewCursor());caffe::BlobProto sum_blob;int count = 0;// load first datumcaffe::Datum datum;datum.ParseFromString(cursor->value());caffe::DecodeDatumNative(&datum);sum_blob.set_num(1);sum_blob.set_channels(datum.channels());sum_blob.set_height(datum.height());sum_blob.set_width(datum.width());const int data_size = datum.channels() * datum.height() * datum.width();int size_in_datum = std::max<int>(datum.data().size(), datum.float_data_size());for (int i = 0; i < size_in_datum; ++i) {sum_blob.add_data(0.);}// Starting Iterationwhile (cursor->valid()) {caffe::Datum datum2;datum2.ParseFromString(cursor->value());caffe::DecodeDatumNative(&datum2);const std::string& data = datum2.data();size_in_datum = std::max<int>(datum2.data().size(), datum2.float_data_size());if (size_in_datum != data_size) {fprintf(stderr, "incorrect data field size: size_in_datum: %d, data_size: %d\n",size_in_datum, data_size);return -1;}if (data.size() != 0) {if (data.size() != size_in_datum) {fprintf(stderr, "data.size() != size_in_datum: data.size: %d, size_in_datum: %d\n",data.size(), size_in_datum);return -1;}for (int i = 0; i < size_in_datum; ++i) {sum_blob.set_data(i, sum_blob.data(i) + (uint8_t)data[i]);}} else {if (datum2.float_data_size() != size_in_datum) {fprintf(stderr, "datum.float_data_size() != size_in_datum: datum.float_data_size: %d, size_in_datum: %d",datum2.float_data_size(), size_in_datum);return -1;}for (int i = 0; i < size_in_datum; ++i) {sum_blob.set_data(i, sum_blob.data(i) + static_cast<float>(datum2.float_data(i)));}}++count;if (count % 10000 == 0) {fprintf(stderr, "Processed: %d files\n", count);}cursor->Next();}if (count % 10000 != 0) {fprintf(stderr, "Processed: %d files\n", count);}for (int i = 0; i < sum_blob.data_size(); ++i) {sum_blob.set_data(i, sum_blob.data(i) / count);}const int channels = sum_blob.channels();const int dim = sum_blob.height() * sum_blob.width();image_mean.resize(channels, 0.0);fprintf(stderr, "Number of channels: %d", channels);for (int c = 0; c < channels; ++c) {for (int i = 0; i < dim; ++i) {image_mean[c] += sum_blob.data(dim * c + i);}image_mean[c] /= dim;}fprintf(stderr, "\n");return 0;
}int cifar10_compute_image_mean()
{const std::string db_type{ "lmdb" };const std::string db_path{ "E:/GitCode/Caffe_Test/test_data/cifar10/cifar10_train_lmdb" };std::vector<float> image_mean;if (campute_image_mean(db_type, db_path, image_mean) != 0) {fprintf(stderr, "compute image mean fail\n");return -1;}fprintf(stderr, "image mean:");for (const auto& value : image_mean) {fprintf(stderr, " %f ", value);}fprintf(stderr, "\n");return 0;
}
执行结果如下:GitHub:https://github.com/fengbingchun/Caffe_Test
相关文章:

阿里云弹性公网IP(EIP)的使用限制
阿里云弹性公网IP(EIP)是一种可以独立购买和持有的公网IP地址资源,弹性公网IP具有独立购买持有、弹性绑定和配置灵活等优势,但实际使用中弹性公网IP也是有很多限制的,阿里云惠网分享弹性公网IP(EIP…

400名微软员工主动曝光薪资:28万元到228万元不等!
作者 | Dave Gershgorn译者 | 弯月,编辑 | 郭芮来源 | CSDN(ID:CSDNnews)【导读】近日,近400名微软员工分享了他们的薪酬(从4万美元到32万美元不等,约为28万人民币到228万人民币)&am…

Extjs:添加查看全部按钮
var grid new Ext.grid.GridPanel({renderTo:tsllb,title:产品成本列表,selModel:csm,height:350,columns:[csm,{header: "编码", dataIndex: "bm", sortable: true,hidden:true},{header: "产品", dataIndex: "cp", sortable: true},…

练手扎实基本功必备:非结构文本特征提取方法
作者 | Dipanjan (DJ) Sarkar编译 | ronghuaiyang来源 | AI公园(ID:AI_Paradise)【导读】本文介绍了一些传统但是被验证是非常有用的,现在都还在用的策略,用来对非结构化的文本数据提取特征。介绍在本文中,我们将研究如…
范数介绍及C++/OpenCV/Eigen的三种实现
有时我们需要衡量一个向量的大小。在机器学习中,我们经常使用被称为范数(norm)的函数衡量向量大小。形式上,Lp范数定义如下:范数(包括Lp范数)是将向量映射到非负值的函数。直观上来说,向量x的范数衡量从原点到点x的距离。更严格地…

js添加网页水印和three.js场景中加水印
我们在日常网页开发的时候,可能想给自己的网页或者canvas里面添加水印,增添个人标记,我这里分为普通静态html页面和threejs中3d场景里面添加水印功能。一 静态html页面添加水印你只需要在你的页面添加一个图片遮罩,通过绝对定位和…

JAVA学习笔记(6)
关于多线程的优先级,这个程序里面,现在计算机比较好,int存储不下了,我跑了好几次都是负分,特把int改成long。但是之后跑出来的结果,两个数字都差不多,不知道是什么问题?等待答案中。…

C++/C++11中std::deque的使用
std::deque是双端队列,可以高效的在头尾两端插入和删除元素,在std::deque两端插入和删除并不会使其它元素的指针或引用失效。在接口上和std::vector相似。与sdk::vector相反,std::deque中的元素并非连续存储:典型的实现是使用一个…

贾扬清:我对人工智能方向的一点浅见
阿里妹导读:作为 AI 大神,贾扬清让人印象深刻的可能是他写的AI框架Caffe ,那已经是六年前的事了。经过多年的沉淀,成为“阿里新人”的他,对人工智能又有何看法?最近,贾扬清在阿里内部分享了他的…

吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)2019 年9 月 5 日至 7 日,由新一代人工智能产业技术创新战略联盟(AITISA)指导,鹏城实验室、北京智源人工智能研究院支持,专业中文 IT 技术社区 CS…

Linux内核--网络栈实现分析(二)--数据包的传递过程--转
转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”…

C++/C++11中std::stack的使用
栈stack 是一个容器适配器(container adaptor)类型,被特别设计用来运行于LIFO(Last-in First-out,后进先出)场景,在该场景中,只能从容器末尾添加和删除元素,其定义在stack头文件中。stack默认基于std::deque实现&#…

团队前四次作业——个人总结
团队前四次作业——个人总结 描述 团队名称待就业六人组相关团队第四次作业答辩——反思与总结做了哪些事?工作量、完成度 作业负责工作量完成度团队队员展示创意合照后期1h95%项目选题报告编写创新和收益部分2h85%项目原型设计原型设计6h95%需求规格说明书功能需求…

吴甘沙:天外飞“厕”、红绿灯消失,未来无人驾驶将被重新定义 | AI ProCon 2019
2019 年9 月 5 日至 7 日,由新一代人工智能产业技术创新战略联盟(AITISA)指导,鹏城实验室、北京智源人工智能研究院支持,专业中文 IT 技术社区 CSDN 主办的 2019 中国 AI 开发者大会(AI ProCon 2019&#x…

MySQL基础day03_数据的导入、导出-MySQL 5.6
MySQL基础day03_数据的导入、导出-MySQL 5.6注:把数据按照一定格式存放到文件里才能进行数据的导入。1,数据导入的条件把文件里的内容保存到数据的表里;把数据按照一定格式存放文件里;注:默认情况下,只有管…
“含光”剑出,谁与争锋?阿里重磅发布首颗AI芯片含光800
作者 | 夕颜、胡巍巍 编辑 | 唐小引 出品 | AI 科技大本营(ID:rgznai100) 9 月末的杭州气温适宜,宜出游,宜在湖边餐厅浅酌一杯清茶消闲。但在钱塘江水支流河畔的云栖小镇,却完全一副与闲适氛围不相称的热闹景象。 …

c++面试题中经常被面试官面试的小问题总结(一)(本篇偏向基础知识)
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/10711810.html 1.类中的函数定义后加了一个const代表什么? 代表它将具备以下三个性质:1.const对象只能调用const成员函数。2.const对象的值不能被修改,在…
矩阵特征分解介绍及雅克比(Jacobi)方法实现特征值和特征向量的求解(C++/OpenCV/Eigen)
对角矩阵(diagonal matrix):只在主对角线上含有非零元素,其它位置都是零,对角线上的元素可以为0或其它值。形式上,矩阵D是对角矩阵,当且仅当对于所有的i≠j, Di,j 0. 单位矩阵就是对角矩阵,对角元素全部是1…
Entity Framework CodeFirst数据迁移
原文:Entity Framework CodeFirst数据迁移前言 紧接着前面一篇博文Entity Framework CodeFirst尝试。 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Code First如何更新已有的模型呢&…
限时早鸟票 | 2019 中国大数据技术大会(BDTC)超豪华盛宴抢先看!
2019 年12月5-7 日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑数据科技股份有限公司协办的 2019 中国大数据技术大会,将于北京长城饭店隆重举行。届时,超过百位技术专家及行业领袖将齐聚于此&…

Google AI 系统 DeepMind无法通过 高中数学
Google 旗下 DeepMind 团队让 AI 系统接受一项高中程度的数学测试,结果在 40 道题目中只答对了 14 题,甚至连「1111111」也算错了。说来难以置信,Google AI 系统能打败人类世界棋王,却无法通过高中程度的数学考试。上周࿰…

C++11中std::tuple的使用
std::tuple是类似pair的模板。每个pair的成员类型都不相同,但每个pair都恰好有两个成员。不同std::tuple类型的成员类型也不相同,但一个std::tuple可以有任意数量的成员。每个确定的std::tuple类型的成员数目是固定的,但一个std::tuple类型的…

PHP Countable接口
实现该接口可以使用count()方法来获取集合的总数转载于:https://www.cnblogs.com/xiaodo0/p/3611307.html
矩阵奇异值分解简介及C++/OpenCV/Eigen的三种实现
奇异值分解(singular value decomposition, SVD):将矩阵分解为奇异向量(singular vector)和奇异值(singular value)。通过奇异值分解,我们会得到一些与特征分解相同类型的信息。然而,奇异值分解有更广泛的应用。每个实数矩阵都有一个奇异值分…

经典!工业界深度推荐系统与CTR预估必读的论文汇总
(图片付费下载自视觉中国)来源 | 深度传送门(ID: gh_5faae7b50fc5)导读:本文是“深度推荐系统”专栏的第十一篇文章,这个系列将介绍在深度学习的强力驱动下,给推荐系统工业界所带来的最前沿的变…

docker上传自己的镜像
https://blog.csdn.net/boonya/article/details/74906927 需要注意的就是命名规范 docker push 注册用户名/镜像名 tag命令修改为规范的镜像: docker tag boonya/tomcat-allow-remote boonyadocker/tomcat-allow-remote转载于:https://www.cnblogs.com/MC-Curry/p/1…

多个class相同的input标签 获取当前值!方法!
2019独角兽企业重金招聘Python工程师标准>>> var a $(this).prev( ".你的class" ).val(); 转载于:https://my.oschina.net/u/1169079/blog/210082

C++11中std::forward_list单向链表的使用
std::forward_list是在C11中引入的单向链表或叫正向列表。forward_list具有插入、删除表项速度快、消耗内存空间少的特点,但只能向前遍历。与其它序列容器(array、vector、deque)相比,forward_list在容器内任意位置的成员的插入、提取(extracting)、移动…

即学即用的30段Python实用代码
(图片付费下载自视觉中国)原标题 | 30 Helpful Python Snippets That You Can Learn in 30 Seconds or Less作 者 | Fatos Morina翻 译 | Pita & AI开发者Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自…

如何配置IntelliJ IDEA发布JavaEE项目?
一、以war的形式运行项目 步骤1 新建或者导入项目后,选择File菜单-》Project Structure...,如下图: 步骤2 配置项目类型,名字可以自定义: 说明:这里的Artifact如果没有配置好的话,配置Tomcat时没…