OpenCV4深度神經網路 卷積神經網路基礎

2021-10-10 04:20:54 字數 2077 閱讀 9665

前面關於神經網路的介紹,我們想想為什麼 dnn 在訓練後能夠正確地分類?那肯定是它學到了東西,學到什麼東西呢?它學到了中的某些空間結構,不同數字它們的空間結構肯定是不一樣的,而這樣的空間結構就是由畫素點與畫素點之間的關係形成。我們再仔細看 dnn輸入層和第乙個隱藏層,發現它對我們輸入的784個畫素點是同等對待的,也就是說它此時並沒有考慮畫素點與畫素點之間的關係。有沒有乙個好點的模型能夠考慮到這點呢?那就是cnn (卷積神經網路convolutional neural networks, cnn)。

在每次的卷積操作後都使用了乙個叫做relu的操作。relu 表示修正線性單元(rectified linear unit),是乙個非線性操作。它的定義如下所示:

relu 是乙個元素級別的操作(應用到各個畫素),並將特徵圖中的所有小於 0 的畫素值設定為零。relu 的目的是在 convnet 中引入非線性,因為在大部分的我們希望 convnet 學習的實際資料是非線性的(卷積是乙個線性操作——元素級別的矩陣相乘和相加,所以我們需要通過使用非線性函式 relu 來引入非線性。其他非線性函式,比如 tanh 或者 sigmoid 也可以用來替代 relu,但 relu 在大部分情況下表現是更好的。

//以caffemodel為例

cv_exports_w net readnetfromcaffe

(const string &prototxt,

const string &caffemodel =

string()

);

//載入網路

#include

#include

//包含dnn模組標頭檔案

#include

using namespace std;

using namespace cv;

using namespace cv:

:dnn;

//以bvlc_googlenet.caffemodel為例

string bin_model =

"f:/code/opencv_tutorial/data/models/googlenet/bvlc_googlenet.caffemodel"

;//模型的權重檔案

string protxt =

"f:/code/opencv_tutorial/data/models/googlenet/bvlc_googlenet.prototxt"

;//模型的描述檔案

//load dnn model

net net =

readnetfromcaffe

(protxt, bin_model)

;

//獲取各層資訊

vector layer_names = net.

getlayernames()

; cout <<

"layer id :"

<<

" "

<<

"layer type:"

<<

" "

<<

"layer name:"

<< endl;

for(

int i =

0; i < layer_names.

size()

; i++

)

//設定計算後台

net.

setpreferablebackend

(dnn_backend_opencv)

;//設定支援裝置

net.

setpreferabletarget

(dnn_target_cpu)

;

深度學習 卷積神經網路

一 卷積神經網路基礎 二 lenet 三 常見的一些卷積神經網路 卷積層的超引數 填充和步幅。步幅 stride 每次卷積核在輸入陣列上滑動的行數與列數。多輸入與輸出通道 將3維陣列除寬高外的一維稱為通道維。1 1卷積層 包含1 1的卷積核的卷積層。1 1卷積核在不改變輸入高寬的情況下調整通道數。如...

深度學習 卷積神經網路

卷積神經網路 convolutional neural networks,cnn 是一類包含卷積計算且具有深度結構的前饋神經網路 feedforward neural networks 是深度學習 deep learning 的代表演算法之一。卷積神經網路具有表徵學習 representation ...

神經網路 卷積神經網路

這篇卷積神經網路是前面介紹的多層神經網路的進一步深入,它將深度學習的思想引入到了神經網路當中,通過卷積運算來由淺入深的提取影象的不同層次的特徵,而利用神經網路的訓練過程讓整個網路自動調節卷積核的引數,從而無監督的產生了最適合的分類特徵。這個概括可能有點抽象,我盡量在下面描述細緻一些,但如果要更深入了...