深度学习理论基础(二)神经网络基础篇

目录

  • 一、基础知识点
    • Ⅰ 参数部分
    • Ⅱ 模型部分
  • 二、普通神经网络模型搭建
    • 1. 准备数据集
    • 2. 划分数据集
    • 3. 搭建模型
    • 4. 训练网络
    • 5. 测试网络
    • 6. 保存与导入模型

  神经网络通过学习大量样本的输入与输出特征之间的关系,以拟合出输入与输出之间的方程,学习完成后,只给它输入特征,它便会可以给出输出特征。神经网络可以分为这么几步:划分数据集、训练网络、测试网络、使用网络。
  神经网络的训练过程,就是经过很多次前向传播与反向传播的轮回,最终不断调整其内部参数(权重 ω 与偏置 b),以拟合任意复杂函数的过程。内部参数一开始是随机的(如 Xavier 初始值、He 初始值),最终会不断优化到最佳。
  神经网络:普通神经网络(NN)、卷积神经网络(CNN)。

一、基础知识点

Ⅰ 参数部分

  1. 损失函数:计算真实值和预测值差异的一类函数。我们训练的最终目的就是使得损失函数降到最低。损失函数有很多种,可用于不同的神经网络模型。

  2. 激活函数:引入非线性性,使得神经网络能够学习复杂的模式和函数。激活函数通常被应用在神经网络的每一层的输出上。选择合适的激活函数通常取决于具体的任务和数据集。神经网络各层功能函数详情查看地址。
    在这里插入图片描述
    在这里插入图片描述

  3. 学习率:训练神经网络时的一个关键超参数,它控制模型参数在每次迭代中更新的幅度。一个合适的学习率可以使模型在训练过程中快速收敛到局部最优解或全局最优解,而一个不合适的学习率可能会导致训练过程出现问题,例如收敛速度过慢、陷入局部最优解等。

Ⅱ 模型部分

  1. 前向传播:在前向传播过程中,输入数据通过神经网络的各个层,经过权重和偏置的线性组合,然后通过激活函数得到输出。前向传播的目的是计算模型的预测值(或者说输出值),然后将预测值与实际标签进行比较以计算损失函数。这一过程沿着网络的正向进行,从输入层到输出层。
  2. 反向传播 :反向传播是训练神经网络的关键步骤,它通过计算损失函数关于网络参数(权重和偏置)的梯度,来调整参数使得损失函数减小。反向传播利用链式法则从输出层向输入层计算梯度,将损失沿着网络反向传播。反向传播过程可以分为两个阶段:首先计算损失函数对网络输出的梯度,然后逐层反向传播这些梯度以计算损失函数对各层参数的梯度。计算得到的梯度可以用于更新模型参数,通常使用梯度下降等优化算法进行参数更新。这个过程很复杂,原理不必掌握。我们直接使用函数即可。
  3. 梯度下降优化器
    (1)optim.SGD: 随机梯度下降(Stochastic Gradient Descent),是最基础的优化器之一,通过梯度的方向进行参数的更新。
    (2)optim.Adam: Adam 优化器结合了动量梯度下降和 RMSProp 算法,对学习率进行自适应调整,适用于大多数深度学习任务。
    (3)optim.Adagrad: 自适应梯度算法(Adaptive Gradient Algorithm),根据参数的历史梯度调整学习率。
    (4)optim.RMSprop: RMSProp 优化器使用指数加权移动平均来调整学习率,有效地解决了 AdaGrad 学习率下降过快的问题。
    (5)optim.Adadelta: AdaDelta 优化器也是自适应学习率算法,类似于 RMSProp,但没有学习率超参数。
    (6)optim.AdamW: 在 Adam 优化器的基础上添加了权重衰减(Weight Decay)的选项,用于对权重进行正则化。
    (7)optim.LBFGS: 拟牛顿法的一种,适用于较小的数据集和参数较少的情况。
      这些优化器类提供了不同的优化算法和超参数选项,可以根据具体任务的需求选择合适的优化器来进行模型训练。
  4. batch_size: 每次训练投入模型的样本个数。
  5. epochs:全部样本训练的轮次。1 个 epoch 就是指全部样本进行 1 次前向传播与反向传播。
  6. 模型的输入:模型的输入通常需要是张量(tensor)的形式。这是因为深度学习模型是基于张量运算构建的,张量提供了一种有效的方式来表示和处理数据。在深度学习模型中使用输入数据,你通常需要将原始数据转换为张量的形式。
  7. 训练集和测试集:训练集是用来训练模型的数据集,它包含了模型需要学习的样本和对应的标签。在训练过程中,模型通过训练集中的样本进行学习,调整参数以最小化损失函数。在模型训练完成后,使用测试集来评估模型在未知数据上的泛化能力。测试集的目的是检查模型是否能够正确地推广到新的、未见过的数据上,以验证模型的性能和有效性。
  8. 训练网络和测试网络:训练网络和测试网络的区别就在于,训练网络需要回传梯度,即反向传播。而测试网络不需要回传梯度。

二、普通神经网络模型搭建

以该神经网络框架为例:
在这里插入图片描述

1. 准备数据集

  无论是任何模型,第一步都是先要准备好进行训练的数据集。为了演示,我们这里自己通过代码生成数据集。如上述模块框架,输入特征x个数为3,输出特征y个数也为3。

"""随机生成10000行1列的输入数据。使用torch.rand生成的数据已经是tensor格式了"""
	X1 = torch.rand(10000, 1)  # 输入特征 1
    X2 = torch.rand(10000, 1)  # 输入特征 2
    X3 = torch.rand(10000, 1)  # 输入特征 3
    
"""将输入特征的各行逐行相加,并与1比较。<1为1,否则为0."""    
    Y1 = ((X1 + X2 + X3) < 1).float()  # 输出特征1。
    Y2 = ((1 < (X1 + X2 + X3)) & ((X1 + X2 + X3) < 2)).float()  # 输出特征2。
    Y3 = ((X1 + X2 + X3) > 2).float()  # 输出特征3"""整合数据集,合并为10000行6列的数据列表"""    
"""axis=1,在第二个维度上合并数据,也就是列的维度上。axis=0,则在行的维度上合并,合并后为60000行1列"""
    Data = torch.cat([X1, X2, X3, Y1, Y2, Y3], axis=1) 
    

2. 划分数据集

将数据集进行划分,划分为训练集和测试集。下面代码中包含列表的切片操作,详情查看这里。

"""传入参数为:总数据集"""
def train_test_split(Data):
    train_size = int(len(Data) * 0.7)  # 训练集的样本数量
    test_size = len(Data) - train_size  # 测试集的样本数量
    
    """ Data.size(0) 为数据的行数,Data.size(1)的列数 """
    """ Data[第一个维度,第二个维度] ,' : '表示该维度全要 """
    Data = Data[ torch.randperm(Data.size(0)),  :]  # 按行进行打乱样本的顺序,第二个维度不变
    train_Data = Data[: train_size, :]  # 训练集样本
    test_Data = Data[train_size: , :]  # 测试集样本
    return train_Data,test_Data
    
train_Data,test_Data=train_test_split(Data)

在这里插入图片描述

3. 搭建模型

  搭建神经网络时,以 nn.Module 作为父类,我们自己的神经网络可直接继承父类的方法与属性,nn.Module 中包含网络各个层的定义。
  不同模型可以查看模型的框图进行搭建。

class DNN(nn.Module):
    def __init__(self):
        ''' 搭建神经网络各层 '''
        super(DNN,self).__init__()
        self.net = nn.Sequential( 			# 按顺序搭建各层,每一个隐藏层后都使用了 RuLU 激活函数
	        nn.Linear(3, 5), nn.ReLU(), 	# 第 1 层:全连接层
	        nn.Linear(5, 5), nn.ReLU(), 	# 第 2 层:全连接层
	        nn.Linear(5, 5), nn.ReLU(), 	# 第 3 层:全连接层
	        nn.Linear(5, 3)				    # 第 4 层:全连接层
    	)
    def forward(self, x):
        ''' 前向传播 '''
        y = self.net(x) # x 即输入数据
        return y # y 即输出数据
        
model = DNN().to('cuda:0')  #创建子类的实例,并搬到 GPU 上
"""model = DNN()    #在cpu上"""
print(model)                #查看该实例的各层

4. 训练网络

def train_net():
    loss_fn = nn.MSELoss() """选择损失函数"""
    learning_rate = 0.01   """设置学习率"""
    
     """定义优化器"""
    """ torch.optim.SGD 是 PyTorch 提供的 SGD 优化器类,用于实现随机梯度下降算法。"""
	"""	model.parameters() 是一个迭代器,它会返回模型中所有需要训练的参数。"""
	"""	lr=learning_rate 设置了学习率(learning rate),即 SGD 算法中用于控制参数更新步长的超参数。""" 
    optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) 
    
    """ 训练网络"""
    epochs = 1000   
    losses = []           #记录损失函数变化的列表
    
    """给训练集划分输入与输出"""
    X = train_Data[:, :3]     #前3列为输入特征
    Y = train_Data[:, -3:]    #后3列为输出特征
    
    for epoch in range(epochs):
    """前向传播写法一:"""
        Pred = model.forward(X)  # 一次前向传播(批量),获得预测值
    """前向传播写法二:这是因为torch中对模型输入时,自动调用forward方法,不需要显示调用forward方法"""
    """ Pred = model(X)  """
        
        loss = loss_fn(Pred, Y)  # 将预测值和真实值传入损失函数,计算损失。
        losses.append(loss.item())  # 记录损失函数的变化
        optimizer.zero_grad()  # 清理上一轮滞留的梯度
        loss.backward()  # 将损失进行一次反向传播
        optimizer.step()  # 优化内部参数
        
    """对loss损失进行画图"""    
    Fig = plt.figure()
    plt.plot(range(epochs), losses)
    plt.ylabel('loss'), plt.xlabel('epoch')
    plt.show()

5. 测试网络

  在测试网络时,通常不需要定义损失函数和优化器。在测试阶段,我们主要关注模型在新的、未见过的数据上的性能表现,而不是在训练集上的表现。因此,不需要对模型进行参数更新,也就不需要定义优化器。

def test_net():
    """给测试集划分输入与输出"""
    X = test_Data[:, :3]     #前3列为输入特征
    Y = test_Data[:, -3:]    #后3列为输出特征
    
    with torch.no_grad():     """该局部关闭梯度计算功能"""
        Pred = model(X)     #一次前向传播(批量),获得预测值
        
        """torch.argmax(Pred, axis=1) 返回每行中最大值的索引,然后使用这些索引来将对应位置的值设置为1,其他位置的值保持不变。"""
	    Pred[:, torch.argmax(Pred, axis=1)] = 1
	    Pred[Pred != 1] = 0
	    correct = torch.sum((Pred == Y).all(1))  # 预测正确的样本
	    total = Y.size(0)        #全部的样本数量
	    print(f'测试集精准度: {100 * correct / total} %')

6. 保存与导入模型

(1)保存模型

torch.save(model, 'model.pth')

(2)导入模型
  可将保存的模型数据导入新的网络中使用。

new_model = torch.load('model.pth')

(3)导入模型到测试网络
  模型导入后可以直接去跑测试集。因为保存的模型里面各类参数已经训练好,所以不需要再训练。

def test_net():
    """给测试集划分输入与输出"""
    X = test_Data[:, :3]     #前3列为输入特征
    Y = test_Data[:, -3:]    #后3列为输出特征
    
    with torch.no_grad():     """该局部关闭梯度计算功能"""
        Pred = new_model(X)     #一次前向传播(批量),获得预测值
        
        """torch.argmax(Pred, axis=1) 返回每行中最大值的索引,然后使用这些索引来将对应位置的值设置为1,其他位置的值保持不变。"""
	    Pred[:, torch.argmax(Pred, axis=1)] = 1
	    Pred[Pred != 1] = 0
	    correct = torch.sum((Pred == Y).all(1))  # 预测正确的样本
	    total = Y.size(0)        #全部的样本数量
	    print(f'测试集精准度: {100 * correct / total} %')

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Monkey 和 TextMonkey ---- 论文阅读

文章目录 Monkey贡献方法增强输入分辨率多级描述生成多任务训练 实验局限结论 TextMonkey贡献方法移位窗口注意&#xff08;Shifted Window Attention&#xff09;图像重采样器&#xff08;Image Resampler&#xff09;Token Resampler位置相关任务&#xff08;Position-Relate…

Collection与数据结构链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…

【AXIS】AXI-Stream FIFO设计实现(四)——异步时钟

前文介绍了几种同步时钟情况下的AXI Stream FIFO实现方式&#xff0c;一般来说&#xff0c;FIFO也需要承担异步时钟域模块间数据传输的功能&#xff0c;本文介绍异步AXIS FIFO的实现方式。 如前文所说&#xff0c;AXI-Stream FIFO十分类似于FWFT异步FIFO&#xff0c;推荐参考前…

书生浦语笔记一

2023年6月&#xff0c;InternLM的第一代大模型正式发布。仅一个月后&#xff0c;该模型以及其全套工具链被开源。随后&#xff0c;在8月份&#xff0c;多模态语料库chat7B和lagent也被开源。而在接下来的9月份&#xff0c;InternLM20B的开源发布进一步加强了全线工具链的更新。…

《剑指 Offer》专项突破版 - 面试题 98、99 和 100 : 和动态规划相关的矩阵路径问题(C++ 实现)

目录 前言 面试题 98 : 路径的数目 面试题 99 : 最小路径之和 面试题 100 : 三角形中最小路径之和 前言 矩阵路径是一类常见的可以用动态规划来解决的问题。这类问题通常输入的是一个二维的格子&#xff0c;一个机器人按照一定的规则从格子的某个位置走到另一个位置&#…

软件杯 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

Java 面试宝典:请说下你对 Netty 中Reactor 模式的理解

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站&#xff1a;https://skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 回答 Reactor 模式是一种高效处理并发网络事件的设计模式&…

SQLite3进行数据库各项常用操作

目录 前言1、SQLite介绍2、通过SQLite创建一个数据库文件3、往数据库文件中插入数据4、数据库文件信息查询5、修改数据库中的内容6、删除数据库中的内容 前言 本文是通过轻量化数据库管理工具SQLite进行的基础操作和一些功能实现。 1、SQLite介绍 SQLite是一个广泛使用的嵌入…

GEE土地分类——基于遥感影像数据的不同作物的分类

简介 这里我们首先要更改原始代码的中的影像和研究区矢量的问题,这个为了防止我们计算的过程超限,建议先将我们的研究区影像和样本点先存在自己的assets中,然后导入到新的脚本中。然周本文就是对其进行影像进行归一化处理,然后进行样本点值提取至点,然后训练样本点,进行…

系统架构体系

一、单体架构 1.浏览器&#xff0c;DNS服务器&#xff08;解析域名&#xff0c;转换为IP地址&#xff09;&#xff0c;一台计算机就相当于一个服务器&#xff08;用端口号进行区分Tomcat&#xff08;web服务&#xff09;&#xff0c;数据库服务&#xff09; 2.本次架构解决…

3D转换1111

1.三维坐标系 1.3D位移: translate3d(x,y,z)  translform:translateX(100px)&#xff1a;仅仅是在x轴上移动  translform:translateY(100px)&#xff1a;仅仅是在Y轴上移动  translform:translateZ(100px)&#xff1a;仅仅是在Z轴上移动&#xff08;注意&#xff1…

HTTP/1.1 如何优化?(计算机网络)

有三种方法&#xff1a; 第一个思路是&#xff0c;通过缓存技术来避免发送 HTTP 请求。客户端收到第一个请求的响应后&#xff0c;可以将其缓存在本地磁盘&#xff0c;下次请求的时候&#xff0c;如果缓存没过期&#xff0c;就直接读取本地缓存的响应数据。如果缓存过期&#…

Uibot6.0 (RPA财务机器人师资培训第6天 )发票验真机器人案例实战

类似于小北的这篇博客&#xff1a;Uibot (RPA设计软件&#xff09;Mage AI智能识别&#xff08;发票识别&#xff09;———课前材料五_uibot 添加mageai-CSDN博客https://blog.csdn.net/Zhiyilang/article/details/135591297?spm1001.2014.3001.5501训练网站&#xff1a;泓江…

122、内网安全——域信息收集应用网络凭据CS插件AdfindBloodHound

文章目录 理解域域信息搜集 理解域 假设有1000台计算机&#xff0c;运维人员需要为每一台计算机进行软件的安装、环境部署&#xff0c;实际上运维人员不可能亲自对每一台计算机进行软件的安装和环境部署。实际&#xff0c;将所有1000台计算机放入一个域中&#xff0c;域内有一…

简单爬虫,爬取某东某商品评论前十页

商品链接地址&#xff1a;【博世四坑5系 6x100x160】博世&#xff08;BOSCH&#xff09;四坑5系&#xff08;1支装&#xff09;圆柄两坑两槽混凝土钻头 6x100x160mm【行情 报价 价格 评测】-京东 首先抓包&#xff0c;用搜索框搜索评论&#xff0c;看评论在哪个包中 为了好看筛…

Python - 深度学习系列31 - ollama的搭建与使用

说明 做这个的主要目的是为了搭建Langchain的本地环境&#xff0c;使用LangChain让LLM具备调用自定义函数的功能。 内容 1 安装server 以下将ollama的安装方式&#xff0c;以及使用做一个简单的说明(记录&#xff09;。之前对这个工具没有了解&#xff0c;只是从快速实践的…

【python】pip清华大学镜像

1、修改pip源为清华源&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple2、结果是自动给我创建了一个文件&#xff1a; 3、打开这个文件所在的文件夹&#xff1a; 4、打开文件&#xff1a; 5、如果不想指定清华的&#xff0c;就删掉…

微信小程序引导组件【添加到我的小程序】

微信小程序引导组件&#xff0c;点击按钮&#xff0c;弹窗引导用户【添加到我的小程序】 源代码 https://ext.dcloud.net.cn/plugin?id17303

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相…

动态内存管理-错题合集讲解

空指针的解应用操作&#xff08;错误信息合集&#xff09; 越界访问 首先我们上一个代码&#xff0c;看看这个的代码的问题 这个代码的问题显而易见 &#xff0c;就是在循环里面&#xff0c;产生了越界访问的问题&#xff0c;这里你开辟了10个整形空间&#xff0c;但是从0-1…