blob.h
#ifndef CAFFE_BLOB_HPP_
#define CAFFE_BLOB_HPP_
#include <algorithm>
#include <string>
#include <vector>
#include "caffe/common.hpp"
#include "caffe/proto/caffe.pb.h"
#include "caffe/syncedmem.hpp"
const int kMaxBlobAxes = 32;
namespace caffe {
template <typename Dtype>
class Blob {
public:
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);
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);
inline string shape_string()
inline const vector<int>& shape()
inline int shape(int index)
inline int num_axes() const
inline int count() const { return count_; }
inline int count(int start_axis, int end_axis) const
inline int count(int start_axis) const
inline int CanonicalAxisIndex(int axis_index) const
inline int num() const { return LegacyShape(0); }.
inline int channels() const { return LegacyShape(1); }
inline int height() const { return LegacyShape(2); }
inline int width() const { return LegacyShape(3); }
inline int LegacyShape(int index) const
inline int offset(const int n, const int c = 0, const int h = 0,const int w = 0) const
inline int offset(const vector<int>& indices) const
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) const
inline Dtype diff_at(const int n, const int c, const int h,const int w) const
inline Dtype data_at(const vector<int>& index) const
inline Dtype diff_at(const vector<int>& index) const
inline const shared_ptr<SyncedMemory>& data() const
inline const shared_ptr<SyncedMemory>& diff() const
const Dtype* cpu_data() const;
void set_cpu_data(Dtype* data);
const int* gpu_shape() const;
const Dtype* gpu_data() const;
void set_gpu_data(Dtype* data);
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;
Dtype asum_data() const;
Dtype asum_diff() const;
Dtype sumsq_data() const;
Dtype sumsq_diff() const;
void scale_data(Dtype scale_factor);
void scale_diff(Dtype scale_factor);
void ShareData(const Blob& other);
void ShareDiff(const Blob& other);
bool ShapeEquals(const BlobProto& other);
protected:
shared_ptr<SyncedMemory> data_;
shared_ptr<SyncedMemory> diff_;
shared_ptr<SyncedMemory> shape_data_;
vector<int> shape_;
int count_;
int capacity_;
DISABLE_COPY_AND_ASSIGN(Blob);
};
}
#endif
变量说明
变量名 | 说明 |
---|
shared_ptr<SyncedMemory> data_ | 数据 |
shared_ptr<SyncedMemory> diff_ | 数据梯度 |
shared_ptr<SyncedMemory> shape_data_ | 数据维度信息 |
vector<int> shape_ | 数据的维度信息 |
int count_ | 数据的总个数 |
int capacity_ | 能够存储数据的容量 |
函数说明
函数名 | 说明 |
---|
Update() |
d
a
t
a
=
d
a
t
a
−
d
i
f
f
data = data - diff
data=data−diff |
asum_data() |
∑
i
c
o
u
n
t
∥
d
a
t
a
i
∥
\sum_i^{count}\|{data_i}\|
∑icount∥datai∥ |
asum_diff() |
∑
i
c
o
u
n
t
∥
d
i
f
f
∥
\sum_i^{count}\|{diff}\|
∑icount∥diff∥ |
sumsq_data() |
∑
i
c
o
u
n
t
d
a
t
a
i
∗
d
a
t
a
i
\sum_i^{count} {data_i * data_i}
∑icountdatai∗datai |
scale_data() |
d
a
t
a
i
=
α
∗
d
a
t
a
i
data_i = \alpha*data_i
datai=α∗datai |
proto函数
函数名 | 参数说明 | 说明 |
---|
void FromProto(const BlobProto& proto, bool reshape) | reshape:是否进行形变 | 将proto里的data更新到data_里 将diff更新到diff_ |
void ToProto(BlobProto* proto, bool write_diff) | write_diff:是否写入diff | 将_data写入到data,将_diff写入到diff |