利用ANN来实现简单的深度神经网络
来源:互联网 发布:灌篮高手全国大赛数据 编辑:程序博客网 时间:2024/05/29 08:03
利用ANN,BP实现简单的深度学习的代码:
#! /usr/bin/env python# -*- coding=utf-8 -*-import mathimport randomimport stringrandom.seed(0)# 生成区间[a, b)内的随机数def rand(a, b): return (b - a) * random.random() + a# 生成大小 I*J 的矩阵,默认零矩阵 (当然,亦可用 NumPy 提速)def makeMatrix(I, J, fill=0.0): m = [] for i in range(I): m.append([fill] * J) return m# 函数 sigmoid,这里采用 tanh,因为看起来要比标准的 1/(1+e^-x) 漂亮些def sigmoid(x): return math.tanh(x)# 函数 sigmoid 的派生函数, 为了得到输出 (即:y)def dsigmoid(y): return 1.0 - y ** 2class NN: ''' 三层反向传播神经网络 ''' def __init__(self, ni, nh, no): # 输入层、隐藏层、输出层的节点(数) self.ni = ni + 1 # 增加一个偏差节点 #3 self.nh = nh #4 self.no = no #1 # 激活神经网络的所有节点(向量) self.ai = [1.0] * self.ni #self.ni = 3,输入层有3个节点,初始化为[1.0, 1.0, 1.0] self.ah = [1.0] * self.nh #self.nh = 4,隐藏层有4个节点,初始化位[1.0, 1.0, 1.0, 1.0] self.ao = [1.0] * self.no #self.nh = 1,输出层有1个节点,初始化位[1.0] # 建立权重(矩阵) self.wi = makeMatrix(self.ni, self.nh)#输入层到隐藏层,3个到4个,权值:[[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]] self.wo = makeMatrix(self.nh, self.no)#隐藏层到输出层,4个到1个,权值:[[0.0], [0.0], [0.0], [0.0]] # 设为随机值 for i in range(self.ni): for j in range(self.nh): self.wi[i][j] = rand(-0.2, 0.2) for j in range(self.nh): for k in range(self.no): self.wo[j][k] = rand(-2.0, 2.0) print "随机权值" print self.wi # 随机后的权值:[[0.13776874061001926, 0.10318176117612099, -0.031771367667662004, -0.09643329988281467], [0.004509888547443414, -0.03802634501983429, 0.11351943561390904, -0.07867490956842903], [-0.009361218339057675, 0.03335281578201249, 0.16324515407813406, 0.0018747423269561136]] print self.wo #随机后的权值:[[-0.8726486224011847], [1.0232168166288957], [0.4734759867013265], [-0.9979746345502378]] # 最后建立动量因子(矩阵) self.ci = makeMatrix(self.ni, self.nh) #输入层到隐藏层,3个到4个,权值:[[0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0]] self.co = makeMatrix(self.nh, self.no) #隐藏层到输出层,4个到1个,权值:[[0.0], [0.0], [0.0], [0.0]]#更新的函数 def update(self, inputs): print "-----------update---------------" if len(inputs) != self.ni - 1: raise ValueError('与输入层节点数不符!') # 激活输入层 print "----------self.ai--------" for i in range(self.ni - 1): # self.ai[i] = sigmoid(inputs[i]) self.ai[i] = inputs[i] print "jihuo_input" print self.ai[i] print "---------self.nh---------" # 激活隐藏层 for j in range(self.nh):#self.nh = 4 sum = 0.0 for i in range(self.ni):#self.ni = 3 sum = sum + self.ai[i] * self.wi[i][j] self.ah[j] = sigmoid(sum) print self.ah[j] # 激活输出层 print "---------self.ao---------" for k in range(self.no): # self.no = 1 sum = 0.0 for j in range(self.nh): #self.nh = 4 sum = sum + self.ah[j] * self.wo[j][k] self.ao[k] = sigmoid(sum) print "---------" print self.ao[:] print "---------" return self.ao[:]#反向传播 def backPropagate(self, targets, N, M): ''' 反向传播 ''' print targets if len(targets) != self.no: raise ValueError('与输出层节点数不符!') # 计算输出层的误差 output_deltas = [0.0] * self.no # 首先初始化误差值 for k in range(self.no): # self.no = 1 error = targets[k] - self.ao[k] output_deltas[k] = dsigmoid(self.ao[k]) * error # 计算隐藏层的误差 #首先初始化误差值 hidden_deltas = [0.0] * self.nh for j in range(self.nh): #self.nh = 4 error = 0.0 for k in range(self.no): #self.no =1 error = error + output_deltas[k] * self.wo[j][k] hidden_deltas[j] = dsigmoid(self.ah[j]) * error # 更新输出层权重 for j in range(self.nh): for k in range(self.no): change = output_deltas[k] * self.ah[j] self.wo[j][k] = self.wo[j][k] + N * change + M * self.co[j][k] self.co[j][k] = change # print(N*change, M*self.co[j][k]) # 更新输入层权重 for i in range(self.ni): for j in range(self.nh): change = hidden_deltas[j] * self.ai[i] self.wi[i][j] = self.wi[i][j] + N * change + M * self.ci[i][j] self.ci[i][j] = change # 计算误差 error = 0.0 for k in range(len(targets)): error = error + 0.5 * (targets[k] - self.ao[k]) ** 2 return error def test(self, patterns): for p in patterns: print(p[0], '->', self.update(p[0])) def weights(self): print('输入层权重:') for i in range(self.ni): print(self.wi[i]) print() print('输出层权重:') for j in range(self.nh): print(self.wo[j]) def train(self, patterns, iterations=1000, N=0.5, M=0.1): # N: 学习速率(learning rate) # M: 动量因子(momentum factor) for i in range(iterations): #循环1000次,每100 次输出一个结果 print "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" error = 0.0 for p in patterns:# 每次输入的有四个点 # print p inputs = p[0] # print "imputs" # print inputs # print "-------" targets = p[1] self.update(inputs) #更新输入的数据 error = error + self.backPropagate(targets, N, M) #反向传播结果,把结果回带到 print "******************************************" if i % 100 == 0: print('误差 %-.5f' % error)def demo(): # 一个演示:教神经网络学习逻辑异或(XOR)------------可以换成你自己的数据试试 pat = [ [[0, 0], [0]], [[0, 1], [1]], [[1, 0], [1]], [[1, 1], [0]] ] # 创建一个神经网络:输入层有两个节点、隐藏层有两个节点、输出层有一个节点 n = NN(2, 4, 1) # 用一些模式训练它 n.train(pat) # 测试训练的成果(不要吃惊哦) n.test(pat) # 看看训练好的权重(当然可以考虑把训练好的权重持久化) n.weights()if __name__ == '__main__': demo()
0 0
- 利用ANN来实现简单的深度神经网络
- ANN神经网络代码在Matlab中的简单实现
- 深度学习中简单神经网络的实现
- 利用R实现简单的BP神经网络
- 一名工程师对于深度学习的理解-神经网络基础ANN
- ANN神经网络
- 神经网络ANN
- deeplearning系列(五)实现一个简单的深度神经网络
- 【深度学习】1.2:简单神经网络的python实现
- 神经网络ANN——SPSS实现
- 神经网络ANN分类器及OpenCV实现
- 神经网络 ANN 分类器 OpenCV实现 例子
- java实现的深度神经网络
- 实现简单的神经网络
- 一个简单的ANN算法
- 一个简单的ANN算法
- 如何用深度学习来写歌词(神经网络实现)
- OpenCV实现车牌识别,OCR分割,ANN神经网络
- 文件压缩
- [Android测试] AS+Appium+Java+Win 自动化测试之七: 写脚本测试自己的app
- 任务2---标准体重计算器
- LeetCode-Swap Nodes in Pairs
- qt写日志
- 利用ANN来实现简单的深度神经网络
- ListView优化
- spring+mybatis+springMVC详细整合
- C语言DAY08 - 进制
- effective stl: 第20条,为包含指针的关联容器指定比较类型
- Array.prototype.filter()的实现
- 回顾JavaSE(5)-String(4)7行代码分析一道关于String拼接的经典面试题
- C语言DAY09 - 数组
- 二分查找判定树