Caffe原始碼 math functions 解析

2021-07-24 23:42:06 字數 4565 閱讀 9627

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,各個...