亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

基于BP神經(jīng)網(wǎng)絡的人臉識別

izhuhaodev / 1457人閱讀

摘要:有研究證明,三層的人工神經(jīng)網(wǎng)絡可以模擬各種函數(shù)。三神經(jīng)網(wǎng)絡神經(jīng)網(wǎng)絡是一種按誤差反向傳播算法訓練的多層前饋網(wǎng)絡,是目前應用最廣泛的神經(jīng)網(wǎng)絡模型之一。

一.閾值邏輯單元

 閾值邏輯單元(threshold logic unit ,TLU),它可以輸入一組加權系數(shù)的量,對它們進行求和,如果這個和達到或者超過了某個閾值,輸出一個量。例如,輸入為a1, a2, ..., an和權值 w1, w2,?..., wn。接著是求和計算出的   ai x wi?,產(chǎn)生了激發(fā)層 t,換一種方法表示:
    t = f((a1 x w1)+(a2 x w2)+...+(aI x wI)+...+ (an x wn)+b)


我理解的閾值邏輯單元就是用于解決多維線性加權求和問題的工具,那么遇到復雜問題該如何做呢?
二.人工神經(jīng)網(wǎng)絡

  人工神經(jīng)網(wǎng)絡(Artificial Neural Networks,簡寫為ANNs)也簡稱為神經(jīng)網(wǎng)絡(NNs)或稱作連接模型(Connection Model),它是一種模仿動物神經(jīng)網(wǎng)絡行為特征,進行分布式并行信息處理的算法數(shù)學模型。這種網(wǎng)絡依靠系統(tǒng)的復雜程度,通過調(diào)整內(nèi)部大量節(jié)點之間相互連接的關系,從而達到處理信息的目的。


通過將多個閾值邏輯單元組合,形成網(wǎng)絡,用來模擬非線性的問題。有研究證明,三層的人工神經(jīng)網(wǎng)絡可以模擬各種函數(shù)。
三.BP神經(jīng)網(wǎng)絡

  BP(Back Propagation)神經(jīng)網(wǎng)絡是一種按誤差反向傳播算法訓練的多層前饋網(wǎng)絡,是目前應用最廣泛的神經(jīng)網(wǎng)絡模型之一。BP網(wǎng)絡能學習和存貯大量的輸入-輸出模式映射關系,而無需事前揭示描述這種映射關系的數(shù)學方程。它的學習規(guī)則是使用梯度下降法,通過反向傳播來不斷調(diào)整網(wǎng)絡的權值和閾值,使網(wǎng)絡的誤差平方和最小。
 這里利用了偏導數(shù)的知識去推導計算公式,具體我沒有列出,我自己在理解的時候是讀了《人工智能》(機械工業(yè)出版社),感興趣的朋友可以自己看一下。
 BP神經(jīng)網(wǎng)絡調(diào)整權值的過程更像是一種函數(shù)圖像逼近的過程,首先猜測一個函數(shù),然后讀入一個數(shù)據(jù)點,根據(jù)數(shù)據(jù)點和函數(shù)圖像之間的差距調(diào)整函數(shù),使得函數(shù)圖像更符合數(shù)據(jù)。不斷迭代,使得整個數(shù)據(jù)樣本都較為符合我們估計得函數(shù)。

四.步驟:
1.對權系數(shù)置初值
2.輸入一組樣本及它的希望輸出
3.計算實際輸出值
4.計算誤差值
5.反向傳播誤差值并調(diào)整權值
6.不斷訓練(重復步驟2~5)
7.利用完成后的神經(jīng)網(wǎng)絡進行預測

五.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;// 隱藏層節(jié)點個數(shù)
private byte[] imageinfor = new byte[374];// 存放圖像信息
private double[] input = new double[picSize + 1];// 歸一化后的圖像信息
private double[][] inputWeight = new double[hiddenSize][picSize + 1];// 輸入層參數(shù)
private double[] alpha1 = new double[hiddenSize];// 隱藏層調(diào)整的梯度
private double[] hiddenWeight = new double[hiddenSize + 1];// 隱藏層參數(shù)
private double[] hiddenOutput = new double[hiddenSize + 1];// 隱藏層輸出
private double alpha2;// 輸出層調(diào)整的梯度
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;
        }
            
    }
}

}
這里我采用的數(shù)據(jù)的格式是PGM,19*19大小的,訓練集一共有4800張,一半正例一半反例。
具體的實現(xiàn),我感覺代碼寫的比較清楚,我就不贅述了。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/19604.html

相關文章

  • 基于BP神經(jīng)網(wǎng)絡人臉識別

    摘要:有研究證明,三層的人工神經(jīng)網(wǎng)絡可以模擬各種函數(shù)。三神經(jīng)網(wǎng)絡神經(jīng)網(wǎng)絡是一種按誤差反向傳播算法訓練的多層前饋網(wǎng)絡,是目前應用最廣泛的神經(jīng)網(wǎng)絡模型之一。 一.閾值邏輯單元 閾值邏輯單元(threshold logic unit ,TLU),它可以輸入一組加權系數(shù)的量,對它們進行求和,如果這個和達到或者超過了某個閾值,輸出一個量。例如,輸入為a1, a2, ..., an和權值 w1, w2...

    羅志環(huán) 評論0 收藏0
  • Ruff Chain 雙周報 | 5月13日-5月24日

    摘要:據(jù)悉,上海的人工智能和物聯(lián)網(wǎng)實驗室是微軟全球的第四個實驗室。微軟實驗室致力于為來自各個行業(yè)的企業(yè)創(chuàng)造價值,全球已累計服務企業(yè)余個,超過半數(shù)的企業(yè)有多個項目在不同時段獲得了微軟實驗室的指導。 showImg(https://segmentfault.com/img/bVbrOPB?w=1280&h=719);在過去的兩周,RuffChain 完成了測試網(wǎng)絡的代碼審計工作,目前正在進行主網(wǎng)...

    shiina 評論0 收藏0
  • 淺析 Hinton 最近提出 Capsule 計劃

    摘要:近幾年以卷積神經(jīng)網(wǎng)絡有什么問題為主題做了多場報道,提出了他的計劃。最初提出就成為了人工智能火熱的研究方向。展現(xiàn)了和玻爾茲曼分布間驚人的聯(lián)系其在論文中多次稱,其背后的內(nèi)涵引人遐想。 Hinton 以深度學習之父 和 神經(jīng)網(wǎng)絡先驅 聞名于世,其對深度學習及神經(jīng)網(wǎng)絡的諸多核心算法和結構(包括深度學習這個名稱本身,反向傳播算法,受限玻爾茲曼機,深度置信網(wǎng)絡,對比散度算法,ReLU激活單元,Dropo...

    Donald 評論0 收藏0
  • 淺談人臉識別技術方法和應用

    摘要:人臉識別技術所獨具的活性判別能力保證了他人無法以非活性的照片木偶蠟像來欺騙識別系統(tǒng)。人臉識別技術所采用的依據(jù)是人臉照片或實時攝取的人臉圖像,因而無疑是最容易獲得的。 人臉識別是近年來模式識別、圖像處理、機器視覺、神經(jīng)網(wǎng)絡以及認知科學等領域研究的熱點課題之一,被廣泛應用于公共安全(罪犯識別等)...

    Charles 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<