一、两层神经网络(感知机)

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)神经网络的更多相关文章

  1. 神经网络中的BP神经网络和贝叶斯

    1 贝叶斯网络在地学中的应用 1 1.1基本原理及发展过程 1 1.2 具体的研究与应用 4 2 BP神经网络在地学中的应用 6 2.1BP神经网络简介 6 2.2基本原理 7 2.3 在地学中的具体 ...

  2. BP神经网络的手写数字识别

    BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...

  3. BP神经网络

    秋招刚结束,这俩月没事就学习下斯坦福大学公开课,想学习一下深度学习(这年头不会DL,都不敢说自己懂机器学习),目前学到了神经网络部分,学习起来有点吃力,把之前学的BP(back-progagation ...

  4.  BP神经网络

     BP神经网络基本原理 BP神经网络是一种单向传播的多层前向网络,具有三层或多层以上的神经网络结构,其中包含输入层.隐含层和输出层的三层网络应用最为普遍. 网络中的上下层之间实现全连接,而每层神经元之 ...

  5. bp神经网络算法

    对于BP神经网络算法,由于之前一直没有应用到项目中,今日偶然之时 进行了学习, 这个算法的基本思路是这样的:不断地迭代优化网络权值,使得输入与输出之间的映射关系与所期望的映射关系一致,利用梯度下降的方 ...

  6. 【转】漫谈ANN(2):BP神经网络

    上一次我们讲了M-P模型,它实际上就是对单个神经元的一种建模,还不足以模拟人脑神经系统的功能.由这些人工神经元构建出来的网络,才能够具有学习.联想.记忆和模式识别的能力.BP网络就是一种简单的人工神经 ...

  7. bp神经网络及matlab实现

    本文主要内容包含: (1) 介绍神经网络基本原理,(2) AForge.NET实现前向神经网络的方法,(3) Matlab实现前向神经网络的方法 . 第0节.引例  本文以Fisher的Iris数据集 ...

  8. Typora极简教程

    Typora极简教程 ” Markdown 是一种轻量级标记语言,创始人是约翰·格鲁伯(John Gruber).它允许人们 “使用易读易写的纯文本格式编写文档,然后转换成有效的 HTML 文档.” ...

  9. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...

随机推荐

  1. IOS 沙盒机制 浅析

    IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件 ...

  2. Spring概述

    layout: post title: Spring概述 tags: [Java,Spring,IOC,AOP] --- Spring是一个开源的轻量级Java SE(Java 标准版本)/Java ...

  3. iOS网络-02-数据解析(JSON与XML)

    数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...

  4. 使用Ant构建struts2 web工程,自动编译,打包成war

    c&c++语言通常使用make脚本来构建和管理自己的工程,同样java也有自己的构建工具(Ant),使用时需要写一个biuld.xml,有点类似c&c++里的makefile. 一.首 ...

  5. 后台API服务的设计考虑

    我在<写在最前>里说过,后台API的文档至关重要.不过,文档只是外在表现形式,设计才是真正的灵魂.我在这篇博文主要介绍的就是我在后台开发过程中,设计API时的考虑.我只说他是考虑,因为很多 ...

  6. MFC获取光标相对于控件所在行

    获取光标在控件上所在的行数 /*editControl为Edit Control的变量*/ CPoint point = editControl.GetCaretPos(); //获取光标相对于控件的 ...

  7. html标题_段落_换行_水平线_特殊字符

    标题 <h1>一级标题</h1> <h2 align="对齐方式">二级标题</h2> 对齐方式有left,center,right ...

  8. mysql force index() 强制索引的使用

    mysql force index() 强制索引的使用 之前跑了一个SQL,由于其中一个表的数据量比较大,而在条件中有破坏索引或使用了很多其他索引,就会使得sql跑的非常慢... 那我们怎么解决呢? ...

  9. 迅为iTOP-4418开发板兼容八核6818开发板介绍

    核心板介绍 三星四核S5P4418与八核6818完美兼容 1GB内存/2GB内存可选 电源管理:AXP228,支持动态调频,超低功耗 核心板引出脚最全:四组连接器共320个PIN脚 核心板连接器高度仅 ...

  10. 【读书笔记《Android游戏编程之从零开始》】7.Android 游戏开发常用的系统控件(Dialog)

    在Android应用开发中,Dialog(对话框)创建简单且易于管理因而经常用到,对话框默认样式类似创建样式的Activity.首先介绍android.app.AlertDialog下的Builder ...