用Python实现人工神经网络(简易版)
人工神经网络
- 人工神经网络简介
- 代码
- 神经网络的缺点
- 程序优化
- BP算法
- 补充
人工神经网络简介
人工神经网络(Artificial Neural Network, ANN)是指一系列受生物学和神经学启发的数学模型. 在人工智能领域, 人工神经网络也常常简称为神经网络(Neural Network, NN)或神经模型(Neural Model). 一个简单的多层前馈神经网络如下图.
代码
构造一个神经网络类, 首先需要将一些变量进行初始化,其中各个层的权重矩阵以及偏置项分别存储在字典中, 键代表层数.
from scipy.special import expit
import numpy as npclass ANN(object):def __init__(self, innum, outnum, lr, *hide_tuple):self.innum = innum # 输入节点的个数self.outnum = outnum # 输出节点的个数self.lr = lr # 学习率self.layernum = len(hide_tuple) + 1 # 神经网络的层数self.Weight = {} # 权重矩阵self.Bias = {} # 偏置项# 对权重矩阵和偏置项进行初始化self.Weight[1] = np.random.normal(0.0, pow(self.innum, -0.5), (hide_tuple[0], self.innum))for i in range(1, self.layernum):self.Bias[i] = np.random.randn(hide_tuple[i-1]).reshape(hide_tuple[i-1], 1)if i>=2:self.Weight[i] = np.random.normal(0.0, pow(hide_tuple[i-1], -0.5), (hide_tuple[i-1], hide_tuple[i-2]))self.Weight[self.layernum] = np.random.normal(0.0, pow(hide_tuple[-1], -0.5), (self.outnum, hide_tuple[-1]))self.Bias[self.layernum] = np.random.randn(self.outnum).reshape(self.outnum, 1)self.ActiveFunction = lambda x: expit(x) # 激活函数为logistic函数
接下来通过BP算法反向求解误差,进而不断更新权重和偏置项, 其中将所有层的输入和输出分别存入相应的字典中, 键代表相应的层数.
def BPFit(self, input_list, target_list):Input0 = np.array(input_list, ndmin=2).TTargetValue = np.array(target_list, ndmin=2).TInput = {} # 输入值Output = {} # 输出值Output[0] = Input0for i in range(1, self.layernum+1):Input[i] = np.dot(self.Weight[i], Output[i-1])Output[i] = self.ActiveFunction(Input[i] + self.Bias[i])Error={} # 误差项Error[self.layernum] = Output[self.layernum] * (1 - Output[self.layernum]) * (-(TargetValue - Output[self.layernum]))self.Weight[self.layernum] -= self.lr * Error[self.layernum] * Output[self.layernum-1].Tself.Bias[self.layernum] -= self.lr * Error[self.layernum]for i in range(self.layernum-1, 0, -1): # 从倒数第二层的误差项开始Error[i] = Output[i] * (1 - Output[i]) * np.dot(self.Weight[i+1].T, Error[i+1])self.Weight[i] -= self.lr * Error[i] * Output[i-1].Tself.Bias[i] -= self.lr * Error[i]
接着再添加一个预测函数, 它是用来实现神经网络预测功能的成员函数.
def predict(self, input_list):Input0 = np.array(input_list, ndmin=2).TInput = {}Output = {}Output[0] = Input0for i in range(1, self.layernum + 1):Input[i] = np.dot(self.Weight[i], Output[i - 1])Output[i] = self.ActiveFunction(Input[i] + self.Bias[i])return Output[self.layernum]
最后来测试一下程序是否可以正确运行. 在测试中, 小编任选一个4维的输入向量, 1维的输出向量, 中间添加了四个隐藏层.
if __name__ == '__main__':"""测试样例"""inode = 4 # 输入节点个数hnode1 = 4 # 第1层隐节点个数hnode2 = 5 # 第2层隐节点个数hnode3 = 10 # 第3层隐节点个数hnode4 = 5 # 第4层隐节点个数onodenum = 1 # 输出节点个数learningrate = 0.3 # 学习率ann = ANN(inode, onodenum, learningrate, hnode1, hnode2, hnode3, hnode4)TrainValue = [1, 3, 2, 4]TargetValue = [0]ann.BPFit(TrainValue, TargetValue)TestValue = [2, 4, 2, 4]predict = ann.predict(TestValue)print(predict) # 输出预测结果
预测结果为:
这样就实现了简易版神经网络的搭建.
神经网络的缺点
- 可解释性差
神经网络相当于一个黑箱模型, 不知道能产生什么结果, 也不知道为什么产生这种结果. 但是决策树可以遵循一定的逻辑, 如果出问题也能想出来原因, 比如银行就不会用神经网络预测一个人的信誉. - 耗时耗力
训练大型的神经网络需要花费大量的时间以及需要大量的内存来对神经网络进行训练 - 样本量大
为了得到一个预测能力强的神经网络, 前提是需要大量的样本 - 信息丢失
因为在训练神经网络时, 需要把样本都转换成数值型, 在转化的过程中就会用信息丢失.
程序优化
虽然实现了简易版的神经网络, 并且可以任意设置层数以及神经元的个数, 但是为了提高预测的准确率和运行速度, 还可以从许多方面对该程序进行优化. 比如:
- 初始权重矩阵以及偏置项
- 样本量
- 优化器的种类
- 优化器的学习率
- 神经网络的层数
- 神经元的个数
- 激活函数
- 损失函数
- 训练次数
BP算法
本文中的神经网络是基于BP算法来搭建的. 在本文结尾引用的书籍中, 对于该算法有详细的介绍, 在这里小编就不再详细介绍该算法了, 感兴趣的小伙伴们可以了解一下哈~
补充
这是小编的第一篇博文, 也是小编初入互联网大家庭的一个标志. 因为本篇文章主要靠小编自己的理解去写的, 所以可能存在一些不是很恰当的词语, 还请大家多多包容与理解. 最后立个flag, 小编会继续加油, 希望可以早日甩掉技术小白的称号!!!(ps: Python源码已经上传到小编的github)
[1]: 邱锡鹏. 神经网络与深度学习.
用Python实现人工神经网络(简易版)相关推荐
- python车辆管理系统_Python简易版停车管理系统
本文实例为大家分享了Python简易版停车管理系统的具体代码,供大家参考,具体内容如下 import time # 最大停车数 max_car = 100 # 当前停车数,初始为0 cur_car = ...
- python web server_Python实现简易版的Web服务器(推荐)
下面给大家介绍python实现简易版的web服务器,具体内容详情大家通过本文学习吧! 1.请自行了解HTTP协议 2.创建Socket服务,监听指定IP和端口 3.以阻塞方式等待客户端连接 4.读取客 ...
- Python与人工神经网络(2)——使用神经网络识别手写图像
人体的视觉系统是一个相当神奇的存在,对于下面的一串手写图像,可以毫不费力的识别出他们是504192,轻松到让人都忘记了其实这是一个复杂的工作. 实际上在我们的大脑的左脑和右脑的皮层都有一个第一视觉区域 ...
- 用Python做一个游戏——简易版贪吃蛇
前言 今天,我来分享个中等级的简易版贪吃蛇,这次不是用turtle库,而是用pygame库和sys库. 1.导入库 我们需要把游戏所用的库导入进来: import pygame import sys ...
- Python与人工神经网络(5)——交叉熵成本函数
我们花了两篇文章的篇幅,建立了一个神经网络来识别手写图像,看起来效果相当不错,超过95%的正确率,实际上如果第二层使用100个隐藏神经元的时候,准确率可以再提升一个百分点.在这个过程中我们主要使用了随 ...
- python ANN人工神经网络手写字图像识别(成功运行)
opencv中也提供了一种类似于Keras的神经网络,即为ann,这种神经网络的使用方法与Keras的很接近. 关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析 ...
- 一个python停车管理系统_Python简易版的停车管理系统
import time # 最大停车数 max_car = 100 # 当前停车数,初始为0 cur_car = 0 # 当前停车列表,初始设置为空 car_list = [] time.asctim ...
- 吴裕雄 python 机器学习——人工神经网络与原始感知机模型
import numpy as npfrom matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from ...
- python做神经网络识别车牌_Python与人工神经网络:使用神经网络识别手写图像介绍...
人体的视觉系统是一个相当神奇的存在,对于下面的一串手写图像,可以毫不费力的识别出他们是504192,轻松到让人都忘记了其实这是一个复杂的工作. 实际上在我们的大脑的左脑和右脑的皮层都有一个第一视觉区域 ...
最新文章
- 源码分析-HashSet、LinkedHashSet
- java中struts2日期_Struts2中Date日期转换的问题
- 多个高维数组使用npz保存
- Webpack 10分钟入门
- 转:java的各个拓展类库的推荐方案
- Java高级语法笔记-多个异常处理
- YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24
- WebStorm搭建Node开发环境
- 廖雪峰--python教程:笔记四-函数式编程
- OpenShift Security (12) - 用 RHACS 管理容器之间的网络访问策略
- 大数据有哪些分析误区
- 网站获取ip代码怎么写_大学生写论文必备技能:怎么免费获取外文文献并下载...
- [CSS学习] line-height属性讲解
- 服务器系统事件id1001,win10系统玩游戏出现蓝屏事件ID1001的解决方法
- Android6.0 Marshmallow运行时权限申请框架
- 好文分享:一切都是最好的安排
- unity 弹窗提示_【原创】Unity3D 消息提示框
- 2019 SIGGRAPH paper
- 【ERROR】java java.lang.NoClassDefFoundError 的解决办法(全)
- 什么是短效IP和长效IP?