Caffe学习笔记(三):Caffe数据是如何输入和输出的?

Caffe中的数据流以Blobs进行传输,在《Caffe学习笔记(一):Caffe架构及其模型解析》中已经对Blobs进行了简单的介绍。下面对caffe数据是如何输入和输出做更加详细的分析。

1、输入/输出之Blobs

caffe使用blobs结构来存储、交换并处理网络中正向和反向迭代时的数据和导数信息,blob是caffe的标准数组结构,是caffe中处理和传递实际数据的数据封装包,它提供了一个统一的内存接口,从数学意义上说,blob是按C风格连续存储的N维数组。

数据层包括输入层和输出层,数据输入层将输入转换为blob加载数据,数据输出层将blob转换为其他格式输出。

均值消去、特征缩放等基本数据处理都是在数据输入层进行配置的。新的数据格式输入需要定义新的数据层,网络的其余部分遵循caffe中层目录的模块结构设定。

2、caffe数据输入层

数据输入层一般定义在*.prototxt中,以cifar为例,就是包含在cifar10_quick_train_test.prototxt中,数据输入层可以包括带训练的数据输入和待预测数据输入。下面随机给出一个例子:

layer
{
	name: "mnist"
	type: "Data" 		# 数据层加载leveldb或lmdb的数据库存储格式保证快速传输
	top: "data" 		# 第一个顶部(top)是数据本身:“data”的命名只是方便使用
	top: "label"   		# 第二个顶部(top)是数据标签:“label”的命名只是方便使用
	# 数据层具体配置
	data_param
	{
    	source: "examples/mnist/mnist_train_lmdb"	# 数据库路径
		backend: LMDB     			# 数据库类型:LEVELDB或LMDB(LMDB支持并行读取)
		batch_size: 64  			# 批量处理,提高效率
	}
  	# 常用数据转换
	transform_param
	{
		scale: 0.00390625   			# 特征归一化系数,将范围为[0, 255]的MNIST数据归一化为[0, 1]
	}
}

需要注意的是:

(1)、对于数据输入层,数据层从top的blobs向模型输出数据,但是没有bottom的blobs,因为数据层没有输入,而是采用数据层加载的方式;

(2)、数据层至少要有一个top输出,规范化的命名为data,对于ground truth,规范化的命名为label,这两个top只是简单生成blobs,它们的命名没有任何特殊含义,只是( data,label)映射关系对于分类模型更方便而已;

(3)、在数据层的定义中,数据预处理通过转换参数来定义;

(4)、数据层通过下面语法定义该层的数据是用来训练的还是用来预测的:

include
{
        phase:TRAIN
}

include
{
        phase:TEST
}

(5)、为了提高网络吞吐量,数据层在网络计算当前数据块的同时在后台获取并准备下一个数据块;

(6)、网络可以有任意数量和类型的输入,可根据需要定义任意数量的数据层,但是必须保证它们有唯一的name和top。

3、caffe数据输出层

数据输出层是用训练出来的模型进行预测得出的结果输出层,下面给出一个实例:

layer
{
        name:"accuracy"
        type:"Accuracy"
        bottom:"ip2"
        bottom:"label"
        top:"accuracy"		#训练出来的模型预测出来的准确度

        include
        {
                 phase:TEST	#说明该输出是预测得出的输出结果
        }
}

关于caffe数据层的知识后续可结合代码做进一步的分析。

Caffe学习笔记(三):Caffe数据是如何输入和输出的?的更多相关文章

  1. MYSQL初级学习笔记三:数据的操作DML!(视频序号:初级_24,25,36)

    知识点五:数据的操作DML(24,25,36) 插入数据: --测试插入记录INSERT CREATE TABLE IF NOT EXISTS user13( id TINYINT UNSIGNED ...

  2. Python学习笔记三:数据特征分析

    完成数据清理后,下面通过图表展开对数据的分析. 1.前期初判(分布分析): 1)判断分组区间: # a.散点图:plt.scatter(data[字段1],data['字段2'], s = data[ ...

  3. 《手把手教你学C语言》学习笔记(7)---程序的输入与输出

    程序设计中,为了观察程序的运行状态和结构,需要输出指定的内容:为了让程序能够更加灵活,可以根据需求输入内容,让计算机处理和运行:所以程序的输入输出就显的尤为重要.主要包括printf和scanf函数. ...

  4. CAFFE学习笔记(五)用caffe跑自己的jpg数据

    1 收集自己的数据 1-1 我的训练集与测试集的来源:表情包 由于网上一幅一幅图片下载非常麻烦,所以我干脆下载了两个eif表情包.同一个表情包里的图像都有很强的相似性,因此可以当成一类图像来使用.下载 ...

  5. CAFFE学习笔记(四)将自己的jpg数据转成lmdb格式

    1 引言 1-1 以example_mnist为例,如何加载属于自己的测试集? 首先抛出一个问题:在example_mnist这个例子中,测试集是人家给好了的.那么如果我们想自己试着手写几个数字然后验 ...

  6. Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)

    0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...

  7. Caffe学习笔记(一):Caffe架构及其模型解析

    Caffe学习笔记(一):Caffe架构及其模型解析 写在前面:关于caffe平台如何快速搭建以及如何在caffe上进行训练与预测,请参见前面的文章<caffe平台快速搭建:caffe+wind ...

  8. Caffe学习笔记4图像特征进行可视化

    Caffe学习笔记4图像特征进行可视化 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit201 ...

  9. Caffe学习笔记3

    Caffe学习笔记3 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和h ...

随机推荐

  1. Buffer Data

    waylau/netty-4-user-guide: Chinese translation of Netty 4.x User Guide. 中文翻译<Netty 4.x 用户指南> h ...

  2. JAVA—List集合总结

    List接口总结: List接口是Collection接口的子接口,从其名称可以看出,是一个元素有序(并不是按大小排序,具有顺序索引,类似于数组),默认按照元素的添加顺序设置元素的索引,List和Se ...

  3. NoSQL文章

    MongoDB Bugsnag的MongoDB分片集群使用经验

  4. 解决线上Tomcat启动慢

    vim /application/jdk/jre/lib/security/java.security # securerandom.source=file:/dev/randomsecurerand ...

  5. mysql 约束条件 auto_increment 自动增长 修改自增字段起始值

    创建一张表 t20 mysql) ); Query OK, rows affected (0.01 sec) mysql> desc t20; +-------+----------+----- ...

  6. JavaScript Object.defineProperty()方法详解

    Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...

  7. 使用Robomongo连接数据库不成功:没有启动MongoDB

    启动MongoDB ➜ ~ mongod --07T16:: I CONTROL [initandlisten] MongoDB starting : pid= port= dbpath=/data/ ...

  8. macOS 上安装 PECL

    一.简介 PECL(The PHP Extension Community Library)是 PHP 扩展的存储库,为 PHP 所有的扩展提供提供托管和下载服务. 通过 PEAR(PHP Exten ...

  9. 在 Sublime Text 2 中编译和运行 Java 程序,以及输出中文出错问题解决办法

    Sublime Text 2 是我最喜欢用来编码的文本编辑器,如果你尝试使用后相信你也会喜欢上它的.在这篇文章中我们将讨论如何在 Sublime Text 2 中编译和运行 Java 程序. 第一步: ...

  10. Java队列存储结构及实现

    一.队列(Queue) 队列是一种特殊的线性表,它只允许在表的前段(front)进行删除操作,只允许在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头. 对于一个队 ...