极简反传(BP)神经网络
一、两层神经网络(感知机)
import numpy as np '''极简两层反传(BP)神经网络''' # 样本
X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([0,0,1,1]) # 权值矩阵 初始化
Wi = 2 * np.random.random(3) - 1 for iter in range(10000):
# 前向传播,计算误差
li = X
lo = 1 / (1 + np.exp(-np.dot(li, Wi))) # 激活函数:sigmoid
lo_error = y - lo # 后向传播,更新权值
lo_delta = lo_error * lo * (1 - lo) # sigmoid函数的导数(梯度下降)
Wi += np.dot(lo_delta, li) print("训练效果:\n", lo)
说明:
只有两层:输入层/输出层, 本质是感知机
离线算法:批量学习(numpy矩阵运算的威力在此体现出来了)
效果还蛮不错:
二、三层神经网络
import numpy as np '''极简三层反传(BP)神经网络''' # 样本
X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([0,1,1,0]) # 权值矩阵
Wi = 2 * np.random.random((3, 5)) - 1
Wh = 2 * np.random.random(5) - 1 # 训练
for i in range(10000):
# 前向传播,计算误差
li = X
lh = 1 / (1 + np.exp(-np.dot(li, Wi)))
lo = 1 / (1 + np.exp(-np.dot(lh, Wh)))
lo_error = y - lo # 后向传播,更新权值
lo_delta = lo_error * (lo * (1 - lo))
lh_delta = np.outer(lo_delta, Wh) * (lh * (1 - lh)) # 外积!感谢 numpy 的强大!
Wh += np.dot(lh.T, lo_delta)
Wi += np.dot(li.T, lh_delta) print("训练之后:\n", lo)
说明: 增加了一个隐藏层(五个节点)
三、四层神经网络
import numpy as np '''极简四层反传(BP)神经网络''' # 样本
X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([0,1,1,0]) # 权值矩阵
Wi = 2 * np.random.random((3, 5)) - 1
Wh1 = 2 * np.random.random((5, 4)) - 1
Wh2 = 2 * np.random.random(4) - 1 # 训练
for i in range(10000):
# 前向传播,计算误差
li = X
lh1 = 1 / (1 + np.exp(-np.dot(li, Wi )))
lh2 = 1 / (1 + np.exp(-np.dot(lh1, Wh1)))
lo = 1 / (1 + np.exp(-np.dot(lh2, Wh2)))
lo_error = y - lo # 后向传播,更新权值
lo_delta = lo_error * (lo * (1 - lo))
lh2_delta = np.outer(lo_delta, Wh2.T) * (lh2 * (1 - lh2))
lh1_delta = np.dot(lh2_delta, Wh1.T) * (lh1 * (1 - lh1)) # 注意:这里是dot! Wh2 += np.dot(lh2.T, lo_delta)
Wh1 += np.dot(lh1.T, lh2_delta)
Wi += np.dot(li.T, lh1_delta) print("训练之后:\n", lo)
说明: 增加了两个隐藏层(五个节点,四个节点)
四、三层神经网络的另一种方式
import numpy as np # 样本
X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([0,1,1,0]) ni = 3 # 输入层节点数
nh = 5 # 隐藏层节点数
no = 2 # 输出层节点数(注意这里是2!!) # 初始化矩阵、偏置
Wi = np.random.randn(ni, nh) / np.sqrt(ni)
Wh = np.random.randn(nh, no) / np.sqrt(nh)
bh = np.zeros(nh)
bo = np.zeros(no) # 训练
for i in range(1000):
# 前向传播
li = X
lh = np.tanh(np.dot(X, Wi) + bh) # tanh 函数
lo = np.exp(np.dot(lh, Wh) + bo)
probs = lo / np.sum(lo, axis=1, keepdims=True) # 后向传播
lo_delta = probs
lo_delta[range(X.shape[0]), y] += 1 # -=1
lh_delta = np.dot(lo_delta, Wh.T) * (1 - np.power(lh, 2)) # tanh 函数的导数 # 更新权值、偏置
epsilon = 0.01 # 学习速率
lamda = 0.01 # 正则化强度
bo += -epsilon * np.sum(lo_delta, axis=0, keepdims=True).reshape(-1)
Wh += -epsilon * (np.dot(lh.T, lo_delta) + lamda * Wh)
bh += -epsilon * np.sum(lh_delta, axis=0)
Wi += -epsilon * (np.dot(X.T, lh_delta) + lamda * Wi) print("训练之后:\n", np.argmax(probs, axis=1))
说明:
1. 输出层有两个节点。其原因是样本有两种类别(最值得注意)
2. 添加了偏置、学习速率、正则化强度
3. 预测结果是: np.argmax(probs, axis=1)
4. 当然,也可以推广到多个隐藏层的情况
五、任意层数的神经网络
import numpy as np # 样本
X = np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])
y = np.array([0,1,1,0]) # 神经网络结构,层数任意!
sizes = [3,5,7,2] # 初始化矩阵、偏置
biases = [np.random.randn(j) for j in sizes[1:]]
weights = [np.random.randn(i,j) for i,j in zip(sizes[:-1], sizes[1:])] layers = [None] * len(sizes)
layers[0] = X
layers_delta = [None] * (len(sizes) - 1) epsilon = 0.01 # 学习速率
lamda = 0.01 # 正则化强度 # 训练
for i in range(1000):
# 前向传播
for i in range(1, len(layers)):
layers[i] = 1 / (1 + np.exp(-(np.dot(layers[i-1], weights[i-1]) + biases[i-1]))) # 后向传播
probs = layers[-1] / np.sum(layers[-1], axis=1, keepdims=True)
layers_delta[-1] = probs
layers_delta[-1][range(X.shape[0]), y] += 1
for i in range(len(sizes)-2, 0, -1):
layers_delta[i-1] = np.dot(layers_delta[i], weights[i].T) * (layers[i] * (1 - layers[i])) # 更新权值、偏置
for i in range(len(sizes)-2, -1, -1):
biases[i] -= epsilon * np.sum(layers_delta[i], axis=0)
weights[i] -= epsilon * (np.dot(layers[i].T, layers_delta[i]) + lamda * weights[i]) print("训练之后-->np.argmax(probs, axis=1):\n", np.argmax(probs, axis=1))
说明:
1. 这只是上一种神经网络的层数的扩展
2. 通过内部循环,层数可以任意。
3. 循环次数太大的时候(比如10000),会报RunTimeError,貌似溢出
极简反传(BP)神经网络的更多相关文章
- 神经网络中的BP神经网络和贝叶斯
1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...
- BP神经网络的手写数字识别
BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...
- BP神经网络
秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...
- BP神经网络
BP神经网络基本原理 BP神经网络是一种单向传播的多层前向网络,具有三层或多层以上的神经网络结构,其中包含输入层.隐含层和输出层的三层网络应用最为普遍. 网络中的上下层之间实现全连接,而每层神经元之 ...
- bp神经网络算法
对于BP神经网络算法,由于之前一直没有应用到项目中,今日偶然之时 进行了学习, 这个算法的基本思路是这样的:不断地迭代优化网络权值,使得输入与输出之间的映射关系与所期望的映射关系一致,利用梯度下降的方 ...
- 【转】漫谈ANN(2):BP神经网络
上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,还不足以模拟人脑神经系统的功能.由这些人工神经元构建出来的网络,才能够具有学习.联想.记忆和模式识别的能力.BP网络就是一种简单的人工神经 ...
- bp神经网络及matlab实现
本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例 本文以Fisher的Iris数据集 ...
- Typora极简教程
Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...
- BP神经网络算法推导及代码实现笔记zz
一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...
随机推荐
- 如何创建可扩展表视图中的iOS 学习和拓展优化(有待更新)
首先介绍老外的文章:<How To Create an Expandable Table View in iOS>这是老外用Swift实现 的,对应的老外github项目源码:https: ...
- forfiles命令批量删除N天前文件
在整理手上几台SQL SERVER 2000的数据库备份时,一方面为了方便快速还原数据库,另外一方面为了备份冗余.备份方式统一(先备份到本地,然后收上磁带),将以前通过Symantec Backup ...
- eclipse中基于maven构建的web项目pom.xml中指定的jar包无法发布到tomcat中
eclipse运行maven web项目报错: 信息: Starting Servlet Engine: Apache Tomcat/7.0.57 一月 07, 2015 11:50:44 下午 or ...
- java微信接口之二—获取用户组
一.微信获取用户组接口简介 1.请求 该请求也是GET方式请求.请求的url格式如下: https://api.weixin.qq.com/cgi-bin/groups/get?access_toke ...
- Java读写文件方法总结
Java读写文件方法总结 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既 ...
- dubbo学习之服务提供者
1.简介 这里主要记录如何搭建一个spring框架,提供一个dubbo服务,包括详细的步骤. 2.详细步骤 2.1 项目目录结构 2.2 创建maven项目 new --> Web Projec ...
- Reverse Bits
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- find type d 命令批量删除禁用
[root@qike ~]# find /usr/local/sbin/ -type d /usr/local/sbin//usr/local/sbin/2/usr/local/sbin/g/u ...
- Hive drop table batched
if the hive version not support drop table tablename purge. your drop table command will move data t ...
- 第10章 同步设备I/O和异步设备I/O(4)_利用I/O完成端口实现Socket通信
I/O完成端口原理见上一篇(可点击这里) 10.5.4.4 利用I/O完成端口实现Socket通信 (1)Accept和AcceptEx流程的比较 ①采用accept方式的流程示意图如下(普通的阻塞函 ...