math_function 定義了caffe 中用到的一些矩陣操作和數值計算的一些函式,這裡以float型別為例做簡單的分析
template
<>
void caffe_cpu_gemm(const cblas_transpose transa,
const cblas_transpose transb, const
int m, const
int n, const
int k,
const
float alpha, const
float* a, const
float* b, const
float beta,
float* c)
功能: c=alpha*a*b+beta*c
a,b,c 是輸入矩陣(一維陣列格式)
cblasrowmajor :資料是行主序的(二維資料也是用一維陣列儲存的)
transa, transb:是否要對a和b做轉置操作(cblastrans cblasnotrans)
m: a、c 的行數
n: b、c 的列數
k: a 的列數, b 的行數
lda : a的列數(不做轉置)行數(做轉置)
ldb: b的列數(不做轉置)行數(做轉置)
template
<>
void caffe_cpu_gemv(const cblas_transpose transa, const
int m,
const
int n, const
float alpha, const
float* a, const
float* x,
const
float beta, float* y)
功能: y=alpha*a*x+beta*y
其中x和y是向量,a 是矩陣
m:a 的行數
n:a 的列數
cblas_sgemv 中的 引數1 表示對x和y的每個元素都進行操作
template
<>
void caffe_axpy(const
int n, const
float alpha, const
float* x,
float* y)
功能: y=alpha*x+y
n:為x和y中element的個數
template
void caffe_set(const
int n, const dtype alpha, dtype* y)
for (int i = 0; i < n; ++i)
}
功能:用常數 alpha 對 y 進行初始化
函式 void *memset(void *buffer, char c, unsigned count) 一般為新申請的記憶體做初始化,功能是將buffer所指向記憶體中的每個位元組的內容全部設定為c指定的ascii值, count為塊的大小
template
<>
void caffe_add_scalar(const
int n, const
float alpha, float* y)
}
功能: 給 y 的每個 element 加上常數 alpha
template
void caffe_copy(const
int n, const dtype* x, dtype* y) else
}}
函式 void *memcpy(void *dest, void *src, unsigned int count) 把src所指向的記憶體區域 copy到dest所指向的記憶體區域, count為塊的大小
template
<>
void caffe_scal(const
int n, const
float alpha, float *x)
功能:x = alpha*x
n: x中element的個數
template
<>
void caffe_cpu_axpby(const
int n, const
float alpha, const
float* x,
const
float beta, float* y)
功能:y= alpha*x+beta*y
template
<>
void caffe_add(const
int n, const
float* a, const
float* b,
float* y)
template
<>
void caffe_sub(const
int n, const
float* a, const
float* b,
float* y)
template
<>
void caffe_mul(const
int n, const
float* a, const
float* b,
float* y)
template
<>
void caffe_div(const
int n, const
float* a, const
float* b,
float* y)
功能:這四個函式分別實現element-wise的加減乘除(y[i] = a[i] + - * \ b[i])
template
<>
void caffe_powx(const
int n, const
float* a, const
float b,
float* y)
template
<>
void caffe_sqr(const
int n, const
float* a, float* y)
template
<>
void caffe_exp(const
int n, const
float* a, float* y)
template
<>
void caffe_abs(const
int n, const
float* a, float* y)
功能 : 同樣是element-wise操作,分別是y[i] = a[i] ^ b, y[i] = a[i]^2,y[i] = exp(a[i] ),y[i] = |a[i] |
unsigned int caffe_rng_rand()
功能:返回乙個隨機數
template dtype>
dtype caffe_nextafter(const dtype b)
功能 : 返回 b 最大方向上可以表示的最接近的數值。
template
<>
double caffe_cpu_strided_dot(const
int n, const
double* x,
const
int incx, const
double* y, const
int incy)
功能: 返回 vector x 和 vector y 的內積。
incx, incy : 步長,即每隔incx 或 incy 個element 進行操作。
template
<>
int caffe_cpu_hamming_distance(const
int n, const
float* x,
const
float* y)
return dist;
}
功能:返回 x 和 y 之間的海明距離。(兩個等長字串之間的海明距離是兩個字串對應位置的不同字元的個數。)
template
<>
float caffe_cpu_asum(const
int n, const
float* x)
功能:計算 vector x 的所有element的絕對值之和。
template
<>
void caffe_cpu_scale(const
int n, const
float alpha, const
float *x,
float* y)
功能:y = alpha*x caffe原始碼解析
目錄目錄 簡單介紹 主要函式readprotofromtextfile 函式 writeprotototextfile 函式 readprotofrombinaryfile 函式 writeprototobinaryfile 函式 readimagetocvmat 函式 matchext 函式 cv...
caffe 分類原始碼解讀
首先,新建乙個classifier的c 類,其中標頭檔案classifier.h如下 其中,classifier函式 根據模型的配置檔案.prototxt,訓練好的模型檔案.caffemodel,建立模型,得到net 處理均值檔案,得到mean 讀入labels檔案,得到labels classif...
caffe原始碼解析 一
用si載入 後 首先從caffe layer的實現看起,不同框架下最大的差異就在於層的實現也決定了層的靈活性 layer可以看成是乙個基類,下面存在data layer,activation neuron layers,vision layer,common layers,loss layer,各個...