水平有限難免錯誤,批判性**。
神經網路的理論太多了,下面給個鏈結大家可以去看下:
原理能懂當然好了,其實不懂也不影響使用,只要明白神經網路的基礎結構就行了。下面來說說opencv裡面使用神經網路需要注意的地方。
第一步是訓練
神經網路和svm的不同是需要在呼叫train方法之前建立結構。即有多少層,每層有多少神經元。建立方法如下:
int classlablecount=5;
mat layersizes=(mat_(1,3) 《其中feature_vec_mat是mat結構,他的rows表示總共的訓練樣本,cols表示訓練樣本的維度,classlablecount表示需要分類數量,上面方法表示神經網路有三層,輸入層有feature_vec_mat.cols維,隱藏層有300個神經元,輸出層有5個維度。這樣訓練好的神經網路的引數大有feature_vec_mat.cols*300這麼多個。上面如果寫成
mat layersizes=(mat_(1,3) <<2000,1000,1000,5);
這樣表示有4層,輸入層,隱藏層,隱藏層,輸出層。需要維護的權值就有2000*1000*1000這麼多。不過不用擔心,有個模型叫做卷積神經網路,它的共享權值可以解決這些問題。遺憾的是opencv還沒有引入,對於新手來說需要等等再研究。
神經網在訓練的時候不是像一般的方法在train方法的時候給標籤,在predict返回標籤。神經網路在訓練的時候是給的向量,返回的也是向量。
cvann_mlp mlp;
mlp.train(feature_vec_mat,label_mat,mat(),mat(),params);
這裡的label_mat不是n*1而是n*classcout維度的,例如feature_vec_mat第一行的向量對應的是標籤為3的類,一共有5類,label_mat第一行就應該是0 0 1 0 0。
params一般使用opencv文件中推薦的引數
cvann_mlp_trainparams params;
params.term_crit=cvtermcriteria( cv_termcrit_iter + cv_termcrit_eps, 1000, 0.01 );
params.train_method=cvann_mlp_trainparams::rprop;
params.bp_dw_scale = 0.1;
params.bp_moment_scale = 0.1;
params.rp_dw0 = 0.1;
params.rp_dw_plus = 1.2;
params.rp_dw_minus = 0.5;
params.rp_dw_min = flt_epsilon;
params.rp_dw_max = 50.;
第二步是檢測
mlp.predict(sample,res);
兩個引數都是mat,其中res返回的是乙個1*classcout維度的mat,找到中間最大的數,就代表分類結果。
新手上路之c指標理解 筆記
曾經指標讓我如夢如幻,指標如霧啊,很多人都被折磨的要死不活的,問老師吧,你又不是計算機的,曉得那麼清楚幹嘛,看了一些網上大牛們和老師們的高見,分享一下心得,有錯誤的地方,還請多多指正.為啥需要指標呢,我不用它,照樣可以用其他方式實現,感覺用的還那麼方便易懂.指標的好處在 呢?早期cpu遠沒有如今的強...
新手上路之Hibernate(5) 繼承對映
之前的幾篇文章主要介紹的是關係對映。之所以用好幾篇的文章來介紹關係對映,其重要性與常用行可見一斑。還有一種對映,也就是今天要介紹的 繼承對映,也是很重要的一種對映模式。繼承對映的實現有三種策略 1 單錶繼承。每棵類繼承樹使用乙個表。2 具體表繼承。每個子類乙個表。3 類表繼承。每個具體類乙個表。下面...
神經網路學習之 Hopfield神經網路
1982年,美國加州理工學院的優秀物理學家hopfield提出了hopfield神經網路。hopfield神經網路引用了物理力學的分析方法,把網路作為一種動態系統並研究這種網路動態系統的穩定性。dhnn 離散型hopfield神經網路 這是一種單層全反饋網路,共有n個神經元。其特點是任一神經元的輸出...