ML实践 (Paddle篇)
password
icon
AI summary
type
status
date
slug
summary
tags
category
Property
Oct 22, 2024 07:34 AM
1. 绪论
参考书有《动手学深度学习》、《Python深度学习》、《深度学习和神经网络》,基于百度Paddle框架、Pytorch
d2l全书框架如下:
解释深度学习:深度学习是机器学习的一个分支,指从有限样例中通过算法总结出一般性的规律,并可用于新的未知数据上。
神经网络可以看作从输入到输出的信息处理系统,一组参数控制的复杂函数
人工智能的许多子学科:机器感知(计算机视觉、语音信息处理)、学习(模式识别、机器学习、强化学习)、语言(自然语言处理)、记忆(知识表示)、决策(规划、数据挖掘)等。
首先学会导包
深度学习3大硬骨头:卷积神经网络,循环神经网络,对抗式神经网络
一些要了解的点:Numpy的广播机制,梯度下降对学习率敏感,神经网络中的共享参数,动量优化法,梯度消失或爆炸
- 人工智能的数学基础:可以看欧姆社学习漫画
- 理论上有可能利用chatGPT的预训练模型,在比较有限的数据集上,FineTuning(在AI领域中,Fine-tuning(微调)是指使用预训练模型作为起点,通过在特定任务上进行少量的训练来调整模型的参数,使其适应于特定任务或领域。)出一个垂直细分领域的AI应用,性能超越ChatGPT
- 一般在反向传播之前,梯度清零
- 需要学习的内容:
- 能力要求:行业知识+AI理论+实践能力
- 互联网—>正在从高科技行业变为传统行业
- 对于预测问题,可以根据预测输出的类型是连续的实数值,还是离散的标签,区分为回归任务和分类任务。
- 为什么要以均方误差作为损失函数?即将模型在每个训练样本上的预测误差加和,来衡量整体样本的准确性。这是因为损失函数的设计不仅仅要考虑“合理性”(有物理意义),同样需要考虑“易解性”(易于求解)
正是由于深度学习的建模和训练的过程存在通用性,即在构建不同的模型时,只有模型三要素不同,其它步骤基本一致,才产生了深度学习框架来加速建模。
(这里的模型三要素指的是模型的结构、参数和超参数。模型结构指的是模型的层数、每层的神经元数量、激活函数等。参数指的是每个神经元之间的权重和偏置。超参数指的是训练模型时需要设定的参数,如学习率、批量大小等。)
1.3.3 数据处理
数据处理包含五个部分:数据导入、数据形状变换、数据集划分、数据归一化处理和封装
load data
函数。数据预处理后,才能被模型调用这两行代码实现了对数据的切片操作,将训练数据(training_data)中的前n-1列(即除了最后一列)赋值给变量x,将最后一列赋值给变量y。其中":"表示选取整个范围,"-"表示倒数第n个元素。
这种切片操作常用于将数据集划分为输入特征和标签数据,以便于用于模型的训练和测试。
课节5—→目标检测7日训练营
- 使用Python + Numpy编写模型并不困难,但仍然需要编写每个处理过程,如梯度下降的实现
随机梯度下降:为了解决批量梯度下降低效的问题(每次计算都是基于数据集中的全量数据),每次从总的数据集中随机抽取出小部分数据来代表整体,基于这部分数据计算梯度和损失来更新参数。batch的取值会影响模型训练效果。batch过大,会增大内存消耗和计算时间,且训练效果并不会明显提升(因为每次参数只向梯度反方向移动一小步,所以方向没必要特别精确);batch过小,每个batch的样本数据将没有统计意义,计算的梯度方向可能偏差较大。案例:房价预测模型的训练数据集较小,我们将batch为设置10。
核心概念:mini-batch:每次迭代时抽取出来的一批数据被称为一个mini-batch。
batch_size:一个mini-batch所包含的样本数目称为batch_size。
epoch:当程序迭代的时候,按mini-batch逐渐抽取出样本,当把整个数据集都遍历到了的时候,则完成了一轮训练,也叫一个epoch。启动训练时,可以将训练的轮数num_epochs和batch_size作为参数传入。
【深度学习】基于计算图的反向传播详解(95条消息) 【深度学习】基于计算图的反向传播详解_计算图的反向传播是基于链式法则的数学原理_Day-yong的博客-CSDN博客
在探讨手写数字识别任务的实现方案之前,我们先“偷偷地看”一下程序代码。不难发现,与上一章学习的房价预测任务的代码比较,二者的程序结构是极为相似的,如图所示。
- 从代码结构上看,模型均为数据处理、定义网络结构和训练过程三个部分。
- 从代码细节来看,两个模型也很相似。
这就是使用飞桨框架搭建深度学习模型的优势,只要完成一个模型的案例学习,其它任务即可触类旁通。在工业实践中,程序员用飞桨框架搭建模型,无需每次都另起炉灶,多数情况是先在飞桨模型库中寻找与目标任务类似的模型,再在该模型的基础上修改少量代码即可完成新的任务。
这类程序一般都是如下套路
- 数据处理:读取数据和预处理操作
- 模型设计:网络结构(假设)
- 训练配置:优化器(寻解算法)和计算资源配置
- 训练过程:循环调用训练过程,前向计算+损失函数(优化目标)+反向传播
- 保存模型:保存训练好的模型
- 训练集:用于确定模型参数
- 验证集:用于调节模型超参数(如多个网络结构、正则化权重的最优选择)
- 测试集:用于估计模型应用效果(没有在模型中应用过的数据,更贴近模型在真实场景应用的效果)
通常某组织发布一个新任务的训练集和测试集数据后,全世界的科学家都针对该数据集进行创新研究,随后大量针对该数据集的论文会陆续发表。论文1的A模型声称在测试集的准确率70%,论文2的B模型声称在测试集的准确率提高到72%,论文𝑁的𝑥模型声称在测试集的准确率提高到90% ...
然而这些论文中的模型在测试集上准确率提升真实有效么?我们不妨大胆猜测一下。假设所有论文共产生1000个模型,这些模型使用的是测试数据集来评判模型效果,并最终选出效果最优的模型。这相当于把原始的测试集当作了验证集,使得测试集失去了真实评判模型效果的能力,正如机器学习领域非常流行的一句话:“拷问数据足够久,它终究会招供”。
卷积算子应用举例
案例1—简单的黑白边界检测
案例2 图像中物体边缘检测
案例3—图像均值模糊
池化
激活函数
批归一化
作业1:计算卷积中一共有多少次乘法和加法操作
首先,我们需要理解卷积操作的基本概念。在卷积神经网络中,卷积操作是通过在输入数据上滑动一个卷积核(或滤波器),并在每个位置进行元素级的乘法和加法操作来计算输出的。
给定的参数是:
- 输入数据的形状是 [10, 3, 224, 224],其中10是批量大小,3是输入通道数,224是高度和宽度。
- 卷积核的大小是 3x3,输出通道数为64。
- 步幅(stride)是1,填充(padding)是1。
对于每个输出通道,我们需要在每个位置进行3x3x3=27次乘法和26次加法(因为3x3x3个元素需要2x3x3次加法来求和)。由于步幅是1,填充是1,所以输出的高度和宽度都是224,因此每个输出通道有224x224个位置。所以,对于每个输出通道,我们需要进行27x224x224次乘法和26x224x224次加法。
由于输出通道数为64,所以总共需要进行64x27x224x224次乘法和64x26x224x224次加法。
因此,完成这样一个卷积,一共需要做:
- 乘法操作次数:64 * 27 * 224 * 224 = 173408256次
- 加法操作次数:64 * 26 * 224 * 224 = 1605638144次
这只是理论上的计算次数,实际上由于现代计算机硬件和软件的优化,实际的计算次数可能会少一些。
作业2:
网络结构定义如下面的代码所示,输入数据形状是[10,3,224,224],
请分别计算每一层的输出数据形状,以及各层包含的参数形状
上一篇
Python语法
下一篇
Datawhale AI 夏令营 CV 赛事实践(二)CNN原理与进阶技巧以及冲分思路(长期赛第4)
Loading...