CV学习笔记-BP神经网络代码Python实例

一. 任务描述

给定数据集(txt文件),采用随机梯度下降的方式进行神经网络的学习,完成权重参数的更新,使得输入的数据能够接近输出label。

关于BP神经网络的手推和原理见笔者《CV学习笔记-推理和训练》、《CV学习笔记-BP神经网络》

txt文件类似下图所示

col1 col2 col3
输入1 输入2 label

二. 程序设计

1. 神经网络设计

NeuralNetWork
类内初始化: __init__用以设置神经网络的参数(输入层参数、隐藏层参数、输出层参数、学习率)
类内方法: train用于训练数据,更新权重
读取数据: loadDataSet用于在txt文件中读取数据,包括输入值和label值
随机梯度下降处理: stocGradDescent用于处理训练数据的过程

2. 具体设计

  • NeuralNetWork类
class NeuralNetWork:def __init__(self, input_nodes, hidden_nodes, out_nodes, lr):# 设置输入个数self.innodes = input_nodes# 设置隐藏层节点个数self.hnodes = hidden_nodes# 设置输出节点个数self.onodes = out_nodes# 设置学习率,用于反向更新self.lr = lr# self.weight_i2h = np.ones((self.hnodes, self.innodes))# self.weight_h2o = np.ones((self.onodes, self.hnodes))# 随机初始化比1矩阵效果要好很多# 权重矩阵(输入到隐藏)self.weight_i2h = (numpy.random.normal(0.0, pow(self.hnodes,-0.5), (self.hnodes,self.innodes) )  )# 权重矩阵(隐藏到输出)self.weight_h2o = (numpy.random.normal(0.0, pow(self.onodes,-0.5), (self.onodes,self.hnodes) )  )# 设置激活函数(sigmoid)self.activation_function = lambda x: 1.0/(1+np.exp(-x))pass'''训练方法,输入一次训练的输入和label'''def train(self, inputs_list, targets_list):inputs = numpy.array(inputs_list, ndmin=2).Ttarget = np.array(targets_list, ndmin=2).T# wx+bhidden_inputs = np.dot(self.weight_i2h, inputs)# 激活作为隐藏层的输出hidden_outputs = self.activation_function(hidden_inputs)# wx+bo_inputs = np.dot(self.weight_h2o, hidden_outputs)# 激活作为输出o_outputs = self.activation_function(o_inputs)# 损失函数loss = (target - o_outputs) ** 2 * 0.5# 输出误差,用于反向更新error = target - o_outputs# error = target - o_outputs# 隐藏层误差,用于反向更新hidden_error = np.dot(self.weight_h2o.T, error * o_outputs * (1 - o_outputs))# 梯度gradO = error * o_outputs * (1 - o_outputs)# 反向更新,详见笔者博客[《CV学习笔记-BP神经网络》(https://blog.csdn.net/qq_38853759/article/details/121930413)self.weight_h2o += self.lr * np.dot((error * o_outputs * (1 - o_outputs)), np.transpose(hidden_outputs))gradI = hidden_error * hidden_outputs * (1 - hidden_outputs)# 反向更新self.weight_i2h += self.lr * np.dot((hidden_error * hidden_outputs * (1 - hidden_outputs)),np.transpose(inputs))return loss
  • 读取数据集并处理
def loadDataSet():data = []label = []fr = open('testSet.txt')for line in fr.readlines():lineArr = line.strip().split()data.append([1.0, float(lineArr[0]), float(lineArr[1])])label.append(int(lineArr[2]))data = np.array(data)label = np.array(label)return data, label
  • 训练过程处理
def stocGradDescent(data, label):m, n = np.shape(data)for iter in range(200):total_loss = 0for i in range(m):# if label[i] == 1:#     pass# elif label[i] == 0:#     pass# 累计每个epoch的loss观察效果total_loss += net.train(data[i], label[i])print("NO.{} Loss={}".format(iter, total_loss))

三、实践代码

import numpy
import numpy as npclass NeuralNetWork:def __init__(self, input_nodes, hidden_nodes, out_nodes, lr):self.innodes = input_nodesself.hnodes = hidden_nodesself.onodes = out_nodesself.lr = lr# self.weight_i2h = np.ones((self.hnodes, self.innodes))# self.weight_h2o = np.ones((self.onodes, self.hnodes))# 随机初始化比1矩阵效果要好很多self.weight_i2h = (numpy.random.normal(0.0, pow(self.hnodes,-0.5), (self.hnodes,self.innodes) )  )self.weight_h2o = (numpy.random.normal(0.0, pow(self.onodes,-0.5), (self.onodes,self.hnodes) )  )self.activation_function = lambda x: 1.0/(1+np.exp(-x))passdef train(self, inputs_list, targets_list):inputs = numpy.array(inputs_list, ndmin=2).Ttarget = np.array(targets_list, ndmin=2).Thidden_inputs = np.dot(self.weight_i2h, inputs)hidden_outputs = self.activation_function(hidden_inputs)o_inputs = np.dot(self.weight_h2o, hidden_outputs)o_outputs = self.activation_function(o_inputs)loss = (target - o_outputs) ** 2 * 0.5error = target - o_outputs# error = target - o_outputshidden_error = np.dot(self.weight_h2o.T, error * o_outputs * (1 - o_outputs))gradO = error * o_outputs * (1 - o_outputs)self.weight_h2o += self.lr * np.dot((error * o_outputs * (1 - o_outputs)), np.transpose(hidden_outputs))gradI = hidden_error * hidden_outputs * (1 - hidden_outputs)self.weight_i2h += self.lr * np.dot((hidden_error * hidden_outputs * (1 - hidden_outputs)),np.transpose(inputs))return loss# 从testSet.txt中读取数据存储至样本集data和标签集label
def loadDataSet():data = []label = []fr = open('testSet.txt')for line in fr.readlines():lineArr = line.strip().split()data.append([1.0, float(lineArr[0]), float(lineArr[1])])label.append(int(lineArr[2]))data = np.array(data)label = np.array(label)return data, labeldef stocGradDescent(data, label):m, n = np.shape(data)for iter in range(200):total_loss = 0for i in range(m):# if label[i] == 1:#     pass# elif label[i] == 0:#     passtotal_loss += net.train(data[i], label[i])print("NO.{} Loss={}".format(iter, total_loss))if __name__ == '__main__':input_nodes = 3hidden_nodes = 3output_nodes = 1learning_rate = 0.1net = NeuralNetWork(input_nodes, hidden_nodes, output_nodes, learning_rate)data, label = loadDataSet()stocGradDescent(data, label)print(net.weight_i2h)print(net.weight_h2o)pass

txt文本文件内容请自行复制

-0.017612    14.053064   0
-1.395634   4.662541    1
-0.752157   6.538620    0
-1.322371   7.152853    0
0.423363    11.054677   0
0.406704    7.067335    1
0.667394    12.741452   0
-2.460150   6.866805    1
0.569411    9.548755    0
-0.026632   10.427743   0
0.850433    6.920334    1
1.347183    13.175500   0
1.176813    3.167020    1
-1.781871   9.097953    0
-0.566606   5.749003    1
0.931635    1.589505    1
-0.024205   6.151823    1
-0.036453   2.690988    1
-0.196949   0.444165    1
1.014459    5.754399    1
1.985298    3.230619    1
-1.693453   -0.557540   1
-0.576525   11.778922   0
-0.346811   -1.678730   1
-2.124484   2.672471    1
1.217916    9.597015    0
-0.733928   9.098687    0
-3.642001   -1.618087   1
0.315985    3.523953    1
1.416614    9.619232    0
-0.386323   3.989286    1
0.556921    8.294984    1
1.224863    11.587360   0
-1.347803   -2.406051   1
1.196604    4.951851    1
0.275221    9.543647    0
0.470575    9.332488    0
-1.889567   9.542662    0
-1.527893   12.150579   0
-1.185247   11.309318   0
-0.445678   3.297303    1
1.042222    6.105155    1
-0.618787   10.320986   0
1.152083    0.548467    1
0.828534    2.676045    1
-1.237728   10.549033   0
-0.683565   -2.166125   1
0.229456    5.921938    1
-0.959885   11.555336   0
0.492911    10.993324   0
0.184992    8.721488    0
-0.355715   10.325976   0
-0.397822   8.058397    0
0.824839    13.730343   0
1.507278    5.027866    1
0.099671    6.835839    1
-0.344008   10.717485   0
1.785928    7.718645    1
-0.918801   11.560217   0
-0.364009   4.747300    1
-0.841722   4.119083    1
0.490426    1.960539    1
-0.007194   9.075792    0
0.356107    12.447863   0
0.342578    12.281162   0
-0.810823   -1.466018   1
2.530777    6.476801    1
1.296683    11.607559   0
0.475487    12.040035   0
-0.783277   11.009725   0
0.074798    11.023650   0
-1.337472   0.468339    1
-0.102781   13.763651   0
-0.147324   2.874846    1
0.518389    9.887035    0
1.015399    7.571882    0
-1.658086   -0.027255   1
1.319944    2.171228    1
2.056216    5.019981    1
-0.851633   4.375691    1
-1.510047   6.061992    0
-1.076637   -3.181888   1
1.821096    10.283990   0
3.010150    8.401766    1
-1.099458   1.688274    1
-0.834872   -1.733869   1
-0.846637   3.849075    1
1.400102    12.628781   0
1.752842    5.468166    1
0.078557    0.059736    1
0.089392    -0.715300   1
1.825662    12.693808   0
0.197445    9.744638    0
0.126117    0.922311    1
-0.679797   1.220530    1
0.677983    2.556666    1
0.761349    10.693862   0
-2.168791   0.143632    1
1.388610    9.341997    0
0.317029    14.739025   0

四、 效果测试


通过debug看效果:

可见刚开始网络的输出跟label的差距还是很大

可以看到训练到一百多代的时候loss已经有了明显的下降

此时debug看效果,可以看到效果明显改善,网络的输出已经比较小接近于真实label:0了

label为1的效果也靠谱很多了

最后打印出权重参数:

CV学习笔记-BP神经网络代码Python实例相关推荐

  1. CV学习笔记-BP神经网络训练实例(含详细计算过程与公式推导)

    BP神经网络训练实例 1. BP神经网络 关于BP神经网络在我的上一篇博客<CV学习笔记-推理和训练>中已有介绍,在此不做赘述.本篇中涉及的一些关于BP神经网络的概念与基础知识均在< ...

  2. 吴恩达《机器学习》学习笔记十一——神经网络代码

    吴恩达<机器学习>学习笔记十一--神经网络代码 数据准备 神经网络结构与代价函数· 初始化设置 反向传播算法 训练网络与验证 课程链接:https://www.bilibili.com/v ...

  3. [学习笔记]BP神经网络原理以及训练步骤

    神经网络由三层组成,分别是输入层,输出层和隐蔽层.根据需要,隐蔽层可以是一层,二层或者三层.一般来说,使用一层隐蔽层,以及输出层使用非线性函数已经可以适用绝大数问题.多加一层隐蔽层并不会带来结果上的明 ...

  4. 『CV学习笔记』图像处理透视变换(Python+Opencv)

    图像处理透视变换(Opencv) 文章目录 一. 透视变换定义 二. 代码实现 2.1. order_points函数 2.2. four_point_transform函数 2.3. 程序主函数 三 ...

  5. y空间兑换代码_【CV学习笔记】色彩空间

    关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间来源:知乎链接:https://zhuanlan.zhihu.com/p/103387082 ...

  6. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  7. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR

    原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression  python源代码(GitHub下载 CSDN免费下载) ...

  8. bp神经网络预测python代码_机器学习之多层神经网络(附Python代码和数据)

    1 引言 多层神经网络,Multiple-layers Perceptron (MLP),又被称为多层感知机,是机器学习中深度学习的典型算法.关于多层神经网络的算法原理,我们在Stata和R实现的文章 ...

  9. bp 神经网络 优点 不足_深度学习之BP神经网络--Stata和R同步实现(附Stata数据和代码)

    说明:本文原发于"计量经济圈"公众号,在此仅展示Stata的部分.R部分请移步至本人主页的"R语言与机器学习--经济学视角"专栏,或点击下方链接卡跳转. 盲区行 ...

  10. cv学习笔记(3)神经网络数学原理

    cv学习笔记(3)神经网络数学原理 根据一个神经网络例子来介绍 输入是年龄.收入.性别,输出是买车和不买车的概率.该神经网络包含一个输入层.一个隐含层.一个输出层,每个节点和下一层的所有节点都有连接, ...

最新文章

  1. Python字节码介绍
  2. iconfont 图标宽高出问题_一个技巧,100,000,000+PPT图标就可以任性使用!【黑科技第11期】...
  3. THUPCCTSAPIO2019:Far Away
  4. Universal-Image-Loader解析(二)——DisplayImageOptions的详细配置与简单的图片加载...
  5. 2044. 统计按位或能得到最大值的子集数目
  6. 邻结矩阵的建立和 BFS,DFS;;
  7. 付费?广告?捐款?如何让开源软件活下去?
  8. Python XML操作处理
  9. 美人计--图片asp木马
  10. 【代码优化】坚持使用Override注解
  11. 全网最详细解释tarjan算法
  12. typescript获取时间戳
  13. lynx浏览器的使用教程
  14. 荣耀终端android面试,华为终端面试经验
  15. 计算机网络的组成有哪些
  16. 请问dede怎么样把会员信息调用到首页,调用会员头像和名字
  17. C#个人博客系统源码(前台+后台管理)
  18. 正宇丨有钱,把日子过好;没钱,把心情过好
  19. 师徒结对活动记录表计算机,师徒结对活动记录表一.doc
  20. 如何选择适合你的兴趣爱好(六十六),折纸

热门文章

  1. WEB前端开发快速入门教程
  2. 得力人脸识别考勤机密码设置_得力人脸识别考勤机使用与上传数据方法哪位清楚?...
  3. Win7开发的VC2012程序在XP上无法运行
  4. oppo 手机刷机和root,还有其他必备的刷机工具,需要请进!!!
  5. 如何进行在线Post接口测试?
  6. 三角波的傅里叶变换对_傅里叶变换推导详解
  7. wifi协议-802
  8. K8S你知道,K9S你可能也知道,那Lens呢?
  9. 拼音模糊搜索 php,基于 XunSearch(迅搜)SDK 的全文搜索 Laravel 5.* 软件包,支持全拼、拼音简写、模糊搜索、热门搜索、搜索提示...
  10. QQ浏览器怎么关闭云加速 QQ浏览器云加速关闭方法