Class_4 Caffe Layersdata_layer(数据层)

 

1. 概述

data_layer稍微有些深, 分别是Layer->BaseDataLayer->BasePrefetchingDataLayer->DataLayer。结构图如下:

Caffe源码精读 - 5 - Caffe Layers之data_layer(数据层)

 

 

 

2. InternalThread

InternalThread实际上是封了一层boost的thread,相对理解起来比较简单。

(1)entry

entry函数是一个私有函数,不对外公开。主要是为了配置完线程以后,调用InternalThreadEntry。

(2)InternalThreadEntry

InternalThreadEntry,是实际上的线程体,是一个虚成员函数。要是用当前的线程类,只需要继承InternalThread类,并实现InternalThreadEntry就可以了。

(3)StartInternalThread

StartInternalThread用来创建、启动线程。

(4)StopInternalThread

StopInternalThread用来销毁线程。调用interrupt,然后join等待线程彻底退出,清理线程资源。

(5)is_started

is_started用来判断线程是否已经启动。

(6)must_stop

must_stop用来判断,当前县城是否被要求停止,并退出。

 

3. BaseDataLayer<Dtype>

BaseDataLayer主要是用来配置输入数据。

(1)LayerSetUp

LayerSetUp主要是配置几个参数,然后调用DataLayerSetUp,用来配置不同类型的输入数据(输入数据类型包含image_data, memory_data, video_data, window_data等,均有各自的类)。

首先设置output_labels_,表示数据层输出是否包含label信息。

       然后实例化一个DataTransformer对象,data_transformer_用于预处理输入数据。

最后调用DataLayerSetUp, 用于为特定输入数据,配置。再次是一个虚函数成员,需要由继承自当前数据类的子类具体实现。

(2)DataLayerSetUp、ReShape、Backward_cpu、Backward_gpu

也是由各个子类,各自实现。

4. BasePrefetchingDataLayer

(1)LayerSetUp

DataPrefetchingDataLayer有一个Batch类型的数据成员prefetch_。

       在LayerSetUp中,会以此获得可读写的缓存指针,用于后续处理。

       对从BaseDataLayer继承来的数据预处理类对象data_transformer_调用了一次InitRand,本质是初始化随机种子等。

       最后调用StartInternalThread开启线程,线程任务体定义在InternalThreadEntry中。

(2)InternalThreadEntry

主要工作就是从prefetch_free_队列中拿到空的batch(数据容器, Batch

类型指针),将数据存储到batch中,然后将当前batch入队到prefetch_full_队列中。

(3)Forward_cpu

Forward_cpu就是每次从prefetch_full_中pop出一个batch的数据,然后当道data层的top中。

       首先执行top[0]->ReshapeLike(batch->data_),将top的shape设置成与获取的数据一样的形式。

然后利用caffe_copy将数据复制到top指示的内存中。

       output_labels_指示是否有标签需要连同数据一块提供。如果为true,则表示需要读进label数据。和数据同样的操作,先设置shape,再复制数据。

5. DataLayer(data_layer.hpp/cpp)

DataLayer类zai data_layer.hpp/cpp中指示数据层的顶级类。

第一个需要注意的点是DataLayer的析构函数,在析构函数中会停止数据的prefetch。

(1)DataLayerSetUp

DataLayerSetUp首先获取batch_size信息。

reader_实际上是读入的prototxt配置信息,通过接下来的InferBlobShape获取(推算)数据的shape信息。

然后设置transformed_data_数据的数据。transformed_data_是存储变换后的数据,直接送往网络进行前向计算的数据。

top_shape代表了输出数据的shape,top_shape[0]设置了读入的batch数。

接下来是数据和标签的Reshape操作。

(2)load_batch

load_batch是用于prefetch的一个函数调用,主要工作是从transformed_data_中将数据转入top中。