Caffe中的Blob是其进行数据传递与处理的一个类,经过分析Blob中的数据(data_、diff_、shape_data_)都是SyncedMemory的类型,本文简单的分析了SyncedMemory和Blob这两个类的Public函数。
1、class SyncedMemory
1.1、Brief:
管理内存数据以及CPU和GPU之间的内存同步
1.2、Public Types:
enum SyncedHead { UNINITIALIZED, HEAD_AT_CPU, HEAD_AT_GPU, SYNCED };
用于表示数据在CPU和GPU之间传输的状态
1.3、Public Member Functions:
1.3.1、SyncedMemory()
构造函数
1.3.2、explicit SyncedMemory(size_t size)
构造函数
1.3.3、~SyncedMemory()
析构函数
1.3.4、const void* cpu_data()
获取cpu数据,在该函数的实现中,会首先调用to_cpu(),将数据转换成cpu数据,然后返回cpu数据的指针。
1.3.5、void set_cpu_data(void* data)
设置cpu数据
1.3.6、const void* gpu_data()
获取GPU数据,在该函数的实现中,会首先调用to_gpu(),将数据转换成gpu数据,然后返回gpu数据的指针。
1.3.7、void set_gpu_data(void* data)
设置GPU数据
1.3.8、void* mutable_cpu_data()
同cpu_data(),只不过该函数返回的数据是可写的
1.3.9、void* mutable_gpu_data()
同gpu_data(),只不过该函数返回的数据是可写的
1.3.10、SyncedHead head()
获取同步头,该头用于表示数据在CPU和GPU之间传输的状态
1.3.11、size_t size()
获取数据buffer的大小
1.3.12、void async_gpu_push(const cudaStream_t& stream)
向GPU异步push数据
2、class Blob
2.1、Brief:
对SyncedMemory的封装,该类是Layer、Net、Solver之间进行交互时使用的基本计算单元。
2.2、Public Member Functions:
2.2.1、Blob()
构造函数
2.2.2、explicit Blob(const int num, const int channels, const int height, const int width)
构造函数,已被弃用,请使用explicit Blob(const vector
2.2.3、explicit Blob(const vector
构造函数
2.2.4、void Reshape(const int num, const int channels, const int height, const int width)
已被弃用,请使用void Reshape(const vector
2.2.5、void Reshape(const vector
修改blob的维度,如果有必要,会创建一块新的内存。该函数既可以在初始化内存时用来创建初始内存,也可以在Layer::Reshape或Layer::Forward时用来调 整top blob的维度。
当改变blob的size时,只有在当前内存不够用时才会重新创建,而且超过的内存资源不会被释放。
注意:reshape一个输入blob后立即调用Net::Backward是错误的,应该通过Net::Forward或Net::Reshape将新的输入的shape传递到更高层。
2.2.6、void Reshape(const BlobShape& shape)
同上
2.2.7、void ReshapeLike(const Blob& other)
修改blob的维度,将当前blob的维度修改成和other一样
2.2.8、inline string shape_string() const
将shape_中的内容以及count_拼接成字符串并返回,主要打日志。
2.2.9、inline const vector
获取blob的维度信息
2.2.10、inline int shape(int index) const
获取blob的某一坐标轴上的维度(index如果是负数,则代表从最后一个坐标轴开始第-index个坐标轴)。
参数index代表第几个坐标轴,index可以取负数。
2.2.11、inline int num_axes()
获取blob的坐标轴的个数。
2.2.12、inline int count() const
获取blob的数据的个数。
2.2.13、inline int count(int start_axis, int end_axis) const
获取从start_axis坐标轴到end_axis坐标轴之间的数据的个数。
2.2.14、inline int count(int start_axis) const
获取从start_axis坐标轴开始的数据的个数。
2.2.15、inline int CanonicalAxisIndex(int axis_index)
获取规范化的坐标索引,
axis_index可以是负数,如果是负数,则返回axis_index + num_axes(),即倒数第-axis_index个索引
2.2.16、inline int num() const
已经弃用,请使用shape(0)
2.2.17、inline int channels() const
已经弃用,请使用shape(1)
2.2.18、inline int height() const
已经弃用,请使用shape(2)
2.2.19、inline int width() const
已经弃用,请使用shape(3)
2.2.20、inline int LegacyShape(int index) const
返回某一坐标轴上的数据个数,index为坐标轴索引
2.2.21、inline int offset(const int n, const int c = 0, const int h = 0, const int w = 0) const
返回数据的偏移
2.2.22、inline int offset(const vector
返回数据的偏移
2.2.23、void CopyFrom(const Blob
从一个源blob中拷贝数据
参数source:要拷贝数据的源Blob
参数copy_diff:如果false,copy数据;如果true拷贝差值
参数reshape:如果false,要求当前blob和源blob的shape一致;
如果true,在shape不一致的情况下会自动reshape当前的blob
2.2.24、inline Dtype data_at(const int n, const int c, const int h, const int w) const
获取某一位置的数据
2.2.25、inline Dtype data_at(const vector
获取某一位置的数据
2.2.26、inline Dtype diff_at(const int n, const int c, const int h, const int w) const
获取某一位置的差值
2.2.27、inline Dtype diff_at(const vector
获取某一位置的差值
2.2.28、inline const shared_ptr
获取数据指针
2.2.29、inline const shared_ptr
获取差值数据指针
2.2.30、const Dtype* cpu_data() const
获取cpu数据指针
2.2.31、void set_cpu_data(Dtype* data)
设置cpu数据指针
2.2.32、const int* gpu_shape() const
设置gpu数据的shape
2.2.33、const Dtype* gpu_data() const
设置gpu数据指针
2.2.34、const Dtype* cpu_diff() const
设置cpu差值数据的指针
2.2.35、const Dtype* gpu_diff() const
设置gpu差值数据的指针
2.2.36、Dtype* mutable_cpu_data()
获取可修改的cpu数据指针
2.2.37、Dtype* mutable_gpu_data()
获取可修改的gpu数据指针
2.2.38、Dtype* mutable_cpu_diff()
获取可修改的cpu差值数据指针
2.2.39、Dtype* mutable_gpu_diff()
获取可修改的gpu差值数据指针
2.2.40、void Update()
对数据进行计算,并更新数据
2.2.41、void FromProto(const BlobProto& proto, bool reshape = true)
从proto中读取数据
参数reshape:如果false,需要保证当前blob和proto的shape一致;
如果true,则在当前blob的shape和proto不一致时,会对blob进行 reshape
2.2.42、void ToProto(BlobProto* proto, bool write_diff = false) const
将数据写入proto
参数write_diff:如果false,则不写差值数据到proto;
如果true,则写差值数据到proto
2.2.43、Dtype asum_data() const
计算blob中各数据的绝对值之和
2.2.44、Dtype asum_diff() const
计算blob中各差值的绝对值之和
2.2.45、Dtype sumsq_data() const
计算blob中各数据的平方之和
2.2.46、Dtype sumsq_diff() const
计算blob中各差值的平方之和
2.2.47、void scale_data(Dtype scale_factor)
用一个缩放因子对blob中的各数据进行缩放
2.2.48、void scale_diff(Dtype scale_factor)
用一个缩放因子对blob中的各差值进行缩放
2.2.49、void ShareData(const Blob& other)
让当前blob的data_指向入参other的data_,这在各Layer进行Forward操作时很有用,可以进行简单的数据拷贝。
该函数有可能会释放掉当前blob的data_,因为shared_ptr类型的data_会在使用操作符”=“进行赋值时调用其reset函数,从而调用析构函数
2.2.50、void ShareDiff(const Blob& other)
让当前blob的diff_指向入参other的diff_,这在各Layer进行Forward操作时很有用,可以进行简单的数据拷贝。
该函数有可能会释放掉当前blob的diff_,因为shared_ptr类型的diff_会在使用操作符”=“进行赋值时调用其reset函数,从而调用析构函数
2.2.51、bool ShapeEquals(const BlobProto& other)
判断当前blob的shape和BlobProto的是否相匹配