bias的解讀
bias就是偏置啦愤估,有了前面的經(jīng)驗(yàn)至扰,我們分析ncnn的layer代碼結(jié)構(gòu)已經(jīng)輕車熟路了桦他。把重點(diǎn)放在計(jì)算過程上吧。
y = x + bias這我們應(yīng)該很熟悉了霹期,直接上代碼實(shí)現(xiàn)叶组。
先來看構(gòu)造函數(shù):
Bias::Bias()
{
one_blob_only = true;
support_inplace = true;
}
可知其是單輸入單輸出的,且支持就地計(jì)算(也就是直接在傳入的矩陣上進(jìn)行修改)历造。
再來看看參數(shù)載入函數(shù):
int Bias::load_param(const ParamDict& pd)
{
bias_data_size = pd.get(0, 0);
return 0;
}
發(fā)現(xiàn)其有一個(gè)參數(shù)bias_data_size甩十,看名字應(yīng)該是數(shù)據(jù)大小了。
繼續(xù)看模型載入函數(shù):
int Bias::load_model(const ModelBin& mb)
{
bias_data = mb.load(bias_data_size, 1);
if (bias_data.empty())
return -100;
return 0;
}
這個(gè)也很清楚了吭产,把bias_data_size這么多的數(shù)據(jù)放在bias_data_size這么大的模型矩陣中侣监。
推理函數(shù):
int Bias::forward_inplace(Mat& bottom_top_blob, const Option& opt) const
{
int w = bottom_top_blob.w;
int h = bottom_top_blob.h;
int channels = bottom_top_blob.c;
int size = w * h;
//對(duì)于每個(gè)通道上的數(shù)據(jù),他們具有相同的偏置
//openmp指令臣淤,用于多線程
#pragma omp parallel for num_threads(opt.num_threads)
for (int q = 0; q < channels; q++)
{
float* ptr = bottom_top_blob.channel(q);
float bias = bias_data[q];
for (int i = 0; i < size; i++)
{
ptr[i] += bias;
}
}
return 0;
}
顯然這個(gè)op的計(jì)算過程很簡(jiǎn)單橄霉。
pr內(nèi)容:
bias
y = x + bias
- one_blob_only
- support_inplace
param id | name | type | default |
---|---|---|---|
0 | bias_data_size | int | 0 |
weight | type |
---|---|
bias_data | float |