学习神经网络算法1(python复现)

深度神经网络中的“深度”概念解析 在深度神经网络中,“深度”通常指的是网络中从输入层到输出层所需经过的层数。一个单层的神经网络,尽管可以解决一些简单的问题,但很快就会遇到能力的限制。随着层数的增加,网络能够学习更加复杂的特征表示,从而解决更加复杂的问题。 阅读详情

学习神经网络算法(python复现)

参考

  1. 学习神经网络算法时,发现了一份很好的帖子,重复进行了相关实验:https://juejin.im/post/6844903798704455694

环境搭建

  1. 安装virtualenv,进入虚拟环境进行相应配置;
  2. 安装 jupyter matplotlib numpy scipy;
#安装virtualenv
pip3 install virtualenv
#创建虚拟环境
virtualenv env
#windows下启动虚拟环境
env\Scripts\activate
#安装依赖
pip3 install --upgrade matplotlib jupyter numpy scipy
#启动jupyter
jupyter notebook

算法实现

搭建神经网络,简单勾勒出神经网络的样子,需要3个函数:

  1. 初始化函数-设定输入层,隐含层,输出层,随机生成权重
  2. 训练,学习相关样本,调整权重
  3. 查询,根据给定的权重,获取预测结果

code

# 引入依赖库
import numpy as np
import scipy.special
import matplotlib.pyplot
# 神经网络类定义
class neuralNetwork:
    def __init__(self,inputnodes,hiddennodes,outputnodes,learningrate):
        """初始化神经网络"""
        #设置输入层,隐藏层,输出层结点的数量
        self.inodes = inputnodes
        self.hnodes = hiddennodes
        self.onodes = outputnodes
        #连接权重,随机生成输入层到隐藏层和隐藏层到输出层的权重
        # rand()生成指定维度矩阵的0-1范围的随机数,减去0.5后权重值位于-0.5-0.5之间
        self.wih = np.random.rand(self.hnodes, self.inodes) - 0.5
        self.who = np.random.rand(self.onodes,self.hnodes) - 0.5
        #学习率
        self.lr = learningrate
        #将激活函数设置为sigmoid函数
        self.activation_function = lambda x: scipy.special.expit(x)
        pass
    
    def query(self,inputs_list):
        """查询神经网络"""
        #将输入的数组转化为1个二维数组,第二个输出参数表示维度(并转置)
        inputs = np.array(inputs_list,ndmin=2).T
        
        #计算输入数据与权重的点积
        hidden_inputs = np.dot(self.wih,inputs)
        
        #经过激活函数到隐藏层数据
        hidden_outputs = self.activation_function(hidden_inputs)
        
        #计算隐藏层数据与权重的点积
        final_inputs = np.dot(self.who,hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        
        return final_outputs
    
    def train(self, inputs_list, targets_list):
        """训练神经网络"""
        #将输入数据与目标数据转换为二维数组
        inputs = np.array(inputs_list, ndmin=2).T
        targets = np.array(targets_list,ndmin=2).T
        
        #通过矩阵点积与激活函数得到隐藏层的输出
        hidden_inputs = np.dot(self.wih,inputs)
        hidden_outputs = self.activation_function(hidden_inputs)
        
        #通过矩阵点积与激活函数得到最终输出
        final_inputs = np.dot(self.who, hidden_outputs)
        final_outputs = self.activation_function(final_inputs)
        
        #获取目标值与实际值的差值
        output_errors = targets - final_outputs
        #反向传播差值
        hidden_errors = np.dot(self.who.T , output_errors)
        
        #通过梯度下降法更新隐藏层到输出层的权重
        self.who += self.lr * np.dot(
            (output_errors * final_outputs * (1.0 - final_outputs)),
            np.transpose(hidden_outputs)
        )
        #通过梯度下降法更新输入层到隐藏等的权重
        self.wih += self.lr * np.dot(
            (hidden_errors * hidden_outputs * (1.0 - hidden_outputs)),
            np.transpose(inputs)
        )      
        pass

# 进行训练
# 设置每一层的结点数量
input_nodes = 784
hidden_nodes = 100
output_nodes = 10

# 学习率
learning_rate = 0.1

# 创建神经网络模型
n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

#加载训练数据 1000个
training_data_file = open("./dataset/mnist_train_100.csv",'r')
training_data_lists = training_data_file.readlines()
training_data_file.close()

# 训练神经网络
# epochs 表示训练次数
epochs = 10
for e in range(epochs):
    # 遍历所有数据进行训练
    for record in training_data_lists:
        # 数据通过","分割,变成一个数组
        all_values = record.split(',')
        # 分离出图片的像素点到一个单独的数组
        inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
        # 创建目标输出至(0-9出现的概率,默认全部是0.01)
        targets = np.zeros(output_nodes) + 0.01
        # all_values[0] 表示手写数字的真实值,将该数字的概率设为0.99
        targets[int(all_values[0])] = 0.99
        n.train(inputs,targets)
        pass
    pass

# 训练完毕
print('done')

#加载测试数据
test_data_file = open("./dataset/mnist_test_10.csv",'r')
test_data_list = test_data_file.readlines()
test_data_file.close()

# 测试神经网络
# 记录所有训练值,正确存1,错误存0
scorecard = []

# 遍历所有数据进行测试
for record in test_data_list:
    #数据通过','分割变成1个数组
    all_values = record.split(',')
    #第一个数字为标签(正确答案)
    correct_label = int(all_values[0])
    #取出测试的数据并进行归一化处理
    inputs = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
    # 查询神经网络
    outputs = n.query(inputs)
    # 取出输出最大值作为预测输出
    label = np.argmax(outputs)
    # 打印出真实值与查询值
    print('act: ', correct_label, 'pre: ',label)
    if(label == correct_label):
        #神经网络查询结果与真实值匹配,记录数组存入1
        scorecard.append(1)
    else:
        #神经网络查询结果与真实值不匹配,记录数组存入0
        scorecard.append(0)
        pass
    pass

#计算神经网络训练成功率
scorecard_array = np.asarray(scorecard)
print("performance = ", scorecard_array.sum() / scorecard_array.size)

思考

  1. 神经网络结点反向计算得到每个点的误差后,通过梯度下降法对权重进行更新,更新的公式参考西瓜书的章节如下,梯度下降法迭代公式的实现如下图:
    在这里插入图片描述

  2. 计算神经网络隐层的反向误差时,使用权重矩阵的转置进行计算:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PZQ6P1jk-1600866827814)(C:\Users\hello\AppData\Roaming\Typora\typora-user-images\image-20200923210609024.png)]

  3. 神经网络的权值矩阵初始化至0.5~-0.5之间;

  4. 神经网络输入的数据需要进行归一化处理,处理至合适范围;

  5. 输入结点x有h个,隐层结点n个,则输入层到隐藏的权重矩阵为 n × \times × h(n行h列) , 隐藏结点n个,输出层结点k个,则隐层到输出层的权重矩阵为k × \times ×h,从误差(实际值与输出预测值之差)反向计算隐藏误差时,误差左乘权重矩阵的转置即可获得相应的结果;

训练结果

在这里插入图片描述

BP神经网络算法 原理讲解以及底层代码复现 这里写自定义目录标题新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 BP神经网络算法python 底层 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔 阅读详情

相关推荐

用Python复现经典AI算法:遗传算法、BP神经网络实战演示

本文通过Python代码实战演示了遗传算法和BP神经网络两大经典AI算法的核心原理与实现过程。文章从零开始构建遗传算法的种群、选择、交叉与变异算子,并详细剖析了BP神经网络的前向传播与误差反向传播机制,旨在帮助开发者深入理解算法本质,掌握参数调优技巧,为学习现代深度学习奠定坚实基础。

weixin_29306261的博客 565

神经网络的深度、宽度和分辨率

转载 深度和宽度是深度神经网络的两个基本维度,分辨率不仅取决于网络,也与输入图片的尺寸有关。 对于深度和宽度,以及他们对网络性能的影响,这篇博客有介绍: 深度学习网络的宽度和深度怎么理解,增加宽度和深度对网络模型有什么影响? 简单总结就是: 深度——神经网络的层数 更深的网络,有更好的非线性表达能力,可以学习更复杂的变换,从而可以拟合更加复杂的特征,更深的网络可以更简单地学习复杂特征。 网络加深会带来梯度不稳定、网络退化的问题,过深的网络会使浅层学习能力下降。深度到了一定程度,性能就不会提升了,还有可能会下

qq_42178122的博客 4432

Python实现经典机器学习算法(附代码+原理介绍)

本专栏内包含基于原生Python从零实现经典机器学习算法,通过自复现帮助新手小白对算法有更深刻的认识,理论与实践相结合,每一篇文章都附带有完整的代码+原理讲解。

优快云 精品推荐 1万+

BaselineFootstepPlanner源码复现

这里一定要source以下,不然后面的rosluanch会找不到launch文件。此方法可能由于最后没有将路径添加到环境中,暂时还无法解决该问题。其中的python路径可以换成自己的python路径。安裝BaselineFootstepPlanner。5、使用rosluanch运行程序。1、此步骤默认ros已安装好。SBPL 包会在此步骤被安装。1)安装python3依赖。3)使用python3编译。

qq_43309940的博客 290

实现Python-DFNet的TensorFlow复现教程

TensorFlow是在2015年11月9日由Google的人工智能团队宣布开源的一个项目。它最初是为了解决Google内部的大型机器学习项目而设计的,由于其强大的计算能力以及灵活的设计,迅速成为学术界和工业界研究和应用的热点。TensorFlow的历史可以追溯到Google内部的一个叫做DistBelief的系统。DistBelief使用了机器学习算法,如大规模神经网络进行深度学习研究。

weixin_42611310的博客 1067

Mac版Burp Suite专业版破解与汉化完整指南

在Web安全测试领域,Java应用程序的许可证验证机制与本地化实现是常见的技术课题。其原理通常涉及Java Agent技术,通过在JVM启动时动态修改字节码,实现对软件授权状态的校验逻辑进行拦截与重写,从而绕过官方验证。同时,软件界面的国际化(i18n)与本地化(l10n)则依赖于资源文件的替换与加载。从技术价值角度看,深入理解这些机制不仅能满足特定场景下的工具定制需求,更能加深对Java安全机制、软件保护与逆向工程的理解。在实际的工程实践中,安全研究人员与开发者常面临功能受限或语言障碍的挑战,尤其是在渗透

weixin_29327525的博客 1030

Python --函数

函数的介绍、函数的三大特性、拆包、lambda表达式

Dylan__D的博客 214

别再凭感觉估算!用ADS的EBOND库精确仿真Bonding线寄生电感(附完整参数设置指南)

本文详细介绍了在ADS中使用EBOND库精确仿真Bonding线寄生电感的方法,帮助射频工程师在毫米波频段实现高精度建模。通过三维物理参数和电磁场求解算法,EBOND模型能将误差控制在5%以内,显著提升电路性能。文章还提供了完整的参数设置指南和实战操作步骤,适用于5G毫米波前端模块等高频应用场景。

weixin_28730131的博客 504

Python数据分析五大步骤

不管是用excel还是用Python, 数据分析过程都遵循一样的套路。在学习完Python的基础知识之后,我把用Python进行数据分析过程中涉及的函数都标注了出来以方便后来回忆查看。

WANGJUNAIJIAO的博客 290

【接地系统篇】电力系统接地技术详解:从基本原理到实际应用

接地是为电流返回电源提供的一条低阻抗通道。简单来说,就是为故障电流修建一条"安全回家"的路,防止电流通过人体或其他不应带电的部件。接地系统选择原则安全性优先:TN-S系统安全性最高,适合重要场所经济性考虑:TN-C系统成本最低,适合一般工业连续性要求:IT系统供电连续性最好,适合特殊场所灵活性选择:TN-C-S系统兼顾经济与安全,应用最广。

2301_81299416的博客 2223

Labview及NI-USRP驱动安装教程

软件下载 安装使用的LabVIEW2018及NI-USRP驱动程序已上传,下载地址: 天翼云盘链接 (访问码:oc33) 百度网盘链接 (提取码:88mi) (注:天翼云盘下载不限速) LabVIEW2018安装步骤 右键软件压缩包选择解压至LabVIEW2018 选中文件,鼠标右击选择以管理员身份打开2018LV-WinChn.exe文件。 点击确定。 点击Unzip解压。 点击确定。 点击下一步。 填写任意信息后,点击下一步。 点击下一步。 点击浏览更改安装路径建议安装到除C盘以

dadapongi6的博客 2万+

赵世钰强化学习代码复现

西湖大学赵世钰老师的强化学习课程代码复现。

m0_46417154的博客 274

Xilinx DMA IP核心配置与实战解析

本文介绍了Xilinx DMA IP核在直接寄存器模式下的配置与工作流程。DMA通过AXI4-Lite接口接收指令,实现内存与数据流之间的高速传输,无需CPU介入。文章详细说明了开发环境配置、IP参数设置(包括地址位宽、数据宽度等关键参数)以及寄存器操作流程。通过仿真分析,展示了读操作中AXI4接口的突发传输机制,包括地址、长度和突发大小的配置。文中还提供了寄存器地址映射表、信号定义等关键信息,为DMA IP核的应用开发提供了实用参考。

weixin_37688766的博客 883

吴恩达机器学习作业(week1-4)

公式根据吴恩达老师的课总结的题目复制来自_cv吴彦祖数据集(ladykaka007):链接:https://pan.baidu.com/s/1L-Tbo3flzKplAof3fFdD1w 密码:oin0代码跟着b站ladykaka007敲的。

niananjy1的博客 542

深入解析ST MC SDK(WorkBench)工程结构:从零搭建FOC电机控制项目

本文深入解析了ST MC SDK(WorkBench)工程结构,详细介绍了如何从零搭建FOC电机控制项目。通过ST MC SDK和WorkBench工具链,开发者可以快速配置电机类型、控制策略等参数,生成完整的FOC控制工程。文章还拆解了工程结构中的核心控制模块、HAL硬件抽象层、芯片系统初始化和电机控制算法库,并提供了无传感器FOC实战技巧和常见问题排查指南,帮助开发者高效掌握STM32F407ZGT6开发板上的FOC电机控制技术。

weixin_29173777的博客 410

Docker 环境 Playwright MCP 部署全流程指南

Docker部署Playwright MCP全流程指南 本文详细介绍了使用Docker容器化部署Playwright MCP的完整流程,涵盖镜像拉取、容器启动、配置优化和问题排查。主要内容包括: 核心部署步骤:通过官方镜像快速搭建环境,支持自定义端口和数据持久化 关键配置要点:详解网络设置、持久化目录挂载和环境变量配置 服务验证方法:通过日志检查和服务连通性测试确保部署成功 客户端集成:提供VS Code等IDE的配置示例 常见问题解决:针对浏览器启动超时、跨域限制等问题给出解决方案 实战案例:演示自动化爬

勤奋的码农 1473

【Python实现连续学习算法】复现2024年 IEEE Trans算法LFD

本文提出的算法通过寻找较少遗忘方向(LFD)和平衡点(EP),有效地解决了类增量学习中的灾难性遗忘问题。LFD通过约束新参数的更新方向,保持旧任务的稳定性,同时为新任务留出更多的可塑性。EP则通过插值旧参数和新参数,找到一个平衡点,使得在该点上所有已学习任务的性能达到最优。属于正则化的方法。

BetterBench的博客 1114

[AI工具评测] 为什么功能全面的 Kimi Claw,最终还是被放弃?

《KimiClaw:功能整合与体验落差的AI工具实践》 KimiClaw作为集LLM、Agent、云端执行和SaaS分发于一体的AI工具,理论上具备个人开发者所需的全栈能力:原生整合大模型与Agent、支持云端Docker部署、可生成Web应用并通过飞书协作。然而实际高频使用中暴露三大核心问题:响应延迟导致思考节奏断裂(非流式输出)、云端黑箱执行缺乏可控性(无法实时干预)、系统稳定性不足(网关和隧道偶发故障)。这些体验落差表明,功能完整性不等于使用高效性——对开发者而言,实时响应、执行透明度和系统可靠性比自

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 534

遗传算法python进阶理解+论文复现(纯干货,附前人总结引路)

遗传算法进阶理解,python论文复现,多个参数寻优问题,适应度函数理解,编码解码的理解等等。

golden_knife的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Python实现机器遗忘算法】复现2023年TNNLS期刊算法UNSIR

本文提出了一种名为 UNSIR(Unlearning with Single Pass Impair and Repair)的机器遗忘框架,用于从深度神经网络中高效地卸载(遗忘)特定类别数据,同时保留模型对其他数据的性能。以下是算法的主要步骤:

BetterBench的博客 2105

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Python实现机器遗忘算法】复现2021年顶会 AAAI算法Amnesiac Unlearning

**Amnesiac Unlearning(遗忘性遗忘)** 是一种高效且精确的算法,旨在从已经训练好的神经网络模型中删除特定数据的学习信息,而不会显著影响模型在其他数据上的性能。该算法的核心思想是通过选择性撤销与敏感数据相关的参数更新来实现数据的“遗忘”。

BetterBench的博客 1403

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【Python实现连续学习算法】复现2018年ECCV经典算法RWalk

RWalk算法是一种增量学习框架,它通过结合Fisher信息矩阵和优化路径上参数重要性的累积来平衡对旧任务的记忆保持(避免灾难性遗忘)和新任务的学习能力(减少固执性)。

BetterBench的博客 994

【Python实现连续学习算法】复现2018年ECCV经典算法MAS

MAS算法通过计算每个模型参数对旧任务的贡献度来调整参数的更新。具体来说,它计算每个参数的“重要性权重”(importance weight),这个权重表示该参数对旧任务的贡献程度。在学习新任务时,MAS算法会根据这些重要性权重来调整参数的更新,使得对旧任务贡献较大的参数更新较小,从而减少对旧知识的遗忘。

BetterBench的博客 1033

基于python实现的6种机器学习常用算法介绍以及优缺点分析【附代码】

本文将会使用python语言将机器学习中常用的6种算法进行复现,代码会贴在每章后面接下来将探讨这些算法的背景、原理、优缺点及应用场景。

Henry的博客 5098

BP神经网络预测(python)

下边是基于Python的简单的BP神经网络预测,多输入单输出,也可以改成多输入多输出,下边是我的数据,蓝色部分预测红色(x,y,v为自变量,z为因变量) 话不多说,直接上代码 # -*- coding: utf-8 -*- """ """ import numpy as np import pandas as pd import matplotlib.pyplot as plt from tensorflow import metrics from sklearn import metrics imp

积极向上的mr.d的博客 8万+

【Python】全连接神经网络

全连接神经网络(Fully Connected Neural Network)是一种常见的深度学习模型,也称为密集神经网络(DNN)。在全连接神经网络中,每一层的神经元都与前一层的所有神经元相连,并通过权重和激活函数来处理输入数据,产生输出结果。反向传播算法(Backpropagation)是一种监督学习算法,常被用于训练多层神经网络。在多层神经网络中,每个神经元接收前一层的输出作为输入,并将自己的输出传递给下一层。

qq_19774249的博客 3308
上一篇: LibSVMsharp的一个多分类小demo
下一篇: Numpy中ndim、shape、dtype、astype的用法(转载)
hellohake
博客等级 码龄10年 4543粉丝 108原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值