⑴ 如何通過人工神經網路實現圖像識別
人工神經網路(Artificial Neural Networks)(簡稱ANN)系統從20 世紀40 年代末誕生至今僅短短半個多世紀,但由於他具有信息的分布存儲、並行處理以及自學習能力等優點,已經在信息處理、模式識別、智能控制及系統建模等領域得到越來越廣泛的應用。尤其是基於誤差反向傳播(Error Back Propagation)演算法的多層前饋網路(Multiple-Layer Feedforward Network)(簡稱BP 網路),可以以任意精度逼近任意的連續函數,所以廣泛應用於非線性建模、函數逼近、模式分類等方面。
目標識別是模式識別領域的一項傳統的課題,這是因為目標識別不是一個孤立的問題,而是模式識別領域中大多數課題都會遇到的基本問題,並且在不同的課題中,由於具體的條件不同,解決的方法也不盡相同,因而目標識別的研究仍具有理論和實踐意義。這里討論的是將要識別的目標物體用成像頭(紅外或可見光等)攝入後形成的圖像信號序列送入計算機,用神經網路識別圖像的問題。
一、BP 神經網路
BP 網路是採用Widrow-Hoff 學習演算法和非線性可微轉移函數的多層網路。一個典型的BP 網路採用的是梯度下降演算法,也就是Widrow-Hoff 演算法所規定的。backpropagation 就是指的為非線性多層網路計算梯度的方法。一個典型的BP 網路結構如圖所示。
六、總結
從上述的試驗中已經可以看出,採用神經網路識別是切實可行的,給出的例子只是簡單的數字識別實驗,要想在網路模式下識別復雜的目標圖像則需要降低網路規模,增加識別能力,原理是一樣的。
⑵ 對於非連續目標在深度神經網路的優化過程中 哪種梯度下降方法最好
還有很多,一步正割演算法,擬牛頓演算法,量化共軛梯度法,彈性梯度下降法等等。具體可以在MATLAB的help文件訓練函數中查看,路徑是:Neural Network Toolbox>Functions>Training Functions,可以看到各種演算法的函數及詳細介紹
⑶ 非連續目標在深度神經網路的優化過程中,哪種梯度下降方法最好
還有很多,一步正割演算法,擬牛頓演算法,量化共軛梯度法,彈性梯度下降法等等。具體可以在MATLAB的help文件訓練函數中查看,路徑是:Neural Network Toolbox>Functions>Training Functions,可以看到各種演算法的函數及詳細介紹
⑷ Matlab神經網路原理中可以用於尋找最優解的演算法有哪些
若果對你有幫助,請點贊。
神經網路的結構(例如2輸入3隱節點1輸出)建好後,一般就要求神經網路里的權值和閾值。現在一般求解權值和閾值,都是採用梯度下降之類的搜索演算法(梯度下降法、牛頓法、列文伯格-馬跨特法、狗腿法等等),這些演算法會先初始化一個解,在這個解的基礎上,確定一個搜索方向和一個移動步長(各種法算確定方向和步長的方法不同,也就使各種演算法適用於解決不同的問題),使初始解根據這個方向和步長移動後,能使目標函數的輸出(在神經網路中就是預測誤差)下降。 然後將它更新為新的解,再繼續尋找下一步的移動方向的步長,這樣不斷的迭代下去,目標函數(神經網路中的預測誤差)也不斷下降,最終就能找到一個解,使得目標函數(預測誤差)比較小。
而在尋解過程中,步長太大,就會搜索得不仔細,可能跨過了優秀的解,而步長太小,又會使尋解過程進行得太慢。因此,步長設置適當非常重要。
學習率對原步長(在梯度下降法中就是梯度的長度)作調整,如果學習率lr = 0.1,那麼梯度下降法中每次調整的步長就是0.1*梯度,
而在matlab神經網路工具箱里的lr,代表的是初始學習率。因為matlab工具箱為了在尋解不同階段更智能的選擇合適的步長,使用的是可變學習率,它會根據上一次解的調整對目標函數帶來的效果來對學習率作調整,再根據學習率決定步長。
機制如下:
if newE2/E2 > maxE_inc %若果誤差上升大於閾值
lr = lr * lr_dec; %則降低學習率
else
if newE2 < E2 %若果誤差減少
lr = lr * lr_inc;%則增加學習率
end
詳細的可以看《神經網路之家》nnetinfo里的《[重要]寫自己的BP神經網路(traingd)》一文,裡面是matlab神經網路工具箱梯度下降法的簡化代碼
⑸ 神經網路利用哪種演算法將損失函數的值降到最低
用的是梯度下降演算法,用偏微分找出超平面下降最快的方向,使損失函數快速下降。
⑹ 神經網路演算法中,參數的設置或者調整,有什麼方法可以採用
若果對你有幫助,請點贊。
神經網路的結構(例如2輸入3隱節點1輸出)建好後,一般就要求神經網路里的權值和閾值。現在一般求解權值和閾值,都是採用梯度下降之類的搜索演算法(梯度下降法、牛頓法、列文伯格-馬跨特法、狗腿法等等),這些演算法會先初始化一個解,在這個解的基礎上,確定一個搜索方向和一個移動步長(各種法算確定方向和步長的方法不同,也就使各種演算法適用於解決不同的問題),使初始解根據這個方向和步長移動後,能使目標函數的輸出(在神經網路中就是預測誤差)下降。 然後將它更新為新的解,再繼續尋找下一步的移動方向的步長,這樣不斷的迭代下去,目標函數(神經網路中的預測誤差)也不斷下降,最終就能找到一個解,使得目標函數(預測誤差)比較小。
而在尋解過程中,步長太大,就會搜索得不仔細,可能跨過了優秀的解,而步長太小,又會使尋解過程進行得太慢。因此,步長設置適當非常重要。
學習率對原步長(在梯度下降法中就是梯度的長度)作調整,如果學習率lr = 0.1,那麼梯度下降法中每次調整的步長就是0.1*梯度,
而在matlab神經網路工具箱里的lr,代表的是初始學習率。因為matlab工具箱為了在尋解不同階段更智能的選擇合適的步長,使用的是可變學習率,它會根據上一次解的調整對目標函數帶來的效果來對學習率作調整,再根據學習率決定步長。
機制如下:
if newE2/E2 > maxE_inc %若果誤差上升大於閾值
lr = lr * lr_dec; %則降低學習率
else
if newE2 < E2 %若果誤差減少
lr = lr * lr_inc;%則增加學習率
end
詳細的可以看《神經網路之家》nnetinfo里的《[重要]寫自己的BP神經網路(traingd)》一文,裡面是matlab神經網路工具箱梯度下降法的簡化代碼
若果對你有幫助,請點贊。
祝學習愉快
⑺ 神經網路演算法-梯度下降GradientDescent
神經網路文章索引
上一篇神經網路結構中,我們介紹了神經元的結構,激活函數以及每個神經元激活值的演算法,涉及到權重、偏置值等。
上一篇結尾提到,對於28*28的黑白手寫圖像識別,我們需要13002個權重和偏置數值,才能讓我們的神經網路最後輸出正確結果。
所謂的機器學習,就是尋找這13002個數值的過程。首先這里有兩點需要注意:
在負無窮到正無窮之間,如何獲得一萬多個數字最佳的匹配值?這比在全世界挑選1萬人讓TA們一起相愛還要難。
我們的做法是用計算機強大運算速度,暴力解決問題。
好了,現在,暴力不是問題,要想出奇跡的關鍵就在於如何找到如何 優化的規律 。
要想做優化,首先要明確目標,找到當前神經網路和期望結果之間的差距。
從下圖可以看到,隨機設定的神經網路最終輸出的是混亂的一層(被黃色線框標出),距離最右邊我們期望只點亮神經元3的情況差距很大。
我們把混亂輸出層的每個神經元與期望層每個對應神經元激活值相減,然後平方,再累加在一起,這就是方差cost代價,如下圖,計算得到cost是3.37。
我們用這個cost來表示當前神經網路13002個設定值和期望設定值之間的差距,當然,這個cost等於0是差距最小,也就是最接近期望設定值。——當然這只是針對數字3的1張圖片來說,我們需要的是針對0~9共10個數字的數萬張圖片,cost都能是最小。
從下圖,我們來看一下神經網路的功能。它能利用13002個設定值經過3層神經元激活值的計算,把784個像素亮度變為10個數字(我們期望這10個數字中只有一個是1,其他都是0)。
這13002個權重和偏置數字,加上激活值的演算法,就是神經網路的「想法」。
我們再來看看代價函數的情況,如下圖,它是利用很多很多的訓練圖片(已經明確了對應的數字),把13002個數字變為1個cost代價數。
寫成函數形式
我們假設最簡單的情況,只有1個權重和1個偏置:
x和y是任意可能的數值,我們希望知道當x和y是什麼數值的時候z最小。
每一組[x,y]都對應唯一的z,我們可以假想,有無數個[x,y,z]這樣的位置點,在三維空間坐標中,它們就會組成一個面(曲面或平面),如下圖。
從幾何意義上看,我們就是要找到凹陷最低的那個位置點的x,y的值,因為那裡z也就是cost代價最低。
假設上面的xyz繪制的cost曲面是個山地,你是一個旅行者,需要行走找到最低點的位置,你會怎麼辦?
沒錯,只要一直往下走,那麼就能走到所在區域的最低點。——當然,如果山後面還有更深的山谷,那麼你可能找到的只是局部最低點,而並非世界最低點。
實際上,對於復雜的超多維度來說,找到世界最低點幾乎是不可能任務。我們唯一能做的就是多找幾個局部最低點,然後選擇其中最低的那個。
同樣,如果我們落腳在[x',y'],那麼可以嘗試對比[x'+0.1,y'],[x'-0.1,y'],[x',y'-0.1],[x',y'+0.1],如果[x'+0.1,y']是最低的,那麼我們就走到這里,然後繼續嘗試對比四周點的高度。這就是梯度下降的演算法。
如下圖,我們沿著虛線一步一步下山找到最低點。
首先快速的從下圖了解幾個基本概念。
下圖的弧線表示的是某個函數y=f(x),比如拋物線方程y=x 2 。
曲線上任取兩個點a,b,它們對應x和x+dx。(d是指德爾塔大寫Δ,小寫δ)
ab兩點對應的y的差是dy。
現在直線ab看上去是曲線的割線(有ab兩個交點)。
假設b點沿著曲線,越來越靠近a點,那麼dx極限趨近於0,這時候dy也會越來越小趨近於0,但是!我們會意識到dy/dx永遠不會是0,而最終它仍然是角∠cab的對邊比鄰邊,也就是正切三角函數值。
實際上,這也正是曲線的切線的定義。
可以想像,我們取的a點越是靠右,那麼這個切線越是豎直。
如果我們把這個切線看做表示某個一次方程,如y=mx+n這種形式,那麼a點越靠右,直線越豎直,m值也就越大。
我們把m值叫做直線的斜率。
導數derivative ,一元函數y=f(x)(即因變數y只受到一個自變數x影響的函數)中任意取x,如果x增加極小趨近於0的Δx(或者寫為dx),那麼y相應的被增加Δy(或者寫作dy),那麼導數就是dy/dx,而又有dy=f(x+dx)-f(x),所以:
從函數的曲線圖上可以看到,某點的導數就是dx趨近於0時候∠cab的正切,導數反映了切線的陡峭程度,也就是y隨著x變化的快慢程度。
微分differential ,簡單說就是Δx和Δy,或者記作dx和dy。x稱之為自變數,y稱之為因變數,那麼x趨近於最小的時候的值,就是x的微分(趨近0又不是0的那個神秘值),同樣y的微分也是這個意思,總之是想得到又摸不到的神奇值。
斜率slope ,一元一次函數(直線方程)y=mx+n的系數m值。在這里就是a點的導數值f'(x)。
切線tangent ,某個點a的切線,就是經過a點的,以A點斜率為系數的方程y=f'(x)x+n所表示的直線。
自變數dependent variable和因變數 independent variable ,x自己的變化,引發y被動變化。
好了,我們來看 多變數微分Multivariable differential 。
上面都是一個y收到一個x的影響y=f(x),多變數就是不止受到一個自變數的影響,我們以最簡單的z=f(x,y)為例,z=x 2 +y 2 。
綠軸x的變化和紅軸y的變化,都會對應藍軸z的變化。
x從負無窮到正無窮無限種可能,y也是無限種可能,x和y復合到一起就在水平方向覆蓋了全部地面,z值有高有低,就像現實世界中的海拔一樣,把xy平面凸起或凹陷。(圖中粉色沒有畫出全部曲面)
我們可以想像,這時候不能討論A點的切線了,而應該考慮它的 切平面tangent plane (下圖綠色平面)。
方向導數directional derivative ,就是曲面上過A點的任意曲線的切線(下圖紫色線)組成的平面,就是切平面。
這么多紫色的方向中,哪一個方向最陡峭?對於這個z=x 2 +y 2 函數來說,明顯是最接近豎直朝上的那個箭頭和最接近豎直朝下的那個箭頭。
和曲線一樣道理,越陡峭意味著z對x、y的變化越敏感,或者說dx、dy的變化會引發更多的dz。
梯度gradient ,我們規定,能夠引發因變數最快變化的那個切線正方向,就叫做曲面方程上這個點的梯度。注意梯度是個xyz表示的三維方向,例如[0,0,1]表示z軸豎直向上,[0.1,0.1,1]就往xy的正方向偏一點點。
對於只有xy兩個變數的三維曲面來說,我們還可以只是考慮x+0.1,x-0.1,y+0.1,y-0.1這樣的試探方法找到最低點,只要2*2=4次就可以了,周全一點也就8次。
但是對於我們手寫數字識別中13002個自變數來說,那就要2 13002 次,這是不可行的。
借用多元微分,我們可以找到13002個自變數某一隨機點對應的切平面(實際早已不是什麼平面了,我們姑且這么說),也可以計算出其中變化最快的方向,就是梯度,數學家已經證明,不管多少個維度,沿著梯度往前走一步,都能獲得最快變化後新的一個點,這個點是一個n維向量,對於我們的案例來說就是13003個新數字組成的數組[0.322,0.123,0.55,0.222,...0.233]共13003個數字。
唯一要說明的一點不同就是,為了找最低點,我們不是往上走,而是往相反的負方向,朝下走。
步長step size ,就是我們每次沿著 負梯度 往下走多遠,在機器學習演算法裡面它叫做 學習率learning rate ,同樣道理,步子邁小了走得太慢,找到最低點耗時間太久,步子太大了容易跳過最低點(注意,1萬多維的復雜情況不是我們上面三維漏斗曲面那麼簡單可以描述的)。所以我們經常設置0.00001這樣小的數字,好在很多機器學習程序都會適當的自動調整它(比如Tensorflow中的梯度下降優化GradientDescentOptimizer),實際上不會讓它太慢。
同時,我們從上圖中看到,計算出的負梯度是由很多數字組成的數組,每個數字代表一個維度(就像xy那樣),所以我們只要在原來的位置點坐標(比如[x,y])上分別把這個梯度(比如[0.1,-0.3])加上去就能得到新的點([x+0.1,y-0.3])。
內容小結
如果您發現文章錯誤,請不吝留言指正;
如果您覺得有用,請點喜歡;
如果您覺得很有用,感謝轉發~
END
⑻ 神經網路中訓練函數(基本梯度下降法、BP演算法)和優化演算法(SDG,ADAM)有什麼關系
traingdx 有動量和自適應lr的梯度下降法 trainlm Levenberg - Marquardt方法 traind 梯度下降法
⑼ 神經網路中rprop是什麼演算法
對於bp神經網路來說沒有固定的標准可以得到最好的bp網路,設計好後只能手動修改參數然後選擇最好的。下邊是個分類的例子
clc
clear
close all
%---------------------------------------------------
% 產生訓練樣本與測試樣本,每一列為一個樣本
P1 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];
T1 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];
P2 = [rand(3,5),rand(3,5)+1,rand(3,5)+2];
T2 = [repmat([1;0;0],1,5),repmat([0;1;0],1,5),repmat([0;0;1],1,5)];
%---------------------------------------------------
% 歸一化
[PN1,minp,maxp] = premnmx(P1);
PN2 = tramnmx(P2,minp,maxp);
%---------------------------------------------------
% 設置網路參數
NodeNum = 10; % 隱層節點數
TypeNum = 3; % 輸出維數
TF1 = 'tansig';TF2 = 'purelin'; % 判別函數(預設值)
%TF1 = 'tansig';TF2 = 'logsig';
%TF1 = 'logsig';TF2 = 'purelin';
%TF1 = 'tansig';TF2 = 'tansig';
%TF1 = 'logsig';TF2 = 'logsig';
%TF1 = 'purelin';TF2 = 'purelin';
net = newff(minmax(PN1),[NodeNum TypeNum],{TF1 TF2});
%---------------------------------------------------
% 指定訓練參數
% net.trainFcn = 'traingd'; % 梯度下降演算法
% net.trainFcn = 'traingdm'; % 動量梯度下降演算法
%
% net.trainFcn = 'traingda'; % 變學習率梯度下降演算法
% net.trainFcn = 'traingdx'; % 變學習率動量梯度下降演算法
%
% (大型網路的首選演算法 - 模式識別)
% net.trainFcn = 'trainrp'; % RPROP(彈性bp)演算法,內存需求最小
%
% 共軛梯度演算法
% net.trainFcn = 'traincgf'; % Fletcher-Reeves修正演算法
% net.trainFcn = 'traincgp'; % Polak-Ribiere修正演算法,內存需求比Fletcher-Reeves修正演算法略大
% net.trainFcn = 'traincgb'; % Powell-Beal復位演算法,內存需求比Polak-Ribiere修正演算法略大
% (大型網路的首選演算法 - 函數擬合,模式識別)
% net.trainFcn = 'trainscg'; % Scaled Conjugate Gradient演算法,內存需求與Fletcher-Reeves修正演算法相同,計算量比上面三種演算法都小很多
%
% net.trainFcn = 'trainbfg'; % Quasi-Newton Algorithms - BFGS Algorithm,計算量和內存需求均比共軛梯度演算法大,但收斂比較快
% net.trainFcn = 'trainoss'; % One Step Secant Algorithm,計算量和內存需求均比BFGS演算法小,比共軛梯度演算法略大
%
% (中小型網路的首選演算法 - 函數擬合,模式識別)
net.trainFcn = 'trainlm'; % Levenberg-Marquardt演算法,內存需求最大,收斂速度最快
%
% net.trainFcn = 'trainbr'; % 貝葉斯正則化演算法
%
% 有代表性的五種演算法為:'traingdx','trainrp','trainscg','trainoss', 'trainlm'
%---------------------%
net.trainParam.show = 1; % 訓練顯示間隔
net.trainParam.lr = 0.3; % 學習步長 - traingd,traingdm
net.trainParam.mc = 0.95; % 動量項系數 - traingdm,traingdx
net.trainParam.mem_rec = 10; % 分塊計算Hessian矩陣(僅對Levenberg-Marquardt演算法有效)
net.trainParam.epochs = 1000; % 最大訓練次數
net.trainParam.goal = 1e-8; % 最小均方誤差
net.trainParam.min_grad = 1e-20; % 最小梯度
net.trainParam.time = inf; % 最大訓練時間
%---------------------------------------------------
% 訓練與測試
net = train(net,PN1,T1); % 訓練
%---------------------------------------------------
% 測試
Y1 = sim(net,PN1); % 訓練樣本實際輸出
Y2 = sim(net,PN2); % 測試樣本實際輸出
Y1 = full(compet(Y1)); % 競爭輸出
Y2 = full(compet(Y2));
%---------------------------------------------------
% 結果統計
Result = ~sum(abs(T1-Y1)) % 正確分類顯示為1
Percent1 = sum(Result)/length(Result) % 訓練樣本正確分類率
Result = ~sum(abs(T2-Y2)) % 正確分類顯示為1
Percent2 = sum(Result)/length(Result) % 測試樣本正確分類率