CV学习笔记-BP神经网络代码Python实例
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实例相关推荐
- CV学习笔记-BP神经网络训练实例(含详细计算过程与公式推导)
BP神经网络训练实例 1. BP神经网络 关于BP神经网络在我的上一篇博客<CV学习笔记-推理和训练>中已有介绍,在此不做赘述.本篇中涉及的一些关于BP神经网络的概念与基础知识均在< ...
- 吴恩达《机器学习》学习笔记十一——神经网络代码
吴恩达<机器学习>学习笔记十一--神经网络代码 数据准备 神经网络结构与代价函数· 初始化设置 反向传播算法 训练网络与验证 课程链接:https://www.bilibili.com/v ...
- [学习笔记]BP神经网络原理以及训练步骤
神经网络由三层组成,分别是输入层,输出层和隐蔽层.根据需要,隐蔽层可以是一层,二层或者三层.一般来说,使用一层隐蔽层,以及输出层使用非线性函数已经可以适用绝大数问题.多加一层隐蔽层并不会带来结果上的明 ...
- 『CV学习笔记』图像处理透视变换(Python+Opencv)
图像处理透视变换(Opencv) 文章目录 一. 透视变换定义 二. 代码实现 2.1. order_points函数 2.2. four_point_transform函数 2.3. 程序主函数 三 ...
- y空间兑换代码_【CV学习笔记】色彩空间
关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间来源:知乎链接:https://zhuanlan.zhihu.com/p/103387082 ...
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP
原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...
- 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR
原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression python源代码(GitHub下载 CSDN免费下载) ...
- bp神经网络预测python代码_机器学习之多层神经网络(附Python代码和数据)
1 引言 多层神经网络,Multiple-layers Perceptron (MLP),又被称为多层感知机,是机器学习中深度学习的典型算法.关于多层神经网络的算法原理,我们在Stata和R实现的文章 ...
- bp 神经网络 优点 不足_深度学习之BP神经网络--Stata和R同步实现(附Stata数据和代码)
说明:本文原发于"计量经济圈"公众号,在此仅展示Stata的部分.R部分请移步至本人主页的"R语言与机器学习--经济学视角"专栏,或点击下方链接卡跳转. 盲区行 ...
- cv学习笔记(3)神经网络数学原理
cv学习笔记(3)神经网络数学原理 根据一个神经网络例子来介绍 输入是年龄.收入.性别,输出是买车和不买车的概率.该神经网络包含一个输入层.一个隐含层.一个输出层,每个节点和下一层的所有节点都有连接, ...
最新文章
- Python字节码介绍
- iconfont 图标宽高出问题_一个技巧,100,000,000+PPT图标就可以任性使用!【黑科技第11期】...
- THUPCCTSAPIO2019:Far Away
- Universal-Image-Loader解析(二)——DisplayImageOptions的详细配置与简单的图片加载...
- 2044. 统计按位或能得到最大值的子集数目
- 邻结矩阵的建立和 BFS,DFS;;
- 付费?广告?捐款?如何让开源软件活下去?
- Python XML操作处理
- 美人计--图片asp木马
- 【代码优化】坚持使用Override注解
- 全网最详细解释tarjan算法
- typescript获取时间戳
- lynx浏览器的使用教程
- 荣耀终端android面试,华为终端面试经验
- 计算机网络的组成有哪些
- 请问dede怎么样把会员信息调用到首页,调用会员头像和名字
- C#个人博客系统源码(前台+后台管理)
- 正宇丨有钱,把日子过好;没钱,把心情过好
- 师徒结对活动记录表计算机,师徒结对活动记录表一.doc
- 如何选择适合你的兴趣爱好(六十六),折纸
热门文章
- WEB前端开发快速入门教程
- 得力人脸识别考勤机密码设置_得力人脸识别考勤机使用与上传数据方法哪位清楚?...
- Win7开发的VC2012程序在XP上无法运行
- oppo 手机刷机和root,还有其他必备的刷机工具,需要请进!!!
- 如何进行在线Post接口测试?
- 三角波的傅里叶变换对_傅里叶变换推导详解
- wifi协议-802
- K8S你知道,K9S你可能也知道,那Lens呢?
- 拼音模糊搜索 php,基于 XunSearch(迅搜)SDK 的全文搜索 Laravel 5.* 软件包,支持全拼、拼音简写、模糊搜索、热门搜索、搜索提示...
- QQ浏览器怎么关闭云加速 QQ浏览器云加速关闭方法