探索云世界
Python实战演练之python实现神经网络模型算法
2024-01-0938
版权
版权声明:
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
简介:Python实战演练之python实现神经网络模型算法
python实现神经网络模型算法
今天,厾罗和大家分享用Python实现神经网络模型算法,仅用于技术学习交流。
实现技巧
1.导入依赖库
主要是安装相关的依赖库。本文实现的环境为:python 3.7。
2.构建BP神经网络类
主要是构建三层反向传播神经网络类。
""" 三层反向传播神经网络 """class NN: def __init__(self, ni, nh, no): self.ni = ni + 1 # 输入层节点 self.nh = nh + 1 # 隐藏层节点 self.no = no # 输出层种类 self.ai = [1.0] * self.ni self.ah = [1.0] * self.nh self.ao = [1.0] * self.no self.wi = self.makeMatrix(self.ni, self.nh) # 输出层到隐藏层的映射矩阵 self.wo = self.makeMatrix(self.nh, self.no) # 隐藏层到输出层的映射矩阵 for i in range(self.ni): for j in range(self.nh): self.wi[i][j] = self.rand(-0.2, 0.2) for j in range(self.nh): for k in range(self.no): self.wo[j][k] = self.rand(-2, 2) #前向传播,激活神经网络的所有节点 def update(self, inputs): if len(inputs) != self.ni - 1: print(len(inputs),self.ni - 1) raise ValueError('与输入层节点数不符!') for i in range(self.ni - 1): self.ai[i] = inputs[i] for j in range(self.nh): # self.nh表示隐藏层的节点数 sum = 0.0 # 激活项a = g(z) z = Θ^T x ;sum相当于z,每次循环归零 for i in range(self.ni): #通过循环z = Θ^T x ,因为Θ、x均为向量 sum = sum + self.ai[i] * self.wi[i][j] #〖 Z〗^((2))=Θ^((1)) a^((1)) self.ah[j] = self.sigmoid(sum) # a^((2))=g(z^((2))),这里使用sigmoid()函数作为激活函数 for k in range(self.no): sum = 0.0 for j in range(self.nh): sum = sum + self.ah[j] * self.wo[j][k] #〖 Z〗^((3))=Θ^((2)) a^((2)) self.ao[k] = self.sigmoid(sum) # a^((3))=g(z^((3))) return self.ao[:] #反向传播,计算节点激活项的误差 def backPropagate(self, targets, lr): # targets为某样本实际种类分类,lr为梯度下降算法的学习率 output_deltas = [0.0] * self.no for k in range(self.no): error = targets[k] - np.round_(self.ao[k]) output_deltas[k] = self.dsigmoid(self.ao[k]) * error # 计算隐藏层的误差 hidden_deltas = [0.0] * self.nh for j in range(self.nh): error = 0.0 for k in range(self.no): error = error + output_deltas[k] * self.wo[j][k] hidden_deltas[j] = self.dsigmoid(self.ah[j]) * error # 更新输出层权重 for j in range(self.nh): # 反向传播算法,求出每个节点的误差后,反向更新权重 for k in range(self.no): change = output_deltas[k] * self.ah[j] self.wo[j][k] = self.wo[j][k] + lr * change # 更新输入层权重 for i in range(self.ni): for j in range(self.nh): change = hidden_deltas[j] * self.ai[i] self.wi[i][j] = self.wi[i][j] + lr * change # 计算误差 error = 0.0 for k in range(self.no): error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2 return error #用测试集输出准确率 def test(self, patterns): count = 0 num=0 for p in patterns: target = p[1] result = self.update(p[0]) print(p[0], ':', target, '->', np.round_(result)) num=0 for k in range(self.no): if (target[k] == np.round_(result[k])): num +=1 print(num) if num==3: count +=1 print("******************",(target) == (np.round_(result)),"******************") accuracy = int(float(count / len(patterns))*100) print('accuracy: %-.9f' % accuracy,"%") #输出训练过后神经网络的权重矩阵 def weights(self): print('输入层权重:') for i in range(self.ni): print(self.wi[i]) print() print('输出层权重:') for j in range(self.nh): print(self.wo[j]) #用训练集训练神经网络 def train(self, patterns, iterations=1000, lr=0.1): for i in range(iterations): error = 0.0 for p in patterns: inputs = p[0] targets = p[1] self.update(inputs) error = error + self.backPropagate(targets, lr) if i % 100 == 0: print("percent:",int(i/iterations*100),"%",' error: %-.9f' % error) #生成区间[a, b)内的随机数 def rand(self, a, b): return (b - a) * random.random() + a # 生成大小 I*J 的矩阵,默认零矩阵 def makeMatrix(self, I, J, fill=0.0): m = [] for i in range(I): m.append([fill] * J) return m # 函数 sigmoid,bp神经网络前向传播的激活函数 def sigmoid(self, x): return 1.0 / (1.0 + math.exp(-x)) # 函数 sigmoid 的导数,反向传播时使用 def dsigmoid(self, x): return x * (1 - x)
3.读取数据并进行预处理
主要是读取构建分类模型的数据,并进行预处理。
data = [] raw = pd.read_csv('iris.csv') raw_data = raw.values raw_feature = raw_data[1:, 1:5] for i in range(len(raw_feature)): ele = [] ele.append(list(raw_feature[i])) if raw_data[i][5] == 0: ele.append([0, 0,1]) elif raw_data[i][5] == 1: ele.append([0,1, 0]) elif raw_data[i][5] == 2: ele.append([1, 1,1]) else: ele.append([0, 0,0]) data.append(ele)
4.利用构建的BP神经网络预测类,创建神经网络模型
主要是用BP神经网络预测类创建神经网络类模型。
5.BP分类模型训练及预测
主要是划分训练集和测试集,并进行BP分类模型训练和预测。
完整源代码
from __future__ import division import math import random import pandas as pd import numpy as np""" 三层反向传播神经网络 """class NN: def __init__(self, ni, nh, no): self.ni = ni + 1 # 输入层节点 self.nh = nh + 1 # 隐藏层节点 self.no = no # 输出层种类 self.ai = [1.0] * self.ni self.ah = [1.0] * self.nh self.ao = [1.0] * self.no self.wi = self.makeMatrix(self.ni, self.nh) # 输出层到隐藏层的映射矩阵 self.wo = self.makeMatrix(self.nh, self.no) # 隐藏层到输出层的映射矩阵 for i in range(self.ni): for j in range(self.nh): self.wi[i][j] = self.rand(-0.2, 0.2) for j in range(self.nh): for k in range(self.no): self.wo[j][k] = self.rand(-2, 2) #前向传播,激活神经网络的所有节点 def update(self, inputs): if len(inputs) != self.ni - 1: print(len(inputs),self.ni - 1) raise ValueError('与输入层节点数不符!') for i in range(self.ni - 1): self.ai[i] = inputs[i] for j in range(self.nh): # self.nh表示隐藏层的节点数 sum = 0.0 # 激活项a = g(z) z = Θ^T x ;sum相当于z,每次循环归零 for i in range(self.ni): #通过循环z = Θ^T x ,因为Θ、x均为向量 sum = sum + self.ai[i] * self.wi[i][j] #〖 Z〗^((2))=Θ^((1)) a^((1)) self.ah[j] = self.sigmoid(sum) # a^((2))=g(z^((2))),这里使用sigmoid()函数作为激活函数 for k in range(self.no): sum = 0.0 for j in range(self.nh): sum = sum + self.ah[j] * self.wo[j][k] #〖 Z〗^((3))=Θ^((2)) a^((2)) self.ao[k] = self.sigmoid(sum) # a^((3))=g(z^((3))) return self.ao[:] #反向传播,计算节点激活项的误差 def backPropagate(self, targets, lr): # targets为某样本实际种类分类,lr为梯度下降算法的学习率 output_deltas = [0.0] * self.no for k in range(self.no): error = targets[k] - np.round_(self.ao[k]) output_deltas[k] = self.dsigmoid(self.ao[k]) * error # 计算隐藏层的误差 hidden_deltas = [0.0] * self.nh for j in range(self.nh): error = 0.0 for k in range(self.no): error = error + output_deltas[k] * self.wo[j][k] hidden_deltas[j] = self.dsigmoid(self.ah[j]) * error # 更新输出层权重 for j in range(self.nh): # 反向传播算法,求出每个节点的误差后,反向更新权重 for k in range(self.no): change = output_deltas[k] * self.ah[j] self.wo[j][k] = self.wo[j][k] + lr * change # 更新输入层权重 for i in range(self.ni): for j in range(self.nh): change = hidden_deltas[j] * self.ai[i] self.wi[i][j] = self.wi[i][j] + lr * change # 计算误差 error = 0.0 for k in range(self.no): error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2 return error #用测试集输出准确率 def test(self, patterns): count = 0 num=0 for p in patterns: target = p[1] result = self.update(p[0]) print(p[0], ':', target, '->', np.round_(result)) num=0 for k in range(self.no): if (target[k] == np.round_(result[k])): num +=1 print(num) if num==3: count +=1 print("******************",(target) == (np.round_(result)),"******************") accuracy = int(float(count / len(patterns))*100) print('accuracy: %-.9f' % accuracy,"%") #输出训练过后神经网络的权重矩阵 def weights(self): print('输入层权重:') for i in range(self.ni): print(self.wi[i]) print() print('输出层权重:') for j in range(self.nh): print(self.wo[j]) #用训练集训练神经网络 def train(self, patterns, iterations=1000, lr=0.1): for i in range(iterations): error = 0.0 for p in patterns: inputs = p[0] targets = p[1] self.update(inputs) error = error + self.backPropagate(targets, lr) if i % 100 == 0: print("percent:",int(i/iterations*100),"%",' error: %-.9f' % error) #生成区间[a, b)内的随机数 def rand(self, a, b): return (b - a) * random.random() + a # 生成大小 I*J 的矩阵,默认零矩阵 def makeMatrix(self, I, J, fill=0.0): m = [] for i in range(I): m.append([fill] * J) return m # 函数 sigmoid,bp神经网络前向传播的激活函数 def sigmoid(self, x): return 1.0 / (1.0 + math.exp(-x)) # 函数 sigmoid 的导数,反向传播时使用 def dsigmoid(self, x): return x * (1 - x)if __name__ == '__main__': data = [] raw = pd.read_csv('iris.csv') raw_data = raw.values raw_feature = raw_data[1:, 1:5] for i in range(len(raw_feature)): ele = [] ele.append(list(raw_feature[i])) if raw_data[i][5] == 0: ele.append([0, 0,1]) elif raw_data[i][5] == 1: ele.append([0,1, 0]) elif raw_data[i][5] == 2: ele.append([1, 1,1]) else: ele.append([0, 0,0]) data.append(ele) nn = NN(4, 10, 3) training = data[1:100] test = data[101:] nn.train(training, iterations=1000) nn.test(test)
目录
相关文章
Python网络爬虫教程概览
【6月更文挑战第21天】Python网络爬虫教程概览:安装requests和BeautifulSoup库抓取网页;使用HTTP GET请求获取HTML,解析标题;利用CSS选择器提取数据;处理异步内容可选Selenium;遵循爬虫策略,处理异常,尊重法律与网站规定。
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
【实战演练】JAVA网络编程高手养成记:URL与URLConnection的实战技巧,一学就会!
【6月更文挑战第22天】在Java网络编程中,理解和运用URL与URLConnection是关键。URL代表统一资源定位符,用于标识网络资源;URLConnection则用于建立与URL指定资源的连接。通过构造URL对象并调用openConnection()可创建URLConnection。示例展示了如何发送GET请求读取响应,以及如何设置POST请求以发送数据。GET将参数置于URL,POST将参数置于请求体。练习这些基本操作有助于提升网络编程技能。
热门文章
最新文章
1
存储架构深度解析:直连存储(DAS)、存储区域网络(SAN)与网络附加存储(NAS)的区别
2
故障排除指南:8种常见网络交换机故障及解决方案
3
网络守护者:深入了解入侵检测系统 (Intrusion Detection Systems)
4
【专栏】交换机的电口和光口,包括它们的概念、特点、应用场景及区别。做网络的这个常识得懂!
5
【专栏】理解并优化DNS设置对于提高网络速度至关重要
6
【专栏】编写网络设备割接方案的七个步骤,包括明确割接目标、收集信息、制定计划、设计流程、风险评估、准备测试环境和编写文档。
7
【Linux】Linux网络故障排查与解决指南
8
【亮剑】指导初学者如何搭建和使用网络视频监控系统。
9
同样都是高性能计算 (HPC) 领域网络互连技术,NVLink 与 InfiniBand有啥区别?
10
深入探讨DHCP客户端协议:实现网络自动化和IP地址分配
1
Python进阶语法之推导式
18
2
Python基础语法:类笔记
26
3
[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位
24
4
Python中的面向对象
25
5
python制作七夕音乐贺卡
48
6
Python自动化测试代理程序可用性
24
7
使用Python pandas的sort_values()方法可按一个或多个列对DataFrame排序
41
8
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
77
9
Python小工具包
45
10
python图片九宫格图片处理
34