神经网络实战前言

应用广泛

  • 从人脸识别到网约车,在生活中无处不在

未来可期

  • 无人驾驶技术便利出行
  • 医疗健康改善民生

产业革命

  • 第四次工业革命——人工智能

机器学习概念

  • 机器学习不等价与人工智能
  • 20世纪50年代,人工智能是说机器模仿人类行为的能力

符号人工智能

  • 基于符号,将人类的知识声明为一种计算机可以处理的形式
  • 专家系统发展于人工智能
  • 模拟人类的决策
  • 缺点是:依赖人类专家的知识,解决问题的规则和认知是被编程的

机器学习

  • 通俗讲,机器从已有的数据中学习并对其他数据做预测

机器学习的基础条件

  • 海量的数据存储能力
  • 强大的运算能力

刚开始科学家使用符号人工智能,但是发现研究进展不顺,随着计算机硬件的提升,机器学习的基础条件得到满足后,AI发展迎来春天。

机器学习算法

有监督分类

  • 标记过的训练数据
  • 学习从输入变量映射到目标变量的规则
  • 例如:降雨(目标变量),温度、时间、气压、风速等等就是输入变量

无监督分类

  • 未经标记过的训练数据
  • 学习数据中的关联规则、模式及类别
  • 常见案例是聚类分析

监督分类的案例

  • 区分两种动物,兔子和大象
  • 收集到的数据有速度和体重
  • 兔子的特征是,体重小,速度快
  • 大象的特征是,体重大,速度慢
  • 机器学习算法的任务就是,找到分割兔子和大象的区别,生成决策边界线,将海量的数据一分为二,线就是决策边界。
  • 有了决策边界,就可以对未知的数据集进行预测,判断类型
  • 不同的学习算法会对最终的结果有影响

常用的机器学习方法包括:

  • 神经网络
  • 线性回归
  • 对数概率回归
  • 支持向量机
  • 决策树

机器学习的工作流程

  1. 输入数据
    1. 多个数据源
  2. 数据预处理
    1. 数据整合
    2. 数据编码
    3. 数据换算和标准化
    4. 补充缺失数据
      1. 均值替换缺失值
      2. 基于存在数据预测缺失值
    5. 训练测试数据分割
  3. 数据分析
    1. 数据可视化
    2. 探索性数据分析
      1. 特征工程
      2. 领域知识加入机器学习
  4. 模型构建
    1. 选择学习模型
    2. 调参
    3. 训练模型
    4. 评估模型
  5. 输出结果
    1. 输出未知数据集的预测结果

神经网络

模拟人类大脑神经元

单层神经网络——感知机

核心:数学函数
过程:输入+运算+输出

为什么神经网络好?

通用函数逼近器

现实生活中的问题总能用数学函数来表征,不论函数有多复杂,神经网络都能对这个函数无限逼近(前提:理想的算力)

可扩展性好且灵活

神经网络的不同堆叠方式和排列组合可以解决各种问题,好的程序员对网络的编排更为熟悉。

神经网络的内部工作原理

  • 输入层
  • 一个或者多个的隐藏层
  • 输出层
  • 每层之间包含权重W和偏差b
  • 为每个隐藏层所选择的激活函数σ

Python中训练神经网络

import numpy as npclass NeuralNetwork:def__init__(self,x,y):self.input=xself.weights1=np.random.rand(self.input.shape[1],4)self.weights2=np.random.rand(4,1)self.y=yself.output=np.zeros(self.y.shape)
  1. import numpy as np:导入NumPy库并将其重命名为np,用于处理数组和矩阵等数学运算。

  2. class NeuralNetwork::定义了一个名为NeuralNetwork的类,用于表示神经网络。

  3. def __init__(self, x, y)::定义了类的构造函数,用于初始化神经网络的参数。

  4. self.input = x:将输入数据x保存到类的属性input中。

  5. self.weights1 = np.random.rand(self.input.shape[1], 4):随机初始化输入层到隐藏层之间的权重矩阵,矩阵大小为输入数据的特征数(x的列数)乘以隐藏层的神经元数(这里设定为4)。

  6. self.weights2 = np.random.rand(4, 1):随机初始化隐藏层到输出层之间的权重矩阵,矩阵大小为隐藏层的神经元数(4)乘以输出值。

  7. self.y = y:将输出数据y保存到类的属性y中。

  8. self.output = np.zeros(self.y.shape):初始化一个和输出数据y相同大小的零矩阵,用于保存神经网络的输出值。

两层神经网络的数学内核

\hat{y} = \sigma\left[W_2\sigma(W_1x + b_1) + b_2\right]

其中:
x 是输入向量,
W_1是第一个隐藏层的权重矩阵,b_1是第一个隐藏层的偏置向量,
\sigma是激活函数(如 Sigmoid 函数),
W_2是第二个隐藏层到输出层的权重矩阵,b_2 是输出层的偏置向量,
\hat{y}是神经网络的输出向量。

神经网络的训练包括2个步骤

  1. 前馈:计算预测输出\hat{y}

  2. 反向传播(Backward Propagation):更新权重和偏差

前馈

进行前向传播计算,假设偏差都为0

import numpy as npclass NeuralNetwork:def__init__(self,x,y):self.input=xself.weights1=np.random.rand(self.input.shape[1],4)self.weights2=np.random.rand(4,1)self.y=yself.output=np.zeros(self.y.shape)def feedforward(self):self.layer1=sigmoid(np.dot(self.input,self.weights1))self.layer2=sigmoid(np.dot(self.input,self.weights2))

1. `self.layer1 = sigmoid(np.dot(self.input, self.weights1))`:将输入数据 `self.input` 与第一层的权重矩阵 `self.weights1` 相乘,并通过 Sigmoid 激活函数进行非线性变换,得到第一层的输出 `self.layer1`。这一步表示输入数据经过第一层的处理后的输出。

2. `self.layer2 = sigmoid(np.dot(self.input, self.weights2))`:将输入数据 `self.input` 与第二层的权重矩阵 `self.weights2` 相乘,并通过 Sigmoid 激活函数进行非线性变换,得到第二层的输出 `self.layer2`。这一步表示第一层的输出经过第二层的处理后的输出。

这段代码的目的是计算神经网络的前向传播过程中各层的输出,以便后续计算损失函数和进行反向传播更新权重。值得注意的是,这里的 `sigmoid` 函数是一个自定义的激活函数,用于将神经网络的输出限制在0到1之间。

损失函数

损失函数有多种,目前以平方和误差为例

SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

平方和误差就是对实际值和预测值之间的差值求和

目标是实现训练神经网络并找到是损失函数最小化的最优权重

反向传播

计算出预测结果的误差(损失),需要找到一种方法将误差在网络中反向传导以便更新权重和偏差。

要找合适的权重和偏差矫正量,需要知道损失函数关于权重及偏差的导数

函数的导数就是函数的斜率

根据导数就可以根据导数的值增加或者减少导数值的方式来调节权重和偏差,这种方法也称为梯度下降法

使用链式法则求损失函数的导数,链式法则封装在keras等机器学习的库中

关键点:由损失函数关于权重的导数(斜率),帮助调整权重

import numpy as npdef sigmoid(x):return 1.0/(1+np.exp(-x))
def sigmoid_derivative(x):return x*(1.0-x)
class NeuralNetwork:def __init__(self,x,y):self.input=xself.weights1=np.random.rand(self.input.shape[1],4)self.weights2=np.random.rand(4,1)self.y=yself.output=np.zeros(self.y.shape)def feedforward(self):self.layer1=sigmoid(np.dot(self.input,self.weights1))self.output =sigmoid(np.dot(self.layer1,self.weights2))def backprop(self):#Find the derivative of the loss function with respect to weight2 and weight1 using the chain ruled_weights2=np.dot(self.layer1.T,(2*(self.y-self.output)*sigmoid_derivative(self.output)))d_weights1=np.dot(self.input.T,(np.dot(2*(self.y-self.output)*sigmoid_derivative(self.output),self.weights2.T)*sigmoid_derivative(self.layer1)))self.weights1 +=d_weights1self.weights2 +=d_weights2
if __name__=="__main__":X=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])y=np.array([[0],[1],[1],[0]])nn=NeuralNetwork(X,y)for i in range(1500):nn.feedforward()nn.backprop()print(nn.output)

这段代码实现了一个简单的神经网络,包括一个输入层、一个隐藏层和一个输出层。以下是每个模块的描述:

  1. import numpy as np: 导入NumPy库,用于处理数组和矩阵等数值计算。

  2. def sigmoid(x): 定义sigmoid激活函数,用于将输入值转换为0到1之间的值。

  3. def sigmoid_derivative(x): 定义sigmoid激活函数的导数,用于反向传播中计算梯度。

  4. class NeuralNetwork: 定义神经网络类,包括初始化方法__init__、前向传播方法feedforward和反向传播方法backprop

    • __init__(self, x, y): 初始化神经网络,包括输入数据x、目标输出y、第一层到第二层的权重weights1和第二层到输出层的权重weights2

    • feedforward(self): 执行神经网络的前向传播,计算输入经过权重后得到的输出。

    • backprop(self): 执行神经网络的反向传播,根据损失函数的梯度更新权重,以减小预测输出与实际输出之间的差距。

  5. if __name__=="__main__"::主程序入口,创建神经网络对象并进行训练。

    • 创建输入数据X和目标输出y

    • 创建神经网络对象nn

    • 循环执行1500次训练迭代,每次迭代包括前向传播和反向传播。

    • 打印训练后的输出结果nn.output

重要点:Sigmoid是激活函数,将函数值压缩到0~1,对于二元问题,就是将预测结果位于0~1

结果精度检验

x1x2x3Y
0010
0111
1011
1110

迭代神经网络1500次,给出了最后的预测结果,与真实值进行对照,同时给出损失迭代-次数图

if __name__=="__main__":X=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])y=np.array([[0],[1],[1],[0]])nn=NeuralNetwork(X,y)losses = []  # 用于记录每次迭代后的损失值for i in range(1500):nn.feedforward()nn.backprop()loss = np.mean(np.square(nn.y - nn.output))  # 计算均方误差损失losses.append(loss)plt.plot(range(1, 1501), losses)  # 绘制损失-迭代次数图plt.xlabel('Iterations')plt.ylabel('Loss')plt.title('Loss vs. Iterations')plt.show()

为什么要求平均,不平均代码报错?

在计算损失时,我们通常会计算所有样本的损失值的平均值。这是因为损失是所有样本预测值与真实值之间差值的函数,我们希望损失值能够反映整个数据集的预测准确程度,而不仅仅是单个样本的准确程度。因此,对所有样本的损失值取平均可以更好地衡量整个模型的性能。

预测值       实际值
0.009240
0.972571
0.972011
0.034340

由图片和图表可以看出来,前馈和反向传播算法成功训练的神经网络,且预测值收敛于真实值,且预测值与真实值有一定的误差,这个是在允许范围之内的。

最后

    for i in range(1500):nn.feedforward()nn.backprop()loss = np.mean(np.square(nn.y - nn.output))  # 计算均方误差损失losses.append(loss)

这块代码可以在类中进行分装,代码简洁,迁移性、可读性好

def train(self, epochs):for i in range(epochs):self.feedforward()self.backprop()loss = np.mean(np.square(self.y - self.output))  # 计算均方误差损失self.losses.append(loss)
if __name__=="__main__":X=np.array([[0,0,1],[0,1,1],[1,0,1],[1,1,1]])y=np.array([[0],[1],[1],[0]])nn=NeuralNetwork(X,y)nn.train(1500)  # 进行1500次训练迭代plt.plot(range(1, 1501), nn.losses)  # 绘制损失-迭代次数图plt.xlabel('Iterations')plt.ylabel('Loss')plt.title('Loss - Iterations')plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【环境配置】Linux MySQL8 忘记密码解决措施

本片博客介绍 Linux 操作系统 Ubuntu 下,MySQL8 忘记密码怎么重新设置,笔者亲测有效,分享给大家。 查看 MySQL 版本 $ mysql --version停止 MySQL 服务器,并查看状态是否变更为 Server shutdown complete # 等价命令sudo syste…

Django简易用户登入系统示例

Django简易用户登入系统示例 1)添加url和函数的对应关系(urls.py) urlpatterns [ path(login/, views.login), #login:url路径,views.login:对应的函数 ]2)添加视图函数(views.py) def login(req):if…

IDEA + Git + GitHub(保姆级教学)

文章目录 IDEA Git GitHub1.IDEA克隆远程仓库到本地仓库1.创建一个GitHub远程仓库test12.IDEA克隆仓库到本地1.复制远程仓库地址2.创建一个版本控制项目3.克隆到本地仓库4.克隆成功 2.IDEA将本地项目push到远程仓库1.在这个项目下新建一个java模块1.新建模块2.填写模块名3.在…

【CSP试题回顾】202006-1-线性分类器

CSP-202006-1-线性分类器 解题思路 线性分类问题,即根据给定的数据点和分类界限,判断是否存在一条线能够将属于不同类别的点完全分开。具体来说,数据点被分为两类,标记为A和B,我们要找出是否存在一个线性决策边界&…

gpt不能发送信息了?

文章目录 问题注意步骤解决后 问题 注意步骤 清理所有cookie和浏览数据,可保存密码 解决后

C++的类与对象(五):赋值运算符重载与日期类的实现

目录 比较两个日期对象 运算符重载 赋值运算符重载 连续赋值 日期类的实现 Date.h文件 Date.cpp文件 Test.cpp文件 const成员 取地址及const取地址操作符重载 比较两个日期对象 问题描述:内置类型可直接用运算符比较,自定义类型的对象是多个…

虚拟 DOM:前端性能优化的秘密

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【大厂AI课学习笔记NO.72】AI与云计算

AI项目依靠云计算,借助云的力量,快速的启动业务,是比较好的一种选择。 AI模型训练过程中,出现算力突增,云计算成本低。 云平台提供一站式解决方案,创业公司的选择。 云端AI和边缘端的AI,是我们…

OpenCV filter2D函数详解

OpenCV filter2D函数简介 OpenCV filter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。 该函数实际上计算相关性,而不是卷积: filter…

Day30:安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计

目录 环境搭建-NodeJS-解析安装&库安装 功能实现-NodeJS-数据库&文件&执行 安全问题-NodeJS-注入&RCE&原型链 案例分析-NodeJS-CTF题目&源码审计 开发指南-NodeJS-安全SecGuide项目 思维导图 JS知识点: 功能:登录验证&…

基于遗传算法GA的机器人栅格地图最短路径规划,可以自定义地图及起始点(提供MATLAB代码)

一、原理介绍 遗传算法是一种基于生物进化原理的优化算法,常用于求解复杂问题。在机器人栅格地图最短路径规划中,遗传算法可以用来寻找最优路径。 遗传算法的求解过程包括以下几个步骤: 1. 初始化种群:随机生成一组初始解&…

分布式执行引擎ray入门--(2)Ray Data

目录 一、overview 基础代码 核心API: 二、核心概念 2.1 加载数据 从S3上读 从本地读: 其他读取方式 读取分布式数据(spark) 从ML libraries 库中读取(不支持并行读取) 从sql中读取 2.2 变换数据…

Pandas DataFrame 写入 Excel 的三种场景及方法

一、引言 本文主要介绍如何将 pandas 的 DataFrame 数据写入 Excel 文件中,涉及三个不同的应用场景: 单个工作表写入:将单个 DataFrame 写入 Excel 表中;多个工作表写入:将多个 DataFrame 写入到同一个 Excel 表中的…

Spring boot2.7整合jetcache 本地linkedhashmap缓存方案

好 上文 Spring boot2.7整合jetcache 远程redis缓存方案 我们讲完了 远程实现方案 本文 我们来说说 本地 jetcache解决方案 首先是 application.yml 在jetcache下加上 local:default:type: linkedhashmapkeyConvertor: fastjson我们技术用的 本地缓存 linkedhashmap 这里 我们…

【大厂AI课学习笔记NO.69】使用开源管理仓库

了解了开源框架,开源项目,今天来学习开源管理仓库。 我们先说Git,开源的版本管理分布式系统。 GitHub,则是世界上最大的代码托管平台,面向开源和私有项目托管。 有的人总是分不清这两个,其实一个是版本管…

批量提取PDF指定区域内容到 Excel 以及根据PDF里面第一页的标题来批量重命名-附思路和代码实现

首先说明下,PDF需要是电子版本的,不能是图片或者无法选中的那种。 需求1:假如我有一批数量比较多的同样格式的PDF电子文档,需要把特定多个区域的数字或者文字提取出来 需求2:我有一批PDF文档,但是文件的名…

【C语言】——详解操作符(下)

【C语言】——详解操作符(下) 前言七、关系操作符八、逻辑操作符8.1、& 与运算符8.2、 | 或运算符 九、条件操作符十、逗号表达式十一、下标引用与函数调用操作符11.1、[ ] 下标引用操作符11.2、( ) 函数调用操作符 十二、 结构成员操作符12.1、…

新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码,附带系统搭建教程

支持对接第三方支付 安装方法以linux为例 1、建议在服务器上面安装宝塔面板,以便操作,高逼格技术员可以忽略这步操作。 2、把安装包文件解压到根目录,同时建立数据库,把数据文件导入数据库 3、修改核心文件config/inc_config.…

“ReferenceError: AMap is not defined“

问题 笔者进行web开发&#xff0c;引入高德地图&#xff0c;控制台报错 "ReferenceError: AMap is not defined"详细问题 vue.runtime.esm.js:4662 [Vue warn]: Error in mounted hook: "ReferenceError: AMap is not defined"found in---> <Map&…

React-嵌套路由

1.概念 说明&#xff1a;在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由&#xff0c;嵌套至一级路由内的路由又称作二级路由。 2.实现步骤 说明&#xff1a;使用childen属性配置路由嵌套关系&#xff0c;使用<Outlet/>组件配置二级路由渲染的位置。…