阿里云开发者社区

电脑版
提示:原网页已由神马搜索转码, 内容由developer.aliyun.com提供.

Python实战演练之python实现神经网络模型算法

2024-01-0938
版权
版权声明:
本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
简介:Python实战演练之python实现神经网络模型算法

python实现神经网络模型算法

 

 

今天,厾罗和大家分享用Python实现神经网络模型算法,仅用于技术学习交流。

 

实现技巧

 

1.导入依赖库

主要是安装相关的依赖库。本文实现的环境为:python 3.7。

from __future__ import division    import math      import random    import pandas as pd

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神经网络预测类创建神经网络类模型。

nn = NN(4, 10, 3)

5.BP分类模型训练及预测

主要是划分训练集和测试集,并进行BP分类模型训练和预测。

training = data[1:100]                test = data[101:]                nn.train(training, iterations=1000)      nn.test(test)

完整源代码

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)

 

相关文章
|
3天前
|
数据采集存储JSON
Python网络爬虫教程概览
【6月更文挑战第21天】Python网络爬虫教程概览:安装requests和BeautifulSoup库抓取网页;使用HTTP GET请求获取HTML,解析标题;利用CSS选择器提取数据;处理异步内容可选Selenium;遵循爬虫策略,处理异常,尊重法律与网站规定。
811
|
1天前
|
机器学习/深度学习人工智能算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
2577
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
1天前
|
机器学习/深度学习人工智能算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
3177
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
2天前
|
机器学习/深度学习人工智能算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
2177
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
|
2天前
|
Java
【实战演练】JAVA网络编程高手养成记:URL与URLConnection的实战技巧,一学就会!
【6月更文挑战第22天】在Java网络编程中,理解和运用URL与URLConnection是关键。URL代表统一资源定位符,用于标识网络资源;URLConnection则用于建立与URL指定资源的连接。通过构造URL对象并调用openConnection()可创建URLConnection。示例展示了如何发送GET请求读取响应,以及如何设置POST请求以发送数据。GET将参数置于URL,POST将参数置于请求体。练习这些基本操作有助于提升网络编程技能。
|
2天前
|
机器学习/深度学习数据采集存储
神经网络案例实战
使用PyTorch解决手机价格分类问题:收集包含RAM、存储等特征的手机销售数据,将价格分为4个等级的分类任务。步骤包括数据预处理、特征工程、选择神经网络模型、训练、评估和预测。模型使用Sigmoid激活的三层网络,训练时采用交叉熵损失和SGD优化器。通过调整模型结构、优化器和学习率以优化性能。
|
3天前
|
缓存前端开发API
了解python中几个主流的网络框架
【6月更文挑战第21天】探索Python Web几个流行框架,了解各框架特性以适应不同场景需求。
2311
|
4天前
|
存储算法Python
python常用算法(5)——树,二叉树与AVL树(一)
python常用算法(5)——树,二叉树与AVL树
|
4天前
|
存储算法Shell
python常用算法(5)——树,二叉树与AVL树(三)
python常用算法(5)——树,二叉树与AVL树
1000
|
4天前
|
算法Python
python常用算法(5)——树,二叉树与AVL树(二)
python常用算法(5)——树,二叉树与AVL树

热门文章

最新文章