• 深度学习实验系列(1)


    开篇粘贴导师的几句话:

    最近准备趁着几位开题,把神经网络,深度学习方面的内容系统的挖挖。

    要学习深度学习,多少要了解一下神经网络,神经网络的典型就是BP,而BP本身是很简单的。

    我们前面就从这几个资料(关于资料,我会在接下来的内容中一一展开)开始吧。
    一、perception感知器算法
    先说一下感知器算法。

    引例:判断一个人是否长得帅??? 有如下feature: 身高,体重,三围,颜值,学习成绩(帅的人学习成绩好的少...为何如此说先不讨论,本人作为女生,认为此说法并无什么依据)等等。

    假设有一个标准:每一个评分项给予多少分的权重,当所有feature与权重相乘的和大于某一个值的时候,那这个人就是帅哥!!

    例子: 180*5+150*3+....>1000 帅哥! 小于则.....

    感知器任务:通过已知的实例调节权重,使其能够预测出未知实例的结果。

    符号表示:

    if       (w1*x1+w2*x2+.......>b) return true

    else        return false

    由于b是常数,我们可以将b表示为-w0×X0,则可以表示为

    if       (w1*x1+w2*x2+.......+w0×x0>0) return true

    else        return false

    训练方法:

    当预测值等于我们期待的结果时: 什么也不用做

    但当预测值小于我们期待的结果时,说明我们增加的权值小了,应补上一个正数数,例如所有xi*×2的和数学表达推导如下:

    w1*x1+a*x1*x1+w2*x2+a*x2*x2+......  注:a为学习速率因子,会影响学习速率

    w的更新值相当于wi=wi+a*xi

    当预测值大于我们期待的结果时应改为减号,归结起来应为如下表达式:

    wi=wi+a*(y-h(x))*xi

    伪代码表示:

     1 while(循环结束条件)  {#此处可设为让样本循环执行多少次  
     2     delta_w[ ]={0};  
     3     for(每个样本){  
     4         for(每个特征 i){  
     5             delta_w[i]+=a*(y-h(x))*wi;  
     6         }  
     7     }  
     8      for(每个特征 i){  
     9             更新w权值  
    10             wi+=dealta_w[i]  
    11         }  
    12 } 

    shortage:

    只能解决线性可分问题。

    questions:

    1.迭代的停止条件是什么?

    答:自己定。。。可以是某个验证集取得理想结果的时候,或是像上述例子,单纯改变循环次数。

    2.当训练时候遇到正确样本会发生什么?

    答:什么也不发生,当预测结果正确时,就假定是最好感知器。

    3.每次迭代调整w或是所有样本迭代完全后调整w(上例)有区别么?

    答:区别不大,也许w权值会有所变化,但实际效果没多大区别。

    4.某轮迭代后结果一定变好么?

    答:不一定,但总体趋势是变好的!

    5.a的作用和取值问题

    答:作用是控制学习速率,一般选0-1之间,过大不能学习到最优值,过小没有什么变化~~

    下面给出具体的C语言实现代码:

    #include<iostream>  
    #include <stdio.h>  
    using namespace std;  
    double hypothose(double w[],int feature_num,double* training_set){  
        double sum=0;  
        for(int i=0;i<feature_num;i++){  
            sum+=w[i]*training_set[i];  
        }  
        if (sum>0) return 1;  
        else return 0;  
    }  
    //以下函数为感知器算法真正函数,参数分别是特征个数,训练样本数,学习速率,迭代次数,训练样本,初始w数组  
    void perception(int feature_num,int training_num,double a,int times,double** training_set,double w[]){  
         int dimentions=feature_num+1;  
         while(times--){  
                double* delta_w=new double[feature_num];  
                for(int i=0;i<feature_num;i++){  
                    delta_w[i]=0;  
                }  
                for(int i=0;i<training_num;i++){  
                    for(int j=0;j<feature_num;j++){  
                        delta_w[j]+=(training_set[i][feature_num]-hypothose(w,feature_num,training_set[i]))*training_set[i][j]*a;  
                    }  
                }  
                for(int i=0;i<feature_num;i++){  
                    w[i]+=delta_w[i];  
                }  
                delete[] delta_w;  
            }  
    }  
    int main(){  
        int feature_num,training_num,times;  
        double a;  
        freopen("in.txt","r",stdin);  
        while(cin>>feature_num>>training_num>>a>>times){  
            double** training_set=new double*[ training_num];  
            for(int i=0;i<training_num;i++){  
                training_set[i]=new double[training_num+2];  
            }  
            double* w=new double[feature_num+1];  
            for(int i=0;i<training_num;i++){  
                training_set[i][0]=1;  
            }  
            for(int i=0;i<training_num;i++){  
                for(int j=1;j<=feature_num+1;j++){  
                    cin>>training_set[i][j];  
                }  
            }  
            for(int i=0;i<=feature_num;i++){  
                cin>>w[i];  
            }  
            perception(feature_num+1,training_num,a,times,training_set,w);  
            for(int i=0;i<feature_num;i++){  
                cout<<w[i]<<' ';  
            }  
            cout<<w[feature_num]<<endl;  
            delete[] w;  
            for(int i=0;i<training_num;i++){  
                delete[] training_set[i];  
            }  
            delete[] training_set;  
        }  
        return 0;  
    }  

    文件输入格式如下:

    2 4 0.25 5
    0 0 0
    0 1 1
    1 0 1
    1 1 1
    0.06230 0.01123 -0.07335

    运行结果:(我的编译环境是vs2013)

  • 相关阅读:
    闭包
    原型继承
    js时间戳转成日期格式
    常用正则表达式
    vue中如何实现pdf文件预览?
    Vue动画效果
    手把手教你封装 Vue 组件,并使用 npm 发布
    LCD驱动(FrameBuffer)实例开发讲解
    每个程序员都该阅读的书
    LCD platform_device(s5pv210)
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/8031270.html
Copyright © 2020-2023  润新知