1. 如何用神經網路遺傳演算法求極值
===============學習神經網路可以到<神經網路之家>================
可以先用matlab神經網路工具箱訓練網路,當網路訓練好之後,把網路存起來.
然後編寫遺傳演算法,你知道,遺傳演算法是每代不斷迭代的,然後每代會根據適應度決定是否進入下一代,這里的適應度你就用sim(net,x)得到的值的倒數(或者類似的)作為適應度,然後其它就和遺傳演算法沒什麼兩樣了.最後得到的最優解, 就是網路的最優解. 也就是你要的結果了.
不過兄弟,這想法很牛B,很值得鼓勵這樣的想法.但我不得不說兩句,從實際角度來說,這樣的實現沒有太大的意義. 你的目的就是想從數據中找到Y最小的時候,X的什麼值, 但數據上畢竟只是數據,不管你怎麼繞,透露出來的信息還是有限的,不管怎麼繞,其實數據能提供最大限度的信息就是:在Y=10.88時,即X1=25,X2=24....X6=1.5時,Y是最小值的, 這是數據能提供的最大限度的信息,你再怎麼繞, 其實當你懂得神經網路的深層原理時,你會發現,你的方案並沒能挖掘出更優的解(因為數據的信息是有限的),這只是把自己繞暈了
不過能有這樣的想法,兄弟肯定是個學習的好材料,加油.
===============學習神經網路可以到<神經網路之家>================
2. MATLAB中一些函數,用於神經網路
一:minmax()
minmax(A) 即是求解A矩陣中每個 行向量 中的最小值和最大值
eg:A=[1 2 4 -6 ;
3 -4 90 6;
4 6 -23 -35];
P=minmax(A)
P = -6 4
-4 90
-35 6
二:hold on 和hold off
hold on 是當前軸及圖像保持而不被刷新,准備接受此後將繪制的圖形,多圖共存.即,啟動圖形保持功能,當前坐標軸和圖形都將保持,從此繪制的圖形都將添加在這個圖形的基礎上,並自動調整坐標軸的范圍。
hold off 使當前軸及圖像不再具備被刷新的性質,新圖出現時,取消原圖。即,關閉圖形保持功能。
hold on 和hold off,是相對使用的
前者的意思是,你在當前圖的軸(坐標系)中畫了一幅圖,再畫另一幅圖時,原來的圖還在,與新圖共存,都看得到
後者表達的是,你在當前圖的軸(坐標系)中畫了一幅圖,此時,狀態是hold off,則再畫另一幅圖時,原來的圖就看不到了,在軸上繪制的是新圖,原圖被替換了。
三:rand 和 randn
rand是0-1的均勻分布,randn是均值為0方差為1的正態分布;
rand(n)或randn(n)生成n*n的隨機數矩陣。
rand(n,m)或randn(m,n)生成m*n的隨機數矩陣。
四:gac、gca 和 gco
gcf 返回當前Figure對象的句柄值
gca 返回當前axes對象的句柄值
gco 返回當前滑鼠單擊的句柄值,該對象可以是除root對象外的任意圖形對象,並且Matlab會把當前圖形對象的句柄值存放在Figure的CurrentObject屬性中。
五:compet
compet是神經網路的競爭傳遞函數,用於指出矩陣中每列的最大值。對應最大值的行的值為1,其他行的值都為0。
六:bar和barn
二維條形圖:bar()
bar(Y) 如果Y為矢量,其每一個元素繪制一個條形;如果Y為矩陣,側bar函數對每一行元素繪制的條形進行分組。
bar(x,Y) 按x中指定的位置繪制Y中每一元素的條形。
bar(…,width) 設置相鄰條形的寬度並控制組內條形的分離,默認值為0.8,如果指定width=1,則組內的條形挨在一起。
bar(…,』style』) 指定繪制條形的類型,style有兩個選項:(1) stacked 矩陣Y中每一行繪制一個條形,條形的高度為行元素中元素的和,每一個條形都用多種顏色表示,顏色對應不同種類的元素並表示每行元素對總和的相對貢獻。(2) group 繪制n條形圖組,每一個條形組中有m個垂直條形,其中n對應矩陣Y的行數,m對應列數,group為style的默認值。
bar(…,LineSpec) 用LineSpec指定的顏色繪制條形。
h=bar(…) 返回圖形句柄。
barh(…) 繪制水平條形圖。
h=barh(…) 返回水平條形圖的圖形句柄。
三維條形圖:bar3()和barah()
bar3(Y) 繪制三維條形圖,如果Y為矢量,其每一個元素繪制一個條形;如果Y為矩陣,側bar函數對每一行元素繪制的條形進行分組。
bar3(x,Y) 按x中指定的位置繪制Y中每一元素的條形。
bar3(…,width) 設置相鄰條形的寬度並控制組內條形的分離,默認值為0.8,如果指定width=1,則組內的條形挨在一起。
bar3(…,』style』) 指定繪制條形的類型,style有3個選項:(1) stacked 矩陣Y中每一行繪制一個條形,條形的高度為行元素中元素的和,每一個條形都用多種顏色表示,顏色對應不同種類的元素並表示每行元素對總和的相對貢獻。(2) group 繪制n條形圖組,每一個條形組中有m個垂直條形,其中n對應矩陣Y的行數,m對應列數,group為style的默認值。(3) detached 在x方向用單獨的條形塊繪制Y中的每一行元素,detached為style的默認值;
bar3(…,LineSpec) 用LineSpec指定的顏色繪制條形。
h=bar3(…) 返回三維條形圖的圖形句柄。
barh(…) 繪制三維水平條形圖。
h=barh(…) 返回三維水平條形圖的圖形句柄。
三維條形圖有兩種顯示形式:分組形式和行列形式。
未完待續
3. CNN(卷積神經網路)演算法
基礎知識講解:
卷積:通過兩個函數f 和g 生成第三個函數的一種數學運算元,表徵函數f 與g經過翻轉和平移的重疊部分函數值乘積對重疊長度的積分。
前饋神經網路:各神經元分層排列,每個神經元只與前一層的神經元相連,接收前一層的輸出,並輸出給下一層.各層間沒有反饋。
卷積神經網路:是一類包含卷積計算且具有深度結構的前饋神經網路
卷積核:就是圖像處理時,給定輸入圖像,輸入圖像中一個小區域中像素加權平均後成為輸出圖像中的每個對應像素,其中權值由一個函數定義,這個函數稱為卷積核。
下采樣:對於一個樣值序列間隔幾個樣值取樣一次,這樣得到新序列就是原序列的下采樣。
結構介紹
輸入層:用於數據輸入
卷積層:利用卷積核進行特徵提取和特徵映射
激勵層:非線性映射,卷積是線性映射,彌補不足
池化層:進行下采樣,對特徵圖稀疏處理,減少數據運算量
全連接層:在CNN的尾部進行重新擬合,減少特徵信息的損失
輸入層:
在CNN的輸入層中,(圖片)數據輸入的格式 與 全連接神經網路的輸入格式(一維向量)不太一樣。CNN的輸入層的輸入格式保留了圖片本身的結構。
對於黑白的 28×28 的圖片,CNN的輸入是一個 28×28 的的二維神經元:
而對於RGB格式的28×28圖片,CNN的輸入則是一個 3×28×28 的三維神經元(RGB中的每一個顏色通道都有一個 28×28 的矩陣)
卷積層:
左邊是輸入,中間部分是兩個不同的濾波器Filter w0、Filter w1,最右邊則是兩個不同的輸出。
ai.j=f(∑m=02∑n=02wm,nxi+m,j+n+wb)
wm,n:filter的第m行第n列的值
xi,j: 表示圖像的第i行第j列元素
wb:用表示filter的偏置項
ai,j:表示Feature Map的第i行第j列元素
f:表示Relu激活函數
激勵層:
使用的激勵函數一般為ReLu函數:
f(x)=max(x,0)
卷積層和激勵層通常合並在一起稱為「卷積層」。
池化層:
當輸入經過卷積層時,若感受視野比較小,布長stride比較小,得到的feature map (特徵圖)還是比較大,可以通過池化層來對每一個 feature map 進行降維操作,輸出的深度還是不變的,依然為 feature map 的個數。
池化層也有一個「池化視野(filter)」來對feature map矩陣進行掃描,對「池化視野」中的矩陣值進行計算,一般有兩種計算方式:
Max pooling:取「池化視野」矩陣中的最大值
Average pooling:取「池化視野」矩陣中的平均值
訓練過程:
1.前向計算每個神經元的輸出值aj( 表示網路的第j個神經元,以下同);
2.反向計算每個神經元的誤差項σj,σj在有的文獻中也叫做敏感度(sensitivity)。它實際上是網路的損失函數Ed對神經元加權輸入的偏導數
3.計算每個神經元連接權重wi,j的梯度( wi,j表示從神經元i連接到神經元j的權重)
1.最後,根據梯度下降法則更新每個權重即可。
參考: https://blog.csdn.net/love__live1/article/details/79481052
4. 神經網路,最大值和最小值歸一化,是什麼意思
歸一化normalisation就是指把實際概率和為1的幾個值,根據計算出來的過程值(可能經過了某種變換、放縮,導致其不是真實值)進行放縮,使得其和的值為1.
比如在樸素貝葉斯裡面,計算條件概率時候,可以把展開後的分母去掉(因為它是一個定值),直接用正反的條件概率求分子的值,比如最後求出來是<0.4,0.2>,然後我們知道這兩個概率和是1,於是就可以歸一化成<0.666,0.333>.
又比如說softmax激活函數,最後輸出的是每個種類的概率,使其和相加為1,這也是歸一化。
5. Matlab小問題 神經網路能求極值嗎
可以啊,神經網路其實就是一種數值擬合的方法,其意義和泰勒級數展開實際上是一樣的,只要你正確的擬合出了數據的規律是可以求得極大值的,而且神經網路的神經元函數都是非常好球微分的,所以可以用現在很多流行的數值方法,求極大值。
這里對於一維擬合需要使用小波函數,高維需要脊波函數,PID神經元網路可用於動態網路的無導師學習。
當然對於化工領域一些問題由於樣本非常有限無法找到數據的正確規律,所以可能存在預報困難的問題
6. 求人工神經網路的具體演算法,數學模型,比如求一個函數最優值之類的,不要各種亂七八糟的介紹,謝謝
神經網路就像多項式或者線性模型一樣,是個看不見表達式的模型,它的表達式就是網路,它比一般模型具有更高的自由度和彈性;同時它是一個典型的黑箱模型方法;比多項式等模型還黑。優化演算法,就是尋優的演算法,所謂尋優過程,就是尋找使目標函數最小時(都是統一表示成尋找使函數具有最小值)的自變數的值。回歸或者擬合一個模型,例如用一個多項式模型去擬合一組數據,其本質就是尋找使殘差平方和最小的參數值,這就是一個尋優的過程,其實就是尋找使函數F(x)值最小時的x的值;對於這個具體的尋找過程就涉及到演算法問題,就是如何計算。所謂演算法,是數值分析的一個范疇,就是解這問題的方法;例如一個一元二次方程 x^2-3x+1=0的解法,因為簡單可以直接求解,也可以用牛頓逐個靠近的方法求解,也即是迭代,慢慢接近真實解,如此下去不斷接近真值,要注意迭代演算法是涉及演算法精度的,這些迭代演算法是基於計算機的,演算法的初衷也是用近似的演算法用一定的精度來接近真實值。 比如上面的方程也可以用遺傳演算法來解,可以從一些初始值最終迭代到最佳解。神經網路在尋找網路的參數即權值的時候,也有尋找使訓練效果最好的過程,這也是尋優的過程,這里涉及到了演算法就是所謂的神經網路演算法,這和最小二乘演算法是一樣的道理;例如做響應面的時候,其實就是二次回歸,用最小二乘得到二次模型的參數,得到一個函數,求最大產物量就是求函數模型的最大值,怎麼算呢?頂點處如果導數為0,這個地方對應的x值就是最優的,二次模型簡單可以用偏導數=0來直接解決,這過程也可以遺傳演算法等來解決。說到底所謂尋優的本質就是,尋找函數極值處對應的自變數的值。
7. 神經網路中為什麼要用minmax(trainP),也就是說為什麼每一行都要找出最大值和最小值
newff函數的格式為:
net=newff(PR,[S1 S2 ...SN],{TF1 TF2...TFN},BTF,BLF,PF),函數newff建立一個可訓練的前饋網路。輸入參數說明:
PR:Rx2的矩陣以定義R個輸入向量的最小值和最大值;
Si:第i層神經元個數;
TFi:第i層的傳遞函數,默認函數為tansig函數;
BTF:訓練函數,默認函數為trainlm函數;
BLF:權值/閥值學習函數,默認函數為learngdm函數;
PF:性能函數,默認函數為mse函數。
這里的PR可以通過minmax(trainP)來快捷的實現,免去了手動生成threshold的麻煩。
8. 卷積神經網路
卷積神經網路 (Convolutional Neural Networks,CNN)是一種前饋神經網路。卷積神經網路是受生物學上感受野(Receptive Field)的機制而提出的。感受野主要是指聽覺系統、本體感覺系統和視覺系統中神經元的一些性質。比如在視覺神經系統中,一個神經元的感受野是指視網膜上的特定區域,只有這個區域內的刺激才能夠激活該神經元。
卷積神經網路又是怎樣解決這個問題的呢?主要有三個思路:
在使用CNN提取特徵時,到底使用哪一層的輸出作為最後的特徵呢?
答:倒數第二個全連接層的輸出才是最後我們要提取的特徵,也就是最後一個全連接層的輸入才是我們需要的特徵。
全連接層會忽視形狀。卷積層可以保持形狀不變。當輸入數據是圖像時,卷積層會以3維數據的形式接收輸入數據,並同樣以3維數據的形式輸出至下一層。因此,在CNN中,可以(有可能)正確理解圖像等具有形狀的數據。
CNN中,有時將 卷積層的輸入輸出數據稱為特徵圖(feature map) 。其中, 卷積層的輸入數據稱為輸入特徵圖(input feature map) , 輸出數據稱為輸出特徵圖(output feature map)。
卷積層進行的處理就是 卷積運算 。卷積運算相當於圖像處理中的「濾波器運算」。
濾波器相當於權重或者參數,濾波器數值都是學習出來的。 卷積層實現的是垂直邊緣檢測 。
邊緣檢測實際就是將圖像由亮到暗進行區分,即邊緣的過渡(edge transitions)。
卷積層對應到全連接層,左上角經過濾波器,得到的3,相當於一個神經元輸出為3.然後相當於,我們把輸入矩陣拉直為36個數據,但是我們只對其中的9個數據賦予了權重。
步幅為1 ,移動一個,得到一個1,相當於另一個神經單元的輸出是1.
並且使用的是同一個濾波器,對應到全連接層,就是權值共享。
在這個例子中,輸入數據是有高長方向的形狀的數據,濾波器也一樣,有高長方向上的維度。假設用(height, width)表示數據和濾波器的形狀,則在本例中,輸入大小是(4, 4),濾波器大小是(3, 3),輸出大小是(2, 2)。另外,有的文獻中也會用「核」這個詞來表示這里所說的「濾波器」。
對於輸入數據,卷積運算以一定間隔滑動濾波器的窗口並應用。這里所說的窗口是指圖7-4中灰色的3 × 3的部分。如圖7-4所示,將各個位置上濾
波器的元素和輸入的對應元素相乘,然後再求和(有時將這個計算稱為乘積累加運算)。然後,將這個結果保存到輸出的對應位置。將這個過程在所有位置都進行一遍,就可以得到卷積運算的輸出。
CNN中,濾波器的參數就對應之前的權重。並且,CNN中也存在偏置。
在進行卷積層的處理之前,有時要向輸入數據的周圍填入固定的數據(比如0等),這稱為填充(padding),是卷積運算中經常會用到的處理。比如,在圖7-6的例子中,對大小為(4, 4)的輸入數據應用了幅度為1的填充。「幅度為1的填充」是指用幅度為1像素的0填充周圍。
應用濾波器的位置間隔稱為 步幅(stride) 。
假設輸入大小為(H, W),濾波器大小為(FH, FW),輸出大小為(OH, OW),填充為P,步幅為S。
但是所設定的值必須使式(7.1)中的 和 分別可以除盡。當輸出大小無法除盡時(結果是小數時),需要採取報錯等對策。順便說一下,根據深度學習的框架的不同,當值無法除盡時,有時會向最接近的整數四捨五入,不進行報錯而繼續運行。
之前的卷積運算的例子都是以有高、長方向的2維形狀為對象的。但是,圖像是3維數據,除了高、長方向之外,還需要處理通道方向。
在3維數據的卷積運算中,輸入數據和濾波器的通道數要設為相同的值。
因此,作為4維數據,濾波器的權重數據要按(output_channel, input_channel, height, width)的順序書寫。比如,通道數為3、大小為5 × 5的濾
波器有20個時,可以寫成(20, 3, 5, 5)。
對於每個通道,均使用自己的權值矩陣進行處理,輸出時將多個通道所輸出的值進行加和即可。
卷積運算的批處理,需要將在各層間傳遞的數據保存為4維數據。具體地講,就是按(batch_num, channel, height, width)的順序保存數據。
這里需要注意的是,網路間傳遞的是4維數據,對這N個數據進行了卷積運算。也就是說,批處理將N次的處理匯總成了1次進行。
池化是縮小高、長方向上的空間的運算。比如,如圖7-14所示,進行將2 × 2的區域集約成1個元素的處理,縮小空間大小。
圖7-14的例子是按步幅2進行2 × 2的Max池化時的處理順序。「Max池化」是獲取最大值的運算,「2 × 2」表示目標區域的大小。如圖所示,從
2 × 2的區域中取出最大的元素。此外,這個例子中將步幅設為了2,所以2 × 2的窗口的移動間隔為2個元素。另外,一般來說,池化的窗口大小會和步幅設定成相同的值。比如,3 × 3的窗口的步幅會設為3,4 × 4的窗口的步幅會設為4等。
除了Max池化之外,還有Average池化等。相對於Max池化是從目標區域中取出最大值,Average池化則是計算目標區域的平均值。 在圖像識別領域,主要使用Max池化。 因此,本書中說到「池化層」時,指的是Max池化。
池化層的特徵
池化層有以下特徵。
沒有要學習的參數
池化層和卷積層不同,沒有要學習的參數。池化只是從目標區域中取最大值(或者平均值),所以不存在要學習的參數。
通道數不發生變化
經過池化運算,輸入數據和輸出數據的通道數不會發生變化。如圖7-15所示,計算是按通道獨立進行的。
對微小的位置變化具有魯棒性(健壯)
輸入數據發生微小偏差時,池化仍會返回相同的結果。因此,池化對輸入數據的微小偏差具有魯棒性。比如,3 × 3的池化的情況下,如圖
7-16所示,池化會吸收輸入數據的偏差(根據數據的不同,結果有可能不一致)。
經過卷積層和池化層之後,進行Flatten,然後丟到全連接前向傳播神經網路。
(找到一張圖片使得某個filter響應最大。相當於filter固定,未知的是輸入的圖片。)未知的是輸入的圖片???
k是第k個filter,x是我們要找的參數。?這里我不是很明白。我得理解應該是去尋找最具有代表性的特徵。
使用im2col來實現卷積層
卷積層的參數是需要學習的,但是池化層沒有參數需要學習。全連接層的參數需要訓練得到。
池化層不需要訓練參數。全連接層的參數最多。卷積核的個數逐漸增多。激活層的size,逐漸減少。
最大池化只是計算神經網路某一層的靜態屬性,沒有什麼需要學習的,它只是一個靜態屬性 。
像這樣展開之後,只需對展開的矩陣求各行的最大值,並轉換為合適的形狀即可(圖7-22)。
參數
• input_dim ― 輸入數據的維度:( 通道,高,長 )
• conv_param ― 卷積層的超參數(字典)。字典的關鍵字如下:
filter_num ― 濾波器的數量
filter_size ― 濾波器的大小
stride ― 步幅
pad ― 填充
• hidden_size ― 隱藏層(全連接)的神經元數量
• output_size ― 輸出層(全連接)的神經元數量
• weitght_int_std ― 初始化時權重的標准差
LeNet
LeNet在1998年被提出,是進行手寫數字識別的網路。如圖7-27所示,它有連續的卷積層和池化層(正確地講,是只「抽選元素」的子采樣層),最後經全連接層輸出結果。
和「現在的CNN」相比,LeNet有幾個不同點。第一個不同點在於激活函數。LeNet中使用sigmoid函數,而現在的CNN中主要使用ReLU函數。
此外,原始的LeNet中使用子采樣(subsampling)縮小中間數據的大小,而現在的CNN中Max池化是主流。
AlexNet
在LeNet問世20多年後,AlexNet被發布出來。AlexNet是引發深度學習熱潮的導火線,不過它的網路結構和LeNet基本上沒有什麼不同,如圖7-28所示。
AlexNet疊有多個卷積層和池化層,最後經由全連接層輸出結果。雖然結構上AlexNet和LeNet沒有大的不同,但有以下幾點差異。
• 激活函數使用ReLU。
• 使用進行局部正規化的LRN(Local Response Normalization)層。
• 使用Dropout
TF2.0實現卷積神經網路
valid意味著不填充,same是填充
or the SAME padding, the output height and width are computed as:
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))
And
For the VALID padding, the output height and width are computed as:
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
因此,我們可以設定 padding 策略。在 tf.keras.layers.Conv2D 中,當我們將 padding 參數設為 same 時,會將周圍缺少的部分使用 0 補齊,使得輸出的矩陣大小和輸入一致。