BP演算法程式練習 doing

2021-10-07 04:44:17 字數 2916 閱讀 2196

目錄

一、先定義需要用到的結構

1、輸入層

2、隱藏層

3、輸出層

二、bp演算法 (doing)

#pragma once

#ifndef inputlayer_h

#define inputlayer_h

#include"header.h"

class inlayer ;

#endif // !inputlayer_h

#pragma once

#ifndef hiddenlayer_h

#define hiddenlayer_h

#include"header.h"

class hiddenlayer ;

#endif // !hiddenlayer_h

#pragma once

#ifndef outputlayer_h

#define oputputlayer_h

class outlayer ;

#endif // !inputlayer_h

#pragma once

#include"header.h"

#include"inlayer.h"

#include"hiddenlayer.h"

#include"outlayer.h"

#define innodenum 2 // 輸入層節點數

#define hiddennodenum 4 // 隱藏層節點數

#define outnodenum 1 // 輸出層節點數

#define totallayer 3

typedef struct sample sample;

class bpnet

; bpnet(std::string &filenamne); //建構函式,初始化 權重

void forwardpropagation();

void backpropagation();

void train(std::vectorsamplegroup);

void prediction(std::vectortestgroup);

~bpnet(){}

private:

double error; //誤差率

double learnstep = 0.1; // 學習率

std::vector* inlayernode;

std::vector* hiddenlayernode; // 乙個隱藏層,多個隱藏層就用矩陣arma::mat

std::vector* outlayernode;

private:

void inputinitw(std::vector&inlayer);

void hiddeninitw(std::vector& hiddenlayer);

void readinputdata();

};

#include"header.h"

#include "bpnet.h"

using namespace std;

inline double getrandom()

inline double sigmoid(double &z)

void bpnet::inputinitw(std::vector& inlayernode) }}

void bpnet::hiddeninitw(std::vector& hiddenlayernode) }}

bpnet::bpnet(std::string& filenamne)

void bpnet::forwardpropagation()

// 加上偏移量

z += innode[0].bias * innode[0].weight[0];

double a = sigmoid(z);

hiddennode[i].inputvalue = z;

hiddennode[i].outputvalue = a;

} // hidden layer to out layer

for (int i = 1; i <= outnodenum; i++)

z += hiddennode[0].bias * hiddennode[0].weight[0];

double a = sigmoid(z);

outnode[i].inputvalue = z;

outnode[i].outputvalue = a;

}} void bpnet::backpropagation()

//隱藏層誤差

auto& hiddennode = *hiddenlayernode;

for (int i = 1; i <= hiddennodenum; i++)

delta = delta * hiddennode[i].outputvalue * (1 - hiddennode[i].outputvalue);

hiddennode[i].delta = delta;

} //更新權重

for (int i = 1; i <= hiddennodenum; i++)

hiddennode[i].weight[j] -= learnstep * err;

} auto& innode = *inlayernode;

for (int i = i; i <= innodenum; i++)

innode[i].weight[j] -= learnstep * err;

}}

BP演算法調研

bp演算法,即反向傳播方法,是用來訓練前向網路的一種普遍演算法。課本 artifitial intelligence a new synthesis,nils j.nilsson 提供了演算法實現方式,每乙個輸入樣本,利用遞迴等式,根據期望值與實際輸出值的誤差,從後向前逐步調整權重,從而實現網路的訓...

BP演算法推導

反向傳播演算法是深度學習的基礎之一,其主要的核心就是對代價函式 e 關於權重 w 或偏置 b 的偏導數 的表示式。這個表示式代表在改變權值和偏置時,代價函式變化的快慢。使用 w l 表示從 l 1 層的 k 神經元到 l 層的 j 神經元上的權重。之所以 l 的序號在 l 1 層的序號之前,是因為後...

BP演算法示例

誤差處理情況,第一種計算誤差的方式是將簡單的將網路計算結果與正確結果相減,但採用這種做法,如果我們把所有誤差相加在一起,結果居然為零,因為第乙個節點的結果與正確結果的差值和第二個節點結果與正確結果的差值剛好相反,於是誤差就相互抵消掉,由此直接將兩者相減不是一種理想的誤差計算方式。第二種是相減後求絕對...