亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? backprop.cpp

?? BP神經網絡的VC實現,BP神經網絡的VC實現
?? CPP
字號:
/*
******************************************************************
* backprop.cpp
******************************************************************
*/

#include "StdAfx.h"
#include <stdio.h>
#include "backprop.h"
#include <math.h>
#include <stdlib.h>

#define ABS(x)          (((x) > 0.0) ? (x) : (-(x)))

/* 宏定義:快速拷貝 */
#define fastcopy(to,from,len)\
{\
        register char *_to,*_from;\
        register int _i,_l;\
        _to = (char *)(to);\
        _from = (char *)(from);\
        _l = (len);\
        for (_i = 0; _i < _l; _i++) *_to++ = *_from++;\
}

/*** 返回0-1的雙精度隨機數 ***/
double drnd()
{
        return ((double) rand() / (double) BIGRND);
}

/*** 返回-1.0到1.0之間的雙精度隨機數 ***/
double dpn1()
{
        return ((drnd() * 2.0) - 1.0);
}

/*** 作用函數,目前是S型函數 ***/

double squash(double x)
{
        return (1.0 / (1.0 + exp(-x)));
}


/*** 申請1維雙精度實數數組 ***/

double *alloc_1d_dbl(int n)
{
        double *new1;

        new1 = (double *) malloc ((unsigned) (n * sizeof (double)));
        if (new1 == NULL) {
                printf("ALLOC_1D_DBL: Couldn't allocate array of doubles\n");
                return (NULL);
        }
        return (new1);
}


/*** 申請2維雙精度實數數組 ***/

double **alloc_2d_dbl(int m, int n)
{
        int i;
        double **new1;

        new1 = (double **) malloc ((unsigned) (m * sizeof (double *)));
        if (new1 == NULL) {
                printf("ALLOC_2D_DBL: Couldn't allocate array of dbl ptrs\n");
                return (NULL);
        }

        for (i = 0; i < m; i++) {
                new1[i] = alloc_1d_dbl(n);
        }

        return (new1);
}

/*** 隨機初始化權值 ***/
void bpnn_randomize_weights(double **w, int m, int n)
{
        int i, j;

        for (i = 0; i <= m; i++) {
                for (j = 0; j <= n; j++) {
                        w[i][j] = dpn1();
                }
        }
}

/*** 0初始化權值 ***/
void bpnn_zero_weights(double **w, int m, int n)
{
        int i, j;

        for (i = 0; i <= m; i++) {
                for (j = 0; j <= n; j++) {
                        w[i][j] = 0.0;
                }
        }
}

/*** 設置隨機數種子 ***/
void bpnn_initialize(int seed)
{
        printf("Random number generator seed: %d\n", seed);
        srand(seed);
}

/*** 創建BP網絡 ***/
BPNN *bpnn_internal_create(int n_in, int n_hidden, int n_out)
{
        BPNN *newnet;

        newnet = (BPNN *) malloc (sizeof (BPNN));
        if (newnet == NULL) {
                printf("BPNN_CREATE: Couldn't allocate neural network\n");
                return (NULL);
        }

        newnet->input_n = n_in;
        newnet->hidden_n = n_hidden;
        newnet->output_n = n_out;
        newnet->input_units = alloc_1d_dbl(n_in + 1);
        newnet->hidden_units = alloc_1d_dbl(n_hidden + 1);
        newnet->output_units = alloc_1d_dbl(n_out + 1);

        newnet->hidden_delta = alloc_1d_dbl(n_hidden + 1);
        newnet->output_delta = alloc_1d_dbl(n_out + 1);
        newnet->target = alloc_1d_dbl(n_out + 1);

        newnet->input_weights = alloc_2d_dbl(n_in + 1, n_hidden + 1);
        newnet->hidden_weights = alloc_2d_dbl(n_hidden + 1, n_out + 1);

        newnet->input_prev_weights = alloc_2d_dbl(n_in + 1, n_hidden + 1);
        newnet->hidden_prev_weights = alloc_2d_dbl(n_hidden + 1, n_out + 1);

        return (newnet);
}

/* 釋放BP網絡所占地內存空間 */
void bpnn_free(BPNN *net)
{
        int n1, n2, i;

        n1 = net->input_n;
        n2 = net->hidden_n;

        free((char *) net->input_units);
        free((char *) net->hidden_units);
        free((char *) net->output_units);

        free((char *) net->hidden_delta);
        free((char *) net->output_delta);
        free((char *) net->target);

        for (i = 0; i <= n1; i++) {
                free((char *) net->input_weights[i]);
                free((char *) net->input_prev_weights[i]);
        }
        free((char *) net->input_weights);
        free((char *) net->input_prev_weights);

        for (i = 0; i <= n2; i++) {
                free((char *) net->hidden_weights[i]);
                free((char *) net->hidden_prev_weights[i]);
        }
        free((char *) net->hidden_weights);
        free((char *) net->hidden_prev_weights);

        free((char *) net);
}


/*** 
         創建一個BP網絡,并初始化權值
***/

BPNN *bpnn_create(int n_in, int n_hidden, int n_out)
{
        BPNN *newnet;

        newnet = bpnn_internal_create(n_in, n_hidden, n_out);

#ifdef INITZERO
        bpnn_zero_weights(newnet->input_weights, n_in, n_hidden);
#else
        bpnn_randomize_weights(newnet->input_weights, n_in, n_hidden);
#endif
        bpnn_randomize_weights(newnet->hidden_weights, n_hidden, n_out);
        bpnn_zero_weights(newnet->input_prev_weights, n_in, n_hidden);
        bpnn_zero_weights(newnet->hidden_prev_weights, n_hidden, n_out);

        return (newnet);
}



void bpnn_layerforward(double *l1, double *l2, double **conn, int n1, int n2)
{
        double sum;
        int j, k;

        /*** 設置閾值 ***/
        l1[0] = 1.0;

        /*** 對于第二層的每個神經元 ***/
        for (j = 1; j <= n2; j++) {

                /*** 計算輸入的加權總和 ***/
                sum = 0.0;
                for (k = 0; k <= n1; k++) {
                        sum += conn[k][j] * l1[k];
                }
                l2[j] = squash(sum);
        }
}

/* 輸出誤差 */
void bpnn_output_error(double *delta, double *target, double *output, int nj, double *err)
{
        int j;
        double o, t, errsum;

        errsum = 0.0;
        for (j = 1; j <= nj; j++) {
                o = output[j];
                t = target[j];
                delta[j] = o * (1.0 - o) * (t - o);
                errsum += ABS(delta[j]);
        }
        *err = errsum;
}

/* 隱含層誤差 */
void bpnn_hidden_error(double* delta_h, int nh, double *delta_o, int no, double **who, double *hidden, double *err)
{
        int j, k;
        double h, sum, errsum;

        errsum = 0.0;
        for (j = 1; j <= nh; j++) {
                h = hidden[j];
                sum = 0.0;
                for (k = 1; k <= no; k++) {
                        sum += delta_o[k] * who[j][k];
                }
                delta_h[j] = h * (1.0 - h) * sum;
                errsum += ABS(delta_h[j]);
        }
        *err = errsum;
}

/* 調整權值 */
void bpnn_adjust_weights(double *delta, int ndelta, double *ly, int nly, double** w, double **oldw, double eta, double momentum)
{
        double new_dw;
        int k, j;

        ly[0] = 1.0;
        for (j = 1; j <= ndelta; j++) {
                for (k = 0; k <= nly; k++) {
                        new_dw = ((eta * delta[j] * ly[k]) + (momentum * oldw[k][j]));
                        w[k][j] += new_dw;
                        oldw[k][j] = new_dw;
                }
        }
}

/* 進行前向運算 */
void bpnn_feedforward(BPNN* net)
{
        int in, hid, out;

        in = net->input_n;
        hid = net->hidden_n;
        out = net->output_n;

        /*** Feed forward input activations. ***/
        bpnn_layerforward(net->input_units, net->hidden_units,
                net->input_weights, in, hid);
        bpnn_layerforward(net->hidden_units, net->output_units,
                net->hidden_weights, hid, out);
}

/* 訓練BP網絡 */
void bpnn_train(BPNN *net, double eta, double momentum, double *eo, double *eh)
{
        int in, hid, out;
        double out_err, hid_err;

        in = net->input_n;
        hid = net->hidden_n;
        out = net->output_n;

        /*** 前向輸入激活 ***/
        bpnn_layerforward(net->input_units, net->hidden_units,
                net->input_weights, in, hid);
        bpnn_layerforward(net->hidden_units, net->output_units,
                net->hidden_weights, hid, out);

        /*** 計算隱含層和輸出層誤差 ***/
        bpnn_output_error(net->output_delta, net->target, net->output_units,
                out, &out_err);
        bpnn_hidden_error(net->hidden_delta, hid, net->output_delta, out,
                net->hidden_weights, net->hidden_units, &hid_err);
        *eo = out_err;
        *eh = hid_err;

        /*** 調整輸入層和隱含層權值 ***/
        bpnn_adjust_weights(net->output_delta, out, net->hidden_units, hid,
                net->hidden_weights, net->hidden_prev_weights, eta, momentum);
        bpnn_adjust_weights(net->hidden_delta, hid, net->input_units, in,
                net->input_weights, net->input_prev_weights, eta, momentum);
}


/* 保存BP網絡 */
void bpnn_save(BPNN *net, char *filename)
{
        int n1, n2, n3, i, j, memcnt;
        double dvalue, **w;
        char *mem;
        FILE *fd;

        if ((fd = fopen(filename, "w")) == NULL) {
                printf("BPNN_SAVE: Cannot create '%s'\n", filename);
                return;
        }

        n1 = net->input_n;  n2 = net->hidden_n;  n3 = net->output_n;
        printf("Saving %dx%dx%d network to '%s'\n", n1, n2, n3, filename);
        fflush(stdout);


        fwrite((char *) &n1, sizeof(int), 1, fd);
        fwrite((char *) &n2, sizeof(int), 1, fd);
        fwrite((char *) &n3, sizeof(int), 1, fd);

        memcnt = 0;
        w = net->input_weights;
        mem = (char *) malloc ((unsigned) ((n1+1) * (n2+1) * sizeof(double)));
        for (i = 0; i <= n1; i++) {
                for (j = 0; j <= n2; j++) {
                        dvalue = w[i][j];
                        fastcopy(&mem[memcnt], &dvalue, sizeof(double));
                        memcnt += sizeof(double);
                }
        }

        fwrite(mem, (n1+1) * (n2+1) * sizeof(double), 1, fd);
        free(mem);

        memcnt = 0;
        w = net->hidden_weights;
        mem = (char *) malloc ((unsigned) ((n2+1) * (n3+1) * sizeof(double)));
        for (i = 0; i <= n2; i++) {
                for (j = 0; j <= n3; j++) {
                        dvalue = w[i][j];
                        fastcopy(&mem[memcnt], &dvalue, sizeof(double));
                        memcnt += sizeof(double);
                }
        }

        fwrite(mem, (n2+1) * (n3+1) * sizeof(double), 1, fd);
        free(mem);

        fclose(fd);
        return;
}

/* 從文件中讀取BP網絡 */
BPNN *bpnn_read(char *filename)
{
        char *mem;
        BPNN *new1;
        int n1, n2, n3, i, j, memcnt;
        FILE *fd;

        if ((fd = fopen(filename, "r")) == NULL) {
                return (NULL);
        }

        printf("Reading '%s'\n", filename);  fflush(stdout);

        fread((char *) &n1, sizeof(int), 1, fd);
        fread((char *) &n2, sizeof(int), 1, fd);
        fread((char *) &n3, sizeof(int), 1, fd);

        new1 = bpnn_internal_create(n1, n2, n3);

        printf("'%s' contains a %dx%dx%d network\n", filename, n1, n2, n3);
        printf("Reading input weights...");  fflush(stdout);

        memcnt = 0;
        mem = (char *) malloc ((unsigned) ((n1+1) * (n2+1) * sizeof(double)));

        fread( mem, (n1+1) * (n2+1) * sizeof(double), 1, fd);
        for (i = 0; i <= n1; i++) {
                for (j = 0; j <= n2; j++) {
                        fastcopy(&(new1->input_weights[i][j]), &mem[memcnt], sizeof(double));
                        memcnt += sizeof(double);
                }
        }
        free(mem);

        printf("Done\nReading hidden weights...");  fflush(stdout);

        memcnt = 0;
        mem = (char *) malloc ((unsigned) ((n2+1) * (n3+1) * sizeof(double)));

        fread( mem, (n2+1) * (n3+1) * sizeof(double), 1, fd);
        for (i = 0; i <= n2; i++) {
                for (j = 0; j <= n3; j++) {
                        fastcopy(&(new1->hidden_weights[i][j]), &mem[memcnt], sizeof(double));
                        memcnt += sizeof(double);
                }
        }
        free(mem);
        fclose(fd);

        printf("Done\n");  fflush(stdout);

        bpnn_zero_weights(new1->input_prev_weights, n1, n2);
        bpnn_zero_weights(new1->hidden_prev_weights, n2, n3);

        return (new1);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久成人免费电影| 一区二区免费看| 国产一区二区在线看| 欧美一级电影网站| 久久成人羞羞网站| 亚洲国产精品99久久久久久久久| 国产**成人网毛片九色| 国产精品国产三级国产普通话99| 91色九色蝌蚪| 天堂蜜桃91精品| 久久色在线视频| eeuss鲁片一区二区三区| 亚洲精品久久久久久国产精华液| 欧美精品 日韩| 精久久久久久久久久久| 国产婷婷一区二区| 日本韩国视频一区二区| 亚洲成人综合网站| 久久先锋资源网| 色一情一乱一乱一91av| 日本中文字幕一区| 国产精品高潮久久久久无| 欧美三级电影网| 国产高清在线精品| 成人午夜视频在线| 一个色在线综合| 国产亚洲美州欧州综合国| 99re这里只有精品6| 日本人妖一区二区| 国产精品欧美久久久久一区二区| 欧美日韩一二三| 成人91在线观看| 美女www一区二区| 亚洲欧美aⅴ...| 欧美精品一区二区三区一线天视频| 成人avav影音| 久久 天天综合| 亚洲综合成人在线视频| 久久嫩草精品久久久久| 在线观看av不卡| 国产成人在线影院| 日韩精品色哟哟| 最新国产成人在线观看| wwww国产精品欧美| 91精品国产一区二区三区| a美女胸又www黄视频久久| 蜜桃久久av一区| 亚洲大片免费看| 亚洲日本中文字幕区| 久久先锋资源网| 欧美一区二区大片| 欧美日韩视频一区二区| 成人av免费在线播放| 另类专区欧美蜜桃臀第一页| 成人免费一区二区三区在线观看| 精品美女一区二区三区| 51精品视频一区二区三区| 91在线免费看| 成人黄色av电影| 国产成人精品免费在线| 蜜臀a∨国产成人精品| 午夜成人免费视频| 亚洲国产精品久久一线不卡| 亚洲男人的天堂一区二区| 国产精品免费观看视频| 欧美经典一区二区| 国产欧美一区视频| 国产亚洲一区二区三区在线观看| 欧美一区二区三区四区在线观看 | 波多野结衣视频一区| 美美哒免费高清在线观看视频一区二区| 亚洲一区视频在线| 亚洲精品美腿丝袜| 亚洲激情av在线| 一区二区不卡在线播放 | 国产精品99久久久久久久女警| 免费观看在线色综合| 天天av天天翘天天综合网色鬼国产 | 亚洲国产精品一区二区尤物区| 亚洲精品国久久99热| 亚洲另类中文字| 亚洲最新视频在线观看| 亚洲成av人片www| 日韩高清不卡在线| 蜜桃免费网站一区二区三区| 久久9热精品视频| 国产乱对白刺激视频不卡| 国产福利一区二区三区视频在线 | 日韩av一二三| 美女视频一区在线观看| 精品一区二区三区香蕉蜜桃| 国产在线一区观看| 成人黄页毛片网站| 91国模大尺度私拍在线视频 | 欧美高清你懂得| 日韩欧美黄色影院| 日本一区二区视频在线| 亚洲视频在线观看一区| 亚洲va欧美va人人爽| 麻豆极品一区二区三区| 国产成人午夜精品5599| 色综合一区二区| 4438x亚洲最大成人网| 久久综合狠狠综合久久激情| 国产精品萝li| 天堂蜜桃一区二区三区| 国产精品亚洲а∨天堂免在线| 国产人成亚洲第一网站在线播放 | 中文字幕在线不卡一区| 亚洲免费电影在线| 日本欧美韩国一区三区| 国产69精品一区二区亚洲孕妇| 99视频一区二区| 欧美精品久久天天躁| 久久―日本道色综合久久| 悠悠色在线精品| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美一区二区在线视频| 国产日产欧美一区二区视频| 亚洲一区二三区| 国产成人综合自拍| 欧美日韩免费一区二区三区视频 | 99精品热视频| 欧美裸体bbwbbwbbw| 久久久久久久国产精品影院| 亚洲国产成人精品视频| 国产激情视频一区二区在线观看 | 日韩精品一区二区三区在线观看 | 国产精品久久久久9999吃药| 日本中文在线一区| av福利精品导航| 欧美zozozo| 亚洲国产aⅴ成人精品无吗| 国产超碰在线一区| 日韩欧美激情四射| 亚洲小说欧美激情另类| 国产成人免费xxxxxxxx| 日韩午夜精品电影| 亚洲午夜av在线| 91日韩一区二区三区| 久久伊人蜜桃av一区二区| 午夜精品福利一区二区三区蜜桃| 成人一道本在线| 精品国产免费一区二区三区香蕉| 亚洲国产一区二区在线播放| 高清成人免费视频| 精品剧情在线观看| 天堂成人免费av电影一区| 色美美综合视频| 中文字幕亚洲欧美在线不卡| 国产丶欧美丶日本不卡视频| 精品三级在线观看| 日韩黄色免费电影| 精品视频一区三区九区| 一区二区三区高清| 99国产欧美久久久精品| 国产欧美一区二区精品性色超碰| 精品一区二区三区久久久| 69久久夜色精品国产69蝌蚪网| 亚洲一区在线看| 欧美性大战久久久| 亚洲在线视频免费观看| 色婷婷国产精品久久包臀| 亚洲青青青在线视频| 91热门视频在线观看| 亚洲精品大片www| 色婷婷亚洲一区二区三区| 日韩伦理免费电影| 色哟哟一区二区在线观看| 一区二区三区在线影院| 欧美在线你懂得| 亚洲成人av免费| 欧美一区二区三区播放老司机 | 久久激情五月激情| 日韩一区二区在线免费观看| 欧美a级理论片| 精品三级在线观看| 国产精品资源站在线| 国产喷白浆一区二区三区| 波多野结衣中文字幕一区二区三区| 国产蜜臀av在线一区二区三区| youjizz国产精品| 一区二区三区在线观看国产| 在线观看一区日韩| 天天综合天天综合色| 日韩精品一区二区三区蜜臀| 极品少妇xxxx精品少妇| 国产视频一区二区三区在线观看| 风流少妇一区二区| 亚洲欧美日韩人成在线播放| 欧美日韩亚洲综合一区| 久久精工是国产品牌吗| 欧美激情综合五月色丁香小说| 99久久er热在这里只有精品66| 亚洲三级在线播放| 欧美精品久久久久久久久老牛影院| 六月丁香综合在线视频| 国产精品成人网| 欧美日韩电影在线| 国产中文一区二区三区|