深度学习一:自己写java代码,训练一个神经元

原创 2017年06月27日 14:41:15

神经网络与深度学习这本书是我学习深度学习的启蒙教材,感兴趣可以到链接出下载。通过一段时间的学习,感觉基本理解了梯度下降算法和反向传播算法,于是尝试着自己写代码来实现神经网络。一开始总是很难的,所以我设计了个非常简单的目标,训练一个神经元。比如我给他输入1,我期望它输出0,这就是一个反相器。我希望它能做到这一点,所以我对他进行训练。
训练一个神经元能简化梯度下降算法和反向传播算法的实现,也能帮助我们更好的理解升经这两个算法。对于初学深度学习的人来说,勇敢的迈出第一步非常的重要,因此,如果你能成功的训练一个神经元,那也意味着你在深度学习的学习中迈出了重要的一步。
关于梯度下降算法和反向传播算法,还是需要你认真阅读推荐的书籍,这两个算法是深度学习的基石,一定要彻底弄懂才行。
如果在网页上代码不太好看,你可以在这里下载源码:
源码

首先定义一个神经元类:

public class NeureCell {
    private double w = 0;
    private double b = 0;
    private double out = 0;
    private int in = 0;
    public void setIn(int in){
        this.in = in;
    }
    public void setWandB(double w,double b){
        this.w = w;
        this.b = b;
    }
    public double getW(){return w;}
    public double getB(){return b;}
    public double getOut(){
        double z = in*w+b;
        return 1/(1+Math.exp(-z));
    }
}

使用梯度下降算法训练神经网络

import java.util.Random;

public class DeepLearn {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NeureCell cell = new NeureCell();
        Random random = new Random();
        //init w and b
        double eta = 3;//learn speed
        cell.setWandB(random.nextDouble(), random.nextDouble());
        cell.setIn(1);
        double a0 = cell.getOut();
        double dw = 0.6*eta*a0; 
        double db = 0.6*eta*a0; 
        cell.setWandB(cell.getW()-dw, cell.getB()-db);
        for(int i=0;i<200;i++){
            cell.setIn(1);
            double ai = cell.getOut();
            dw = 0.6*eta*ai;    
            db = 0.6*eta*ai;    
            cell.setWandB(cell.getW()-dw, cell.getB()-db);
            System.out.println(ai);
        }

    }

}

结果如下:
这里写图片描述

可以看到这个输出越来越接近与0了。
这里使用的是最简单的二次代价函数:
这里写图片描述
反向传播算法可以概括为一下五步:
这里写图片描述
如果你能理解这五步,那么你就会明白,这点代码完全就是按照这个步骤做了一遍而已。

版权声明:本文为博主原创文章,未经博主允许不得转载。

深度学习——你需要了解的八大开源框架

http://www.leiphone.com/news/201608/5kCJ4Vim3wMjpBPU.html 深度学习八大开源框架 导读:深度学习(Deep Learning)是...
  • isuker
  • isuker
  • 2016年09月08日 16:27
  • 7270

java代码实现深度神经网络算法

对于现在流行的深度学习,保持学习精神是必要的——程序员尤其是架构师永远都要对核心技术和关键算法保持关注和敏感,必要时要动手写一写掌握下来,先不用关心什么时候用到——用不用是政治问题,会不会写是技术问题...

深度学习Java类库deeplearning4j 学习笔记-MNIST手写数字分类问题

deeplearning4j这是一个用Java实现的深度学习类库。 网址: https://deeplearning4j.org 问题和数据集Minist是一个每个学过机器学习的童鞋都熟悉的类库。这...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

java 机器深度学习网站

http://deeplearning4j.org/它是第一个商业应用级的开元,分布式深度学习框架,最主要的是java写的,并且也可以用scala.它和hadoop , spark都能整合, DL4J...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

十个值得一试的开源深度学习框架

原文链接:http://os.51cto.com/art/201511/497444.htm 早些时候Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Goo...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习一:自己写java代码,训练一个神经元
举报原因:
原因补充:

(最多只允许输入30个字)