人工神经网络

  • 人工神经网络简介
  • 代码
  • 神经网络的缺点
  • 程序优化
  • 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)      # 输出预测结果

预测结果为:
这样就实现了简易版神经网络的搭建.

神经网络的缺点

  • 可解释性差
    神经网络相当于一个黑箱模型, 不知道能产生什么结果, 也不知道为什么产生这种结果. 但是决策树可以遵循一定的逻辑, 如果出问题也能想出来原因, 比如银行就不会用神经网络预测一个人的信誉.
  • 耗时耗力
    训练大型的神经网络需要花费大量的时间以及需要大量的内存来对神经网络进行训练
  • 样本量大
    为了得到一个预测能力强的神经网络, 前提是需要大量的样本
  • 信息丢失
    因为在训练神经网络时, 需要把样本都转换成数值型, 在转化的过程中就会用信息丢失.

程序优化

虽然实现了简易版的神经网络, 并且可以任意设置层数以及神经元的个数, 但是为了提高预测的准确率和运行速度, 还可以从许多方面对该程序进行优化. 比如:

  1. 初始权重矩阵以及偏置项
  2. 样本量
  3. 优化器的种类
  4. 优化器的学习率
  5. 神经网络的层数
  6. 神经元的个数
  7. 激活函数
  8. 损失函数
  9. 训练次数

BP算法

本文中的神经网络是基于BP算法来搭建的. 在本文结尾引用的书籍中, 对于该算法有详细的介绍, 在这里小编就不再详细介绍该算法了, 感兴趣的小伙伴们可以了解一下哈~

补充

这是小编的第一篇博文, 也是小编初入互联网大家庭的一个标志. 因为本篇文章主要靠小编自己的理解去写的, 所以可能存在一些不是很恰当的词语, 还请大家多多包容与理解. 最后立个flag, 小编会继续加油, 希望可以早日甩掉技术小白的称号!!!(ps: Python源码已经上传到小编的github)

[1]: 邱锡鹏. 神经网络与深度学习.

用Python实现人工神经网络(简易版)相关推荐

  1. python车辆管理系统_Python简易版停车管理系统

    本文实例为大家分享了Python简易版停车管理系统的具体代码,供大家参考,具体内容如下 import time # 最大停车数 max_car = 100 # 当前停车数,初始为0 cur_car = ...

  2. python web server_Python实现简易版的Web服务器(推荐)

    下面给大家介绍python实现简易版的web服务器,具体内容详情大家通过本文学习吧! 1.请自行了解HTTP协议 2.创建Socket服务,监听指定IP和端口 3.以阻塞方式等待客户端连接 4.读取客 ...

  3. Python与人工神经网络(2)——使用神经网络识别手写图像

    人体的视觉系统是一个相当神奇的存在,对于下面的一串手写图像,可以毫不费力的识别出他们是504192,轻松到让人都忘记了其实这是一个复杂的工作. 实际上在我们的大脑的左脑和右脑的皮层都有一个第一视觉区域 ...

  4. 用Python做一个游戏——简易版贪吃蛇

    前言 今天,我来分享个中等级的简易版贪吃蛇,这次不是用turtle库,而是用pygame库和sys库. 1.导入库 我们需要把游戏所用的库导入进来: import pygame import sys ...

  5. Python与人工神经网络(5)——交叉熵成本函数

    我们花了两篇文章的篇幅,建立了一个神经网络来识别手写图像,看起来效果相当不错,超过95%的正确率,实际上如果第二层使用100个隐藏神经元的时候,准确率可以再提升一个百分点.在这个过程中我们主要使用了随 ...

  6. python ANN人工神经网络手写字图像识别(成功运行)

    opencv中也提供了一种类似于Keras的神经网络,即为ann,这种神经网络的使用方法与Keras的很接近. 关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析 ...

  7. 一个python停车管理系统_Python简易版的停车管理系统

    import time # 最大停车数 max_car = 100 # 当前停车数,初始为0 cur_car = 0 # 当前停车列表,初始设置为空 car_list = [] time.asctim ...

  8. 吴裕雄 python 机器学习——人工神经网络与原始感知机模型

    import numpy as npfrom matplotlib import pyplot as plt from mpl_toolkits.mplot3d import Axes3D from ...

  9. python做神经网络识别车牌_Python与人工神经网络:使用神经网络识别手写图像介绍...

    人体的视觉系统是一个相当神奇的存在,对于下面的一串手写图像,可以毫不费力的识别出他们是504192,轻松到让人都忘记了其实这是一个复杂的工作. 实际上在我们的大脑的左脑和右脑的皮层都有一个第一视觉区域 ...

最新文章

  1. 海思3536:PC客户端编译过程报错及解决方法
  2. shell编程中for/while/util/case/select/break/continue
  3. I/O模型系列之四:两种高性能IO设计模式 Reactor 和 Proactor
  4. 手把手带你入门Python爬虫(三、PyMySQL)
  5. NumPy Essentials 带注释源码 六、NumPy 中的傅里叶分析
  6. http请求过程及性能优化分析
  7. 波浪线html,js中的波浪线符号作用(按位非(~)符号)
  8. 怎么破解Windows账户密码
  9. 白城师范学院计算机系鲍金玲,企业绩效考核方法的比较与借鉴
  10. 022-互惠合作|离职员工的关系网
  11. [Javascript 高级程序设计]学习心得记录9 js面向对象
  12. 性能测试:一个完整的性能测试过程
  13. 数字图像处理(1)-数字图像处理的基本步骤
  14. Ubuntu 22.04 使用私钥登录时提示 server refused our key
  15. 关于conda无法创建新环境的解决方法(路径或channel)
  16. spring自定义定时任务- @Scheduled注解
  17. 英文字体(for banner)
  18. 向未来再出发,云客荣获金鸥奖2021年度企业服务商
  19. js删除数组里的某一项
  20. 第七届“创客中国”物联网中小企业创新创业大赛决赛落幕,云蝠智能荣获二等奖

热门文章

  1. Socket实现文件传输
  2. AI加速信息和知识获取速度,使用Python对MD格式文件和HTML网页进行内容摘要,2023年4月AI网页内容摘要工具大全
  3. 【零基础入门C语言】 初识C语言—1
  4. 《优秀的绵羊》读后感
  5. html5常用英文单词,英语中最常用的50个单词(上)
  6. Android获取Cookies,持久化PHPSESSID (OkHttp ;HttpClient ;Afinal)
  7. 查全率、查准率与F1
  8. Office经常出现未响应的解决方法
  9. TOML配置文件使用
  10. AKH-0.66/K-Φ系列开口电流互感器的特点是什么?(安科瑞-卓宋兰)