零基礎學caffe原始碼 ReLU啟用函式

2021-07-16 03:17:49 字數 2451 閱讀 5836

1、如何有效閱讀caffe原始碼

1、caffe原始碼閱讀路線最好是從src/cafffe/proto/caffe.proto開始,了解基本資料結構記憶體物件和磁碟檔案的一一對映關係,中間過程都由protobuffer工具自動完成。

2、看include/目錄中.hpp標頭檔案,通過標頭檔案類申明理解整個框架。從基類向派生類,掌握這些類。

3、看src/目錄中.cpp和.cu原始檔,亦可以按需求派生新的類。

4、編寫各類工具,整合到caffe內部,如tools/下就有訓練模型,提取特徵,轉換資料格式等工具。

2、relu啟用函式

啟用函式,用在各個卷積層和全連線層輸出位置。啟用函式是深度網路非線性的主要**。通常包括:simgoid(f(x)=(1+e-x)-1)和tanh(f(x)=sinhx/coshx,圖形類似於arctanx,但是值域是[-1,1])作為啟用函式。

用relu(f(x)=max(0,x))作為啟用函式的原因是:加速收斂、解決了梯度消失問題

3、relu函式caffe原始碼解析

在models/bvlc_alexnet/train_val.prototxt網路模型設定中找到了relu層描述

//relu層,新的非線性層

layer

下面開始按步驟解析原始碼:

3.1、閱讀src/cafffe/proto/caffe.proto中relu層引數

//儲存relu層引數的資料結構類

message reluparameter

optional engine engine = 2 [default = default];

}

3.2、閱讀include/caffe/layers/relu_layer.hpp中類申明

//標頭檔案中的 #ifndef/#define/#endif,防止該標頭檔案被重複引用

#ifndef caffe_relu_layer_hpp_

#define caffe_relu_layer_hpp_

#include #include "caffe/blob.hpp"

#include "caffe/layer.hpp"

#include "caffe/proto/caffe.pb.h"

#include "caffe/layers/neuron_layer.hpp"

//relulayer,派生於neuronlayer,實現了relu啟用函式計算

namespace caffe

//虛內聯函式,const成員函式,返回類名字串

virtual inline const char* type() const

protected: //bottom為輸入,top為輸出

//前向傳播函式

//cpu版本前饋實現

virtual void forward_cpu(const vector*>& bottom,

const vector*>& top);

//gpu版本前饋實現

virtual void forward_gpu(const vector*>& bottom,

const vector*>& top);

//反向傳播函式

//top為輸出blob,propagate_down為bottom索引,bottom為輸入blob

virtual void backward_cpu(const vector*>& top,

const vector& propagate_down, const vector*>& bottom);

virtual void backward_gpu(const vector*>& top,

const vector& propagate_down, const vector*>& bottom);

};} // namespace caffe

#endif // caffe_relu_layer_hpp_

3.3、閱讀src/caffe/layers/relu_layer.cpp中**

#include #include #include "caffe/layers/relu_layer.hpp"

namespace caffe

}template //定義反向傳播函式

void relulayer::backward_cpu(const vector*>& top,

const vector& propagate_down,

const vector*>& bottom)

}}#ifdef cpu_only

stub_gpu(relulayer);

#endif

instantiate_class(relulayer);

} // namespace caffe

零基礎學Python

零基礎學python 1 1 python是一門指令碼語言 2 python的優勢 1 語法和結構比較簡單,易入門 2 能夠跨平台使用 3 應用範圍廣,設計到作業系統 3d動畫 web 雲計算,企業應用等多方面。3 idle 是乙個python shell,類似於windows的cmd視窗 4 pr...

零基礎學C C

零基礎學c c 零基礎學c c 199 孿生素數 題目描述 在素數的大家庭中,大小相差為2的兩個素數稱之為一對 孿生素數 如3和5 17和19等。請你程式設計統計出不大於自然數n的素數中,孿生素數的對數。輸入一行乙個正整數n 1 n 10000 輸出若干行,每行2個整數,之間用乙個空格隔開,從小到大...

零基礎學python 一

每次學習語言總是要了解其背景python也不例外。首先python的創始人為 guido van rossum 1989年聖誕節期間,在 阿姆斯特丹 guido為了打發聖誕節的無趣,決心開發乙個新的指令碼 解釋程式 做為abc 語言的一種繼承。看看人家外鬼子程式設計師 哎不得不佩服。他在業餘時間開發...