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. C++学习笔记(三)--数组、字符串

    1.数组,C++中不允许数组的下标值为变量,只能是常量或者常量表达式,必须先定义后使用.数组赋初值几种常见方式: int a[] = {1,2,3,4,5}: int a[4] = {2,1,3,4} ...

  2. Vue2.0响应式原理以及重写数组方法

    // 重写数组方法 let oldArrayPrototype = Array.prototype; let proto = Object.create(oldArrayPrototype); ['p ...

  3. VScode 常用快捷键 2019

    窗口操作 Ctrl + b      : 显示/隐藏左侧工作区文件目录 View   Appearance   show Activity bar : 最左侧工具栏 显示/隐藏 Preferences ...

  4. mysql中插入中文时显示乱码

    在插入mysql的时候参数是中文的时候显示的是???乱码,这个是由于没有配置字符编码引起的 只要在SqlMapconfig.xml文件中加上<property name="url&qu ...

  5. c#批量插入

    一.创建一个用来测试的数据库和表 USE [Test] GO /****** Object: Table [dbo].[student] Script Date: 2019/4/11 15:38:59 ...

  6. Python入门习题9.数码管时间

    #七段数码管.py import turtle,datetime def drawGap(): #绘制数码管间隔 turtle.penup() turtle.fd(5) def drawLine(dr ...

  7. P3914染色计数

    题目描述 有一颗\(N\)个节点的树,节点用\(1,2,\cdots,N\)编号.你要给它染色,使得相邻节点的颜色不同.有\(M\)种颜色,用\(1,2,\cdots,M\)编号.每个节点可以染\(M ...

  8. Linux mysql 乱码

    http://www.pc6.com/infoview/Article_63586.html http://itindex.net/detail/41748-linux-mysql-5.5 http: ...

  9. 请列举出JS对象的几种创建方式?

    javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. 1.对象字面量的方式 var person={firstname:&q ...

  10. 用vbs脚本简易实现 番茄工作法

    番茄工作法: 专注于某一段时间,减少打断,提高时间的感知和掌控. 25min工作+5min休息 周期:4x(25+5)+20 VBS代码实现如下: Dim fso,f,count,time,shell ...