Class_4 Caffe Layers之data_layer(数据层)
1. 概述
data_layer稍微有些深, 分别是Layer->BaseDataLayer->BasePrefetchingDataLayer->DataLayer。结构图如下:
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中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Caffe源码精读 – 5 – Caffe Layers之data_layer(数据层) - Python技术站