资讯专栏INFORMATION COLUMN

用C / C ++实现BP神经网络

haobowd / 1357人阅读

摘要:缘起最近跟着老师在学习神经网络,为了更加深刻地理解这个黑盒,我打算自己用将其实现一遍。

缘起

最近跟着老师在学习神经网络,为了更加深刻地理解这个黑盒,我打算自己用C/C++将其实现一遍。今天忙活了好一会儿,终于实现了一个BP神经网络,后期还会陆续实现CNN神经网络之类的,也会发上来和大家一起分享的~

因为最近比较忙,所以这里直接放代码了,关于一些原理以及自己的一点见解会在有空的时候整理出来的~



代码

main.cpp

#include 
#include 
#include "BPUtils.h"
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
vector>dataTest;
vectordataTestY;
vector>trainDataX;
vectortrainDataY;
int main() {
//    double m1[3][1]={{1},{2},{3}};
//    double m2[1][4]={1,2,3,4};
//    double m3[3][4];
//    dott(&m1[0][0],&m2[0][0],&m3[0][0],3,1,4);
//    for(int i=0;i<3;i++){
//        for(int j=0;j<4;j++){
//            cout<>dataX;
//    vectordataY;
//    for(int i=0;i<4;i++){
//        vectorvec;
//        for(int j=0;j<2;j++){
//            vec.push_back(i+j);
//        }
//        dataX.push_back(vec);
//    }
//    for(int i=0;i<4;i++){
//        for(int j=0;j<2;j++){
//            cout<


BPUtils.h

#ifndef BP_UTILS
#define BP_UTILS
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define random(x) (rand()%x)
using namespace std;
#define MAXSIZE 99
//全局变量
//测试集
extern vector>dataTest;
extern vectordataTestY;
extern vector>trainDataX;
extern vectortrainDataY;

vector split(const string& str, const string& delim) {
    vector res;
    if("" == str) return res;
    //先将要切割的字符串从string类型转换为char*类型
    char * strs = new char[str.length() + 1] ; //不要忘了
    strcpy(strs, str.c_str());

    char * d = new char[delim.length() + 1];
    strcpy(d, delim.c_str());

    char *p = strtok(strs, d);
    while(p) {
        string s = p; //分割得到的字符串转换为string类型
        res.push_back(s); //存入结果数组
        p = strtok(NULL, d);
    }

    return res;
}

double getMax(vector>dataSet){
    double MYMAX=-999;
    for(int i=0;i>dataSet){
    double MYMIN=999;
    for(int i=0;idataSet[i][j]){
                MYMIN=dataSet[i][j];
            }
        }
    }
    return MYMIN;
}

//数据归一化
//一般是x=(x-x.min)/x.max-x.min
void guiYiHua(vector>&dataSet){
    double MYMAX=getMax(dataSet);
    double MYMIN=getMin(dataSet);
    for(int i=0;ires;
    int ii=0;
    while(getline(f,line)){
        res=split(line,"	");
        vectorvec1;
        for(int i=0;ires;
    int ii=0;
    while(getline(f,line)){
        res=split(line,"	");
        vectorvec1;
        for(int i=0;i>VArr;
    //隐藏层到输出层的权值
    //行数为隐藏层单元个数
    //列数为输出层单元个数
    vector>WArr;
private:
    //矩阵乘积
    void dot(const double* m1,const double* m2,double *m3,int m,int n,int p){
        for(int i=0;i>vec,double *arr,int n){
        for(int i=0;ivec,double *arr){
        for(int i=0;i&vec,int m){
        for(int i=0;itest,double *ArrL2){
//        for(int i=0;ivec){
        int index=-1;
        double MYMAX=-999;
        for(int i=0;iinputLayers=_inputLayers;
        hidenLayers=_hidenLayers;
        outputLayers=_outputLayers;

        //构造V权值矩阵
        for(int i=0;ivec;
            for(int j=0;jvec;
            for(int j=0;j>dataX,vectordataY,double lr=0.03,int epochs=1000000){
        double arrL1[1][hidenLayers];
        //将VArr由vector转成arr
        double VArr_temp[inputLayers+1][hidenLayers];
        double hangx_temp[1][inputLayers+1];
        vectorToArr1(VArr,&VArr_temp[0][0],hidenLayers);
        double hangxT[inputLayers+1][1];
        double hangxDotVArr[1][hidenLayers];
        double arrL2[1][outputLayers];
        double WArr_temp[hidenLayers][outputLayers];
        double arrL2_delta[1][outputLayers];
        double arrL1_delta[1][hidenLayers];
        double E;
        double dao;
        double dotTemp[hidenLayers][outputLayers];
        double WArr_tempT[outputLayers][hidenLayers];
        double arrL1T[hidenLayers][1];
        double dotTempp[inputLayers+1][hidenLayers];
        srand((int)time(0));
        //为数据集添加偏置
        //eg.当我们输入的数据集为4X2的时候,需要为其在最后添加一列偏置,让其变成一个4X3的矩阵
        for(int i=0;ihangx=dataX[iii];
//            for(int i=0;iresult;
                    //取测试集中的第k1行进行测试,结果保存在resultArr中
                    predict(dataTest[k1],&resultArr[0][0]);
                    //将arr转成vector
                    arrToVector1(&resultArr[0][0],result,outputLayers);
//                    for(int kk=0;kk5)cout<<"num:!!!!!!!!!!!!!!!!!!!!!!!111"<



训练效果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20555.html

相关文章

  • 用C / C ++实现BP神经网络

    摘要:缘起最近跟着老师在学习神经网络,为了更加深刻地理解这个黑盒,我打算自己用将其实现一遍。 缘起 最近跟着老师在学习神经网络,为了更加深刻地理解这个黑盒,我打算自己用C/C++将其实现一遍。今天忙活了好一会儿,终于实现了一个BP神经网络,后期还会陆续实现CNN神经网络之类的,也会发上来和大家一起分享的~ 因为最近比较忙,所以这里直接放代码了,关于一些原理以及自己的一点见解会在有空的时候整理...

    Gemini 评论0 收藏0
  • 用C / C ++实现BP神经网络

    摘要:缘起最近跟着老师在学习神经网络,为了更加深刻地理解这个黑盒,我打算自己用将其实现一遍。 缘起 最近跟着老师在学习神经网络,为了更加深刻地理解这个黑盒,我打算自己用C/C++将其实现一遍。今天忙活了好一会儿,终于实现了一个BP神经网络,后期还会陆续实现CNN神经网络之类的,也会发上来和大家一起分享的~ 因为最近比较忙,所以这里直接放代码了,关于一些原理以及自己的一点见解会在有空的时候整理...

    douzifly 评论0 收藏0
  • 一文搞懂区块链跨链技术

    摘要:区块链的跨链技术是什么自比特币年前诞生以来,数以千计的区块链公链被开发出来,基于各种公链的加密货币数量更呈现井喷式增长。现有的跨链技术方案目前主流的区块链跨链技术有公证人机制侧链中继哈希锁定。 区块链的跨链技术是什么? 自比特币10年前诞生以来,数以千计的区块链公链被开发出来,基于各种公链的加密货币数量更呈现井喷式增长。客观来看,各条公链都具有自己独特的优势和特征,以 EOS 为代表的...

    Freeman 评论0 收藏0
  • 一文搞懂区块链跨链技术

    摘要:区块链的跨链技术是什么自比特币年前诞生以来,数以千计的区块链公链被开发出来,基于各种公链的加密货币数量更呈现井喷式增长。现有的跨链技术方案目前主流的区块链跨链技术有公证人机制侧链中继哈希锁定。 区块链的跨链技术是什么? 自比特币10年前诞生以来,数以千计的区块链公链被开发出来,基于各种公链的加密货币数量更呈现井喷式增长。客观来看,各条公链都具有自己独特的优势和特征,以 EOS 为代表的...

    XanaHopper 评论0 收藏0
  • ❤️六W字《计算机基础知识》(二)(建议收藏)❤️

    上一篇: ❤️六W字《计算机基础知识》(一)❤️  51、 Access是一种____数据库管理系统。 A、发散型 B、集中型  C、关系型  D、逻辑型 52、 用高级程序设计语言编写的程序,要转换成等价的可执行程序,必须经过____。 A、汇编  B、编辑  C、解释  D、编译和连接 53、 一般用高级语言编写的应用程序称为____。 A、编译程序  B、编辑程序  C...

    Xufc 评论0 收藏0

发表评论

0条评论

haobowd

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<