摘要:有研究證明,三層的人工神經網絡可以模擬各種函數。三神經網絡神經網絡是一種按誤差反向傳播算法訓練的多層前饋網絡,是目前應用最廣泛的神經網絡模型之一。
一.閾值邏輯單元
閾值邏輯單元(threshold logic unit ,TLU),它可以輸入一組加權系數的量,對它們進行求和,如果這個和達到或者超過了某個閾值,輸出一個量。例如,輸入為a1, a2, ..., an和權值 w1, w2,?..., wn。接著是求和計算出的 ai x wi?,產生了激發層 t,換一種方法表示: t = f((a1 x w1)+(a2 x w2)+...+(aI x wI)+...+ (an x wn)+b)
我理解的閾值邏輯單元就是用于解決多維線性加權求和問題的工具,那么遇到復雜問題該如何做呢?
二.人工神經網絡
人工神經網絡(Artificial Neural Networks,簡寫為ANNs)也簡稱為神經網絡(NNs)或稱作連接模型(Connection Model),它是一種模仿動物神經網絡行為特征,進行分布式并行信息處理的算法數學模型。這種網絡依靠系統的復雜程度,通過調整內部大量節點之間相互連接的關系,從而達到處理信息的目的。
通過將多個閾值邏輯單元組合,形成網絡,用來模擬非線性的問題。有研究證明,三層的人工神經網絡可以模擬各種函數。
三.BP神經網絡
BP(Back Propagation)神經網絡是一種按誤差反向傳播算法訓練的多層前饋網絡,是目前應用最廣泛的神經網絡模型之一。BP網絡能學習和存貯大量的輸入-輸出模式映射關系,而無需事前揭示描述這種映射關系的數學方程。它的學習規則是使用梯度下降法,通過反向傳播來不斷調整網絡的權值和閾值,使網絡的誤差平方和最小。 這里利用了偏導數的知識去推導計算公式,具體我沒有列出,我自己在理解的時候是讀了《人工智能》(機械工業出版社),感興趣的朋友可以自己看一下。 BP神經網絡調整權值的過程更像是一種函數圖像逼近的過程,首先猜測一個函數,然后讀入一個數據點,根據數據點和函數圖像之間的差距調整函數,使得函數圖像更符合數據。不斷迭代,使得整個數據樣本都較為符合我們估計得函數。
四.步驟:
1.對權系數置初值
2.輸入一組樣本及它的希望輸出
3.計算實際輸出值
4.計算誤差值
5.反向傳播誤差值并調整權值
6.不斷訓練(重復步驟2~5)
7.利用完成后的神經網絡進行預測
五.Java代碼:
import java.io.File;
import java.io.RandomAccessFile;
import java.util.Random;
public class FaceRecognition {
private int picSize = 19 * 19;// 圖像大小 private int hiddenSize = 12;// 隱藏層節點個數 private byte[] imageinfor = new byte[374];// 存放圖像信息 private double[] input = new double[picSize + 1];// 歸一化后的圖像信息 private double[][] inputWeight = new double[hiddenSize][picSize + 1];// 輸入層參數 private double[] alpha1 = new double[hiddenSize];// 隱藏層調整的梯度 private double[] hiddenWeight = new double[hiddenSize + 1];// 隱藏層參數 private double[] hiddenOutput = new double[hiddenSize + 1];// 隱藏層輸出 private double alpha2;// 輸出層調整的梯度 private double output;// 輸出層 private double ci = 0.3;// 學習率 private double opt;// 期望輸出 Random random = new Random(); private double [] pro; public FaceRecognition() { } // 初始化 public void init() { for (int i = 0; i < hiddenSize; i++) { for (int j = 0; j < picSize + 1; j++) inputWeight[i][j] = random.nextDouble() * 2 - 1; // inputWeight[i][j] =0; } for (int i = 0; i < hiddenSize + 1; i++) { hiddenWeight[i] = random.nextDouble() * 2 - 1; // hiddenWeight[i]=0; } } // sigmoid private double Sigmoid(double x) { return 1.0d / (1.0d + Math.exp(-x)); } // 圖像文件讀入 public void PGMReader(String filename) { File file = new File(filename); try { RandomAccessFile in = new RandomAccessFile(file, "r"); in.read(imageinfor); in.close(); } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < picSize; i++) { int temp = (int) imageinfor[i + 13]; input[i] = (double) (temp + 128) / 255; } input[picSize] = 1.0; } public void PGMReader(File file) { try { RandomAccessFile in = new RandomAccessFile(file, "r"); in.read(imageinfor); in.close(); } catch (Exception e) { e.printStackTrace(); } for (int i = 0; i < picSize; i++) { int temp = (int) imageinfor[i + 13]; input[i] = (double) (temp + 128) / 255; } input[picSize] = 1.0; } public void setOpt(double opt) { this.opt = opt; } private void forward() { for (int i = 0; i < hiddenSize; i++) { double temp = 0; for (int j = 0; j < picSize + 1; j++) { temp += input[j] * inputWeight[i][j]; } hiddenOutput[i] = Sigmoid(temp); } hiddenOutput[hiddenSize] = 1.0; double temp = 0; for (int i = 0; i < hiddenSize + 1; i++) { temp += hiddenOutput[i] * hiddenWeight[i]; } output = Sigmoid(temp); } public void BP() { // 計算各層的梯度 alpha2 = (opt - output) * output * (1 - output); for (int i = 0; i < hiddenSize; i++) { alpha1[i] = hiddenOutput[i] * (1 - hiddenOutput[i]) * alpha2 * hiddenWeight[i]; } // 反向傳播 for (int i = 0; i < hiddenSize; i++) { hiddenWeight[i] += ((hiddenOutput[i] * alpha2 * ci) ); for (int j = 0; j < picSize + 1; j++) { inputWeight[i][j] +=((input[j] * alpha1[i] * ci)); } } hiddenWeight[hiddenSize]+=(hiddenOutput[hiddenSize] * alpha2 * ci); } public void train() { String non_facePath = "D://人工智能//face.train//train//non-face"; File non_facFile = new File(non_facePath); File[] non_faceList = non_facFile.listFiles(); String facePath = "D://人工智能//face.train//train/face"; File faceFile = new File(facePath); File[] faceList = faceFile.listFiles(); init(); pro =new double [151]; for(int i =0;i<151;i++){ int right = 0; int facenumber =0; int nonfacenumber =0; for (int j = 0; j < 4000; j++) { int temp = random.nextInt(); if(temp%2 ==0) { // 正例訓練 this.setOpt(1.0); this.PGMReader(faceList[facenumber]); this.forward(); this.BP(); facenumber++; } else{ // 反例訓練 this.setOpt(0.0); this.PGMReader(non_faceList[nonfacenumber]); this.forward(); this.BP(); nonfacenumber++; } } for (int j = 2000; j <2400; j++) { { // 正例測試 this.PGMReader(faceList[j]); this.forward(); if (output > 0.5) right++; } { // 反例測試 this.PGMReader(non_faceList[j]); this.forward(); if (output < 0.5) right++; } } pro[i] = (double) right / 800; if(i%10==0) { System.out.println("第"+i+"次迭代估算正確率為:" + pro[i]); } if(pro[i]>=0.95){ System.out.println("第"+i+"次迭代估算正確率為:" + pro[i]); break; } } }
}
這里我采用的數據的格式是PGM,19*19大小的,訓練集一共有4800張,一半正例一半反例。
具體的實現,我感覺代碼寫的比較清楚,我就不贅述了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/19604.html
摘要:有研究證明,三層的人工神經網絡可以模擬各種函數。三神經網絡神經網絡是一種按誤差反向傳播算法訓練的多層前饋網絡,是目前應用最廣泛的神經網絡模型之一。 一.閾值邏輯單元 閾值邏輯單元(threshold logic unit ,TLU),它可以輸入一組加權系數的量,對它們進行求和,如果這個和達到或者超過了某個閾值,輸出一個量。例如,輸入為a1, a2, ..., an和權值 w1, w2...
摘要:據悉,上海的人工智能和物聯網實驗室是微軟全球的第四個實驗室。微軟實驗室致力于為來自各個行業的企業創造價值,全球已累計服務企業余個,超過半數的企業有多個項目在不同時段獲得了微軟實驗室的指導。 showImg(https://segmentfault.com/img/bVbrOPB?w=1280&h=719);在過去的兩周,RuffChain 完成了測試網絡的代碼審計工作,目前正在進行主網...
摘要:近幾年以卷積神經網絡有什么問題為主題做了多場報道,提出了他的計劃。最初提出就成為了人工智能火熱的研究方向。展現了和玻爾茲曼分布間驚人的聯系其在論文中多次稱,其背后的內涵引人遐想。 Hinton 以深度學習之父 和 神經網絡先驅 聞名于世,其對深度學習及神經網絡的諸多核心算法和結構(包括深度學習這個名稱本身,反向傳播算法,受限玻爾茲曼機,深度置信網絡,對比散度算法,ReLU激活單元,Dropo...
摘要:人臉識別技術所獨具的活性判別能力保證了他人無法以非活性的照片木偶蠟像來欺騙識別系統。人臉識別技術所采用的依據是人臉照片或實時攝取的人臉圖像,因而無疑是最容易獲得的。 人臉識別是近年來模式識別、圖像處理、機器視覺、神經網絡以及認知科學等領域研究的熱點課題之一,被廣泛應用于公共安全(罪犯識別等)...
閱讀 3355·2021-11-25 09:43
閱讀 3149·2021-10-11 10:58
閱讀 2751·2021-09-27 13:59
閱讀 3084·2021-09-24 09:55
閱讀 2175·2019-08-30 15:52
閱讀 1837·2019-08-30 14:03
閱讀 2264·2019-08-30 11:11
閱讀 2029·2019-08-28 18:12