手工搭建多层(多隐藏层)BP神经网络

#!/usr/bin/python3
# 名称:Network_Py
# 时间: 2018/12/13 11:09
# 作者:
# 邮件:425776024@qq.comimport numpy as np
from src.mnist_loader import load_data_wrapperdef sigmoid(X):return 1 / (1 + np.exp(-X))def sigmoid_prime(z):return sigmoid(z) * (1 - sigmoid(z))class NetWork(object):def __init__(self, sizes):# np.random.seed(0)self.num_layers = len(sizes)self.sizes = sizes# 偏移self.biases = [np.random.rand(y, 1) for y in sizes[1:]]# 权重生成self.weights = [np.random.rand(x, y) for x, y in zip(sizes[1:], sizes[:-1])]def feedforward(self, a):# a:inputfor b, w in zip(self.biases, self.weights):a = sigmoid(np.dot(w, a) + b)return adef SGD(self, training_data, epochs, mini_batch_size, eta, test_data=None):''':param training_data::param epochs: 迭代次数:param mini_batch_size: 随机份数:param eta: 学习率:param test_data::return:'''# 随机梯度下降算法if test_data:n_test = len(test_data)n = len(training_data)for j in range(epochs):np.random.shuffle(training_data)mini_batchs = [training_data[k:k + mini_batch_size] for k in range(0, n, mini_batch_size)]for mini_batch in mini_batchs:# 更具mini_batch数据更新权重w,bself.update_mini_batch(mini_batch, eta)if test_data:print('Epoch {0} :success rate:{1}/{2}'.format(j, self.evaluate(test_data), n_test))else:print("Epoch {0} complete".format(j))def update_mini_batch(self, mini_batch, eta):'''更新权重,偏置,方向传播,随机梯度下降:param mini_batch::param eta::return:'''nabla_b = [np.zeros(b.shape) for b in self.biases]  # 累计biases偏导数nabla_w = [np.zeros(w.shape) for w in self.weights]  # 累计weights偏导数for x, y in mini_batch:# 每一个数据的误差db,dwdelta_nabla_b, delta_nabla_w = self.backprop(x, y)nabla_b = [nb + dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]nabla_w = [nw + dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]# 用累计误差做更新# w  = w -  alpha * 1/m * dw# b  = b -  alpha * 1/b * dbself.weights = [w - (eta / len(mini_batch)) * nwfor w, nw in zip(self.weights, nabla_w)]self.biases = [b - (eta / len(mini_batch)) * nbfor b, nb in zip(self.biases, nabla_b)]def backprop(self, x, y):'''反向传播,根据x,y数据计算:param x::param y::return:'''# 每一层需要更新的微小量nabla_b = [np.zeros(b.shape) for b in self.biases]nabla_w = [np.zeros(w.shape) for w in self.weights]# 输入数据activation = xactivations = [x]  # 保存每一层的输入zs = []  # 保存每一层的zfor b, w in zip(self.biases, self.weights):# z=wx+bz = np.dot(w, activation) + bzs.append(z)# a=sigmod(z)activation = sigmoid(z)# 保存aactivations.append(activation)# 计算输出层的误差# dz=dc/da * dsigmadelta = self.cost_derivative(activations[-1], y) * sigmoid_prime(zs[-1])# db=dz,只计算最后一层,其余前面层有后一层计算出nabla_b[-1] = delta# dw=dz * a[l-1] 只计算最后一层,其余前面层有后一层计算出nabla_w[-1] = np.dot(delta, activations[-2].transpose())# 反向计算所有层的误差for Li in range(2, self.num_layers):z = zs[-Li]sp = sigmoid_prime(z)delta = np.dot(self.weights[-Li + 1].transpose(), delta) * spnabla_b[-Li] = deltanabla_w[-Li] = np.dot(delta, activations[-Li - 1].transpose())return (nabla_b, nabla_w)def evaluate(self, test_data):'''评估:param test_data::return:'''test_results = [(np.argmax(self.feedforward(x)), y)for (x, y) in test_data]return sum(int(x == y) for (x, y) in test_results)def cost_derivative(self, output_activations, y):'''cost_derivative为代价函数的导数:param output_activations:  最终输出:param y:   真实标记:return:    (a-y)'''return (output_activations - y)# 预测def predict(self, data):value = self.feedforward(data)return value.tolist().index(max(value))INPUT = 28 * 28  # 每张图像28x28个像素
OUTPUT = 10  # 0-9十个分类#搭建784 * 10 * 10 * 10 *10 的5层神经网络
net = NetWork([INPUT, 10,10,10, OUTPUT])# 从mnist提供的库中装载数据
training_data, validation_data, test_data = load_data_wrapper()# 训练
net.SGD(training_data, 30, 10, 3.0, test_data=test_data)# 计算准确率
correct = 0
for test_feature in test_data:if net.predict(test_feature[0]) == test_feature[1]:correct += 1
print("percent: ", correct / len(test_data))

手工搭建多层(多隐藏层)BP神经网络相关推荐

  1. 神经网络笔记1-三层BP神经网络

    神经网络笔记1-三层BP神经网络 神经网络性质简介 信息正向传输 预期神经网络的获得 误差反向更新(输出层→隐藏层) 误差反向更新(隐藏层→输入层) 伪代码实现 训练函数 测试函数,用训练好的神经网络 ...

  2. 6.人工智能原理-隐藏层:神经网络为什么working?

    目录 一.引言 二.隐藏层 三.深度学习(炼丹) 三.编程实验 四.总结 五.往期内容 一.引言 大自然往往是变幻莫测,喜怒无常.在一次地球环境巨变之后,小蓝所在的海底生物们也经历了巨大的进化.豆豆变 ...

  3. 神经网络隐藏层个数怎么确定_含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业)...

    含有一个隐藏层的神经网络对平面数据分类python实现(吴恩达深度学习课程1第3周作业): ''' 题目: 建立只有一个隐藏层的神经网络, 对于给定的一个类似于花朵的图案数据, 里面有红色(y=0)和 ...

  4. 吴恩达机器学习笔记——含一个隐藏层的神经网络

    含一个隐藏层的神经网络 含一个隐藏层的神经网络构造如下图所示: 其中记号用a上标的方括号a[n]a^{[n]}a[n]代表是第n层的a,用下标表示是某一层下面的某一个神经元,如图中的a1[2]a^{[ ...

  5. 【智能算法】基于双隐含层BP神经网络的预测

    目录 基于双隐含层BP神经网络的预测 基于双隐含层BP神经网络的预测 %% 该代码为基于双隐含层BP神经网络的预测 clc clear%% 训练数据预测数据提取及归一化 %下载输入输出数据 load ...

  6. 双隐藏层BP网络的matlab仿真,求遗传算法优化含有两个隐含层的BP神经网络的matlab程序...

    怎样用遗传算法优化含有两个隐含层的BP神经网络的matlab程序啊,这个代码是错的,可不知道错在哪,求高手帮忙解答,非常感谢! FieldD=[repmat(PRECI,1,N);repmat([-0 ...

  7. 01.神经网络和深度学习 W3.浅层神经网络(作业:带一个隐藏层的神经网络)

    文章目录 1. 导入包 2. 预览数据 3. 逻辑回归 4. 神经网络 4.1 定义神经网络结构 4.2 初始化模型参数 4.3 循环 4.3.1 前向传播 4.3.2 计算损失 4.3.3 后向传播 ...

  8. BP神经网络的非线性函数拟合

    BP神经网络主要用到newff,sim 和train3个神经网络函数,各函数解释如下. 1.newff:BP神经网络参数设置函数 函数功能:构建一个BP神经网络. 函数形式:net= newff(P, ...

  9. 利用pytorch完成BP神经网络的搭建

    使用pytorch完成神经网络的搭建 一.搭建一个最简单的BP神经网络 BP神经网络前向传播: h = w 1 x y = w 2 h h=w1x\\ y=w2h h=w1xy=w2h import ...

最新文章

  1. 著名作者网站论文下载
  2. ubuntu13.04下安装jdk7
  3. 【机器视觉】 assign_at算子
  4. C语言构建一个链表以及操作链表
  5. python中lastch_python复习笔记
  6. 如何简单快速对@RequestParam声明的参数作校验
  7. oracle日期00开头,【原】Oracle中产生 “0000-00-00”格式的日期
  8. 达梦共享存储集群DMDSC-2节点部署手册
  9. Go测试远控免杀学习
  10. 【产品人卫朋】华为IPD流程体系:集成产品开发框架
  11. 小米手机(MIUI 13)安装Fiddler CA证书
  12. MySQL 有哪些锁?
  13. linux系统下使用gcc编译C++程序出现XXX未定义的引用的处理
  14. 欧洲杯赛场“中国元素”引观众热议;万达两家酒店在延安红街开业窑洞房最具特色 | 美通社头条...
  15. 2021年中国互联网企业100强出炉(附全名单)
  16. 【报告分享】抖音企业号操作指南-巨量引擎(附下载)
  17. [LeetCode]179.Largest Number
  18. Rimworld Mod教程 第一章:这可能是你见过的最细的MOD教程了
  19. Linux运维排查常见故障
  20. 糖友秦女士反映时刻注意自己的饮食太痛苦了

热门文章

  1. Stack Overflow 宣布推出离线版本
  2. php隐藏后门,php后门隐藏技巧
  3. SAP物料主数据修改利润中心
  4. leetcode---1758.生成交替二进制字符串的最少操作数
  5. php语言中$意思,PHP语言中的lt;gt;符号是什么意思?
  6. Unity个人记录07-动画系统
  7. codeforces 1509 B. TMT Document
  8. 【基础】(C语言)高精度算法
  9. ffmpeg webm 提取_使用 FFmpeg 对 webp转png , webm转mp4或者gif等进行操作
  10. 抓包工具在测试中的作用