http://blog.csdn.net/hustjoyboy/article/details/50721535

"如何用70行Java代码实现深度神经网络算法" 的delphi版本

2016-02-23 10:58 225人阅读 评论(0) 收藏 举报

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

=====ann.pas源程序===================================

{

by 阿甘 2016.2.23

参考自此篇文档
如何用70行Java代码实现深度神经网络算法
http://geek.csdn.net/news/detail/56086
原文中的代码作者:fourinone
原文中的代码是用java写的,现移植为delphi 供参考
略作修改:权重不含输出层
}

unit ann;

interface

type
  Tdbarr=array of double;
  TBpDeep=class
  private
    layer:array of array of double;
    layerErr:array of array of double;
    layer_weight:array of array of array of double;
    layer_weight_delta:array of array of array of double;
    mobp,rate:double;
    procedure updateWeight(tar:array of double);
  public
    constructor Create(layernum:array of integer;rate,mobp:double);
    function computeout(input:array of double):Tdbarr;
    procedure train(input,tar:array of double);
  end;

implementation

constructor TBpDeep.Create(layernum:array of integer;rate,mobp:double);
var
  a,i,j,k:integer;
begin
  self.rate:=rate;
  self.mobp:=mobp;
  a:=length(layernum);
  if a<2 then exit;
  setlength(layer,a);
  setlength(layerErr,a);
  setlength(layer_weight,a-1);
  setlength(layer_weight_delta,a-1);
  Randomize;
  for k:=0 to a-1 do
  begin
    setlength(layer[k],layernum[k]);
    setlength(layerErr[k],layernum[k]);
    if k+1<a then
    begin
      setlength(layer_weight[k],layernum[k]+1,layernum[k+1]);
      setlength(layer_weight_delta[k],layernum[k]+1,layernum[k+1]);
      for j:=0 to layernum[k]-1 do
      for i:=0 to layernum[k+1]-1 do
        layer_weight[k][j][i]:=Random;//随机初始化权重
    end;
  end;
end;

function TBpDeep.computeout(input:array of double):Tdbarr;
var
  i,j,k:integer;
  z:double;
begin
  for k:=1 to high(layer) do
  for j:=0 to high(layer[k]) do
  begin
    z:=layer_weight[k-1][length(layer[k-1])][j];
    for i:=0 to high(layer[k-1]) do
    begin
      if k=1 then layer[k-1][i]:=input[i];
      z:=z+layer_weight[k-1][i][j]*layer[k-1][i];
    end;
    layer[k][j]:=1/(1+exp(-z));
  end;
  result:=Tdbarr(layer[high(layer)]);
end;

procedure TBpDeep.updateWeight(tar:array of double);
var
  i,j,k:integer;
  z:double;
begin
  k:=high(layer);
  for j:=0 to high(layererr[k]) do layerErr[k][j]:=layer[k][j]*(1-layer[k][j])*(tar[j]-layer[k][j]);
  while k>0 do
  begin
    dec(k);
    for j:=0 to high(layererr[k]) do
    begin
      z:=0;
      for i:=0 to high(layererr[k+1]) do
      begin
        if z+k>0 then z:=layerErr[k+1][i]*layer_weight[k][j][i]
        else z:=0;
        layer_weight_delta[k][j][i]:=mobp*layer_weight_delta[k][j][i]+rate*layerErr[k+1][i]*layer[k][j];//隐含层动量调整
        layer_weight[k][j][i]:=layer_weight[k][j][i]+layer_weight_delta[k][j][i];//隐含层权重调整
        if j=high(layererr[k]) then
        begin
          layer_weight_delta[k][j+1][i]:=mobp*layer_weight_delta[k][j+1][i]+rate*layerErr[k+1][i];//截距动量调整
          layer_weight[k][j+1][i]:=layer_weight[k][j+1][i]+layer_weight_delta[k][j+1][i];//截距权重调整
        end;
      end;
      layerErr[k][j]:=z*layer[k][j]*(1-layer[k][j]);//记录误差
    end;
  end;
end;

procedure TBpDeep.train(input,tar:array of double);
begin
  computeout(input);
  updateWeight(tar);
end;

end.

========================================

测试代码:

procedure TForm1.bttrainClick(Sender: TObject);//训练
var
  i,k:integer;
const
  data:array[0..3] of array[0..1] of double=((1,2),(2,2),(1,1),(2,1));
  tar:array[0..3] of array[0..1] of double=((1,0),(0,1),(0,1),(1,0));
begin
  for k:=0 to 499 do
  for i:=0 to high(data) do
    bp.train(data[i], tar[i]);
end;

procedure TForm1.btcomputeClick(Sender: TObject);//识别
var
  rst:Tdbarr;
  x:array[0..1] of double;
begin
  x[0]:=strtofloat(xx.Text);
  x[1]:=strtofloat(yy.Text);
  rst:=bp.computeout(x);
  memo1.Lines.Append(floattostr(rst[0])+' '+floattostr(rst[1]));
end;

procedure TForm1.FormCreate(Sender: TObject);//初始化
begin
  bp:=TBpdeep.Create([2,10,2],0.15,0.8);
end;

=====================================

"如何用70行Java代码实现深度神经网络算法" 的delphi版本的更多相关文章

  1. 如何用70行Java代码实现深度神经网络算法

    http://www.tuicool.com/articles/MfYjQfV 如何用70行Java代码实现深度神经网络算法 时间 2016-02-18 10:46:17  ITeye 原文  htt ...

  2. 如何用70行Java代码实现深度神经网络算法(转)

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

  3. 200行Java代码搞定计算器程序

    发现了大学时候写的计算器小程序,还有个图形界面,能够图形化展示表达式语法树,哈哈;) 只有200行Java代码,不但能够计算加减乘除,还能够匹配小括号~ 代码点评: 从朴素的界面配色到简单易懂错误提示 ...

  4. 只用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区 ...

  5. 一个 11 行 Python 代码实现的神经网络

    一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...

  6. 只用120行Java代码写一个自己的区块链-3挖矿算法

    在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...

  7. 查看工程里有多少行java代码

    /** * @Classname CustBankcardServiceImpl * @Description 计算项目代码量(行数) * @Date 2019/11/04 14:24 * @Crea ...

  8. C++与JAVA代码实现CRC-16/MODBUS算法,且与 http://www.ip33.com/crc.html 进行结果验证

    CRC-16/MODBUS的多项式为:x16+x15+x2+1(8005),宽度为16.运算时,首先将一个16位的寄存器预置为11111111 11111111,然后连续把数据帧中的每个字节中的8位与 ...

  9. Keras深度神经网络算法模型构建【输入层、卷积层、池化层】

    一.输入层 1.用途 构建深度神经网络输入层,确定输入数据的类型和样式. 2.应用代码 input_data = Input(name='the_input', shape=(1600, 200, 1 ...

随机推荐

  1. 通过queue实现前端的被动接收

    一般请求都是由前端主动发起请求,后端响应,但有些情况必须要后端达到一定条件了才向前端相应数据,这就变成前端被动了.比如微信接收信息,只有别人给你发消息,你才能被动接收消息. 最近做了个项目,当有人经过 ...

  2. spring-第一篇之spring核心机制依赖注入(DI)/控制翻转(IoC)

    1.spring的核心机制:依赖注入(DI)/控制翻转(IoC) 什么是依赖:A对象需要调用B对象,所以A依赖于B. 什么是注入:A对象注入一个属性B对象. 什么是依赖注入(DI):A对象依赖于B对象 ...

  3. noip2018考后反思之爆0

    今年又被Han老师鞭尸了TAT noip普及组比齐同学考的都差,正在准备退役Orz 哎,算了,该放题解还是要放的:( 普及第一题我觉得没有放的必要还是放一下 Code: #include<ios ...

  4. seaborn教程2——颜色调控

    原文转载 https://segmentfault.com/a/1190000014966210 Seaborn学习大纲 seaborn的学习内容主要包含以下几个部分: 风格管理 绘图风格设置 颜色风 ...

  5. K3 cloud中消耗性生物资产已郁闭达到可销售状态,要从消耗性生物资产转至库存商品,要如何结转?

    处理方法: 先做出库单,然后做入库单,选择细目的时候出库单选择的是消耗性生物资产中的细目,如图所示: 然后入库的时候选择库存商品,如下图所示:

  6. Java实现ArrayList

    说明都在注释: package adt.array; import java.util.Iterator; import java.util.NoSuchElementException; /** * ...

  7. jar 启动脚本

    前段时间用springboot做项目后,每次重新发布都好麻烦, 所以写了个脚本来配合jenkins 发布: #!/bin/bash APP_NAME=application.jar function ...

  8. constructor、prototype、isPrototypeOf、instanceof、in 、hasOwnProperty

    constructor.prototype.isPrototypeOf.instanceof.in .hasOwnProperty等等 constructor:对象构造器.存在于原型对象中?,相当于p ...

  9. (ACM模板)队列queue

    #include<iostream> #include<cstdio> #include<queue> using namespace std; struct po ...

  10. HTML基础 用div布局实现一个简单网页

    div布局如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...