首页 > 代码库 > caffe中的Blob块
caffe中的Blob块
首先说明:Blob定义了一个类模板。
让我们看一下Blob的头文件里有什么哈:
定义了一个全局变量:
const int kMaxBlobAxes = 32;
看看它的构造函数:
Blob() : data_(), diff_(), count_(0), capacity_(0) {};
explicit Blob(const int num, const int channels, const int height,const int width);
explicit Blob(const vector<int>& shape);
Reshape函数:
void Reshape(const int num, const int channels, const int height, const int width);
void Reshape(const vector<int>& shape);
void Reshape(const BlobShape& shape);
void ReshapeLike(const Blob& other);
内联函数shape_string:作用就是把shape的数据变为字符输出,里面用到了ostringstream流;
inline string shape_string() const { ostringstream stream; for (int i = 0; i < shape_.size(); ++i) { stream << shape_[i] << " "; } stream << "(" << count_ << ")"; return stream.str(); }
内联函数shape():
//作用:返回shape_的引用;inline const vector<int>& shape() const { return shape_; }//作用:输入第几维度,返回该维度的大小;inline int shape(int index) const { return shape_[CanonicalAxisIndex(index)];
//内联函数:num_axes(),作用:返回是多少维度的块;inline int num_axes() const { return shape_.size(); }
//内联函数:count():inline int count() const { return count_; } //返回一共多少数据啊,;inline int count(int start_axis, int end_axis) const //返回输入的索引之间的大小;inline int count(int start_axis) const //太麻烦了,不写了,自己看代码吧;
canonicalAxisIndex的作用就是:把正的索引不变,负的改为正的,另外,还是检查一下它们的范围啦;
CanonicalAxisIndex(int axis_index) const
offset函数就是计算一下索引的偏移值,因为吧,多维数组在内存里也是按一维 存放的:
inline int offset(const int n, const int c = 0, const int h = 0, const int w = 0) const {
……
return ((n * channels() + c) * height() + h) * width() + w;
}
// 用向量的方式把坐标值传入:inline int offset(const vector<int>& indices) const
函数copyfrom,作用把数据从Blob块中复制到内存中
void CopyFrom(const Blob<Dtype>& source, bool copy_diff = false, bool reshape = false);
查看数据的函数:
inline Dtype data_at(const int n, const int c, const int h, const int w) constinline Dtype diff_at(const int n, const int c, const int h, const int w) const inline Dtype data_at(const vector<int>& index) constinline Dtype diff_at(const vector<int>& index) const
获得data_与diff_的函数:
inline const shared_ptr<SyncedMemory>& data() const { CHECK(data_); return data_; }inline const shared_ptr<SyncedMemory>& diff() const { CHECK(diff_); return diff_; }
另外还有好几个函数,尼玛,有点多哎
const Dtype* cpu_data() const; void set_cpu_data(Dtype* data); const int* gpu_shape() const; const Dtype* gpu_data() const; const Dtype* cpu_diff() const; const Dtype* gpu_diff() const; Dtype* mutable_cpu_data(); Dtype* mutable_gpu_data(); Dtype* mutable_cpu_diff(); Dtype* mutable_gpu_diff(); void Update(); void FromProto(const BlobProto& proto, bool reshape = true); void ToProto(BlobProto* proto, bool write_diff = false) const; /// @brief Compute the sum of absolute values (L1 norm) of the data. Dtype asum_data() const; /// @brief Compute the sum of absolute values (L1 norm) of the diff. Dtype asum_diff() const; /// @brief Compute the sum of squares (L2 norm squared) of the data. Dtype sumsq_data() const; /// @brief Compute the sum of squares (L2 norm squared) of the diff. Dtype sumsq_diff() const;/// @brief Scale the blob data by a constant factor. void scale_data(Dtype scale_factor); /// @brief Scale the blob diff by a constant factor. void scale_diff(Dtype scale_factor);
还有:
/** * @brief Set the data_ shared_ptr to point to the SyncedMemory holding the * data_ of Blob other -- useful in Layer%s which simply perform a copy * in their Forward pass. * * This deallocates the SyncedMemory holding this Blob‘s data_, as * shared_ptr calls its destructor when reset with the "=" operator. */ void ShareData(const Blob& other); /** * @brief Set the diff_ shared_ptr to point to the SyncedMemory holding the * diff_ of Blob other -- useful in Layer%s which simply perform a copy * in their Forward pass. * * This deallocates the SyncedMemory holding this Blob‘s diff_, as * shared_ptr calls its destructor when reset with the "=" operator. */ void ShareDiff(const Blob& other); bool ShapeEquals(const BlobProto& other);
下面是定义的变量:
shared_ptr<SyncedMemory> data_; shared_ptr<SyncedMemory> diff_; shared_ptr<SyncedMemory> shape_data_; vector<int> shape_; int count_; int capacity_;
caffe中的Blob块
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。