人工智能和机器学习 3(复旦大学计算机科学与技术实践工作站)python机器学习、Pytorch库入门、d2l学习+<机器学习、神经网络————原理、理论>

news2024/12/24 3:51:25

前言

安装 — 动手学深度学习 2.0.0 documentation (d2l.ai)icon-default.png?t=N7T8https://zh.d2l.ai/chapter_installation/index.html

安装

我们需要配置一个环境来运行 Python、Jupyter Notebook、相关库以及运行本书所需的代码,以快速入门并获得动手学习经验。

安装 Miniconda

最简单的方法就是安装依赖Python 3.x的Miniconda。 如果已安装conda,则可以跳过以下步骤。访问Miniconda网站,根据Python3.x版本确定适合的版本。Miniconda — Anaconda documentationicon-default.png?t=N7T8https://docs.anaconda.com/miniconda/

友友们我们要下载安装的是Miniconda,千万不要再去下一边Anaconda哈~

如果我们使用macOS,假设Python版本是3.9(我们的测试版本),将下载名称包含字符串“MacOSX”的bash脚本,并执行以下操作:

# 以Intel处理器为例,文件名可能会更改
sh Miniconda3-py39_4.12.0-MacOSX-x86_64.sh -b

如果我们使用Linux,假设Python版本是3.9(我们的测试版本),将下载名称包含字符串“Linux”的bash脚本,并执行以下操作:

# 文件名可能会更改
sh Miniconda3-py39_4.12.0-Linux-x86_64.sh -b

接下来,初始化终端Shell,以便我们可以直接运行conda

~/miniconda3/bin/conda init

现在关闭并重新打开当前的shell。并使用下面的命令创建一个新的环境:

conda create --name d2l python=3.9 -y

现在激活 d2l 环境:

conda activate d2l

安装深度学习框架和d2l软件包

在安装深度学习框架之前,请先检查计算机上是否有可用的GPU。 例如可以查看计算机是否装有NVIDIA GPU并已安装CUDA。 如果机器没有任何GPU,没有必要担心,因为CPU在前几章完全够用。 但是,如果想流畅地学习全部章节,请提早获取GPU并且安装深度学习框架的GPU版本。

我们可以按如下方式安装PyTorch的CPU或GPU版本:

​pip install torch==1.12.0
pip install torchvision==0.13.0

我们的下一步是安装d2l包,以方便调取本书中经常使用的函数和类:

pip install d2l==0.17.6

下载 D2L Notebook

接下来,需要下载这本书的代码。 可以点击本书HTML页面顶部的“Jupyter 记事本”选项下载后解压代码,或者可以按照如下方式进行下载:

mkdir d2l-zh && cd d2l-zh
curl https://zh-v2.d2l.ai/d2l-zh-2.0.0.zip -o d2l-zh.zip
unzip d2l-zh.zip && rm d2l-zh.zip
cd pytorch

注意:如果没有安装unzip,则可以通过运行sudo apt install unzip进行安装。(

Windows 默认情况下并不包含 unzip 命令,因为它不是 Windows 操作系统的一部分。但是,你可以通过以下几种方法来解决这个问题:

1. 安装解压软件

选项 A:使用 7-Zip

7-Zip 是一个非常流行的压缩和解压缩工具,它支持多种格式,包括 ZIP。你可以从 7-Zip 官网 下载并安装它。安装后,你可以通过 7-Zip 的图形界面或命令行工具来解压 ZIP 文件。7-Zipicon-default.png?t=N7T8https://www.7-zip.org/

对于命令行,你可能需要使用 7z 命令而不是 unzip。例如:bash

7z x d2l-zh.zip

这条命令会解压 d2l-zh.zip 到当前目录。

选项 B:安装其他包含 unzip 的软件

有些第三方软件可能包含了 unzip 工具,如 Cygwin 或 MinGW。但通常 7-Zip 是最简单的选择。

2. 修改 PATH 环境变量

如果你已经安装了包含 unzip 的软件(如 Cygwin 或其他 UNIX 风格的环境),但你仍然无法在 CMD 中使用它,那么你可能需要将该软件的 bin 目录添加到你的 PATH 环境变量中。这可以通过“系统属性” -> “高级” -> “环境变量”来完成。

3. 使用 PowerShell

Windows PowerShell 支持更复杂的命令和脚本,但它默认也不包含 unzip 命令。不过,你可以使用 PowerShell 的内置功能来解压 ZIP 文件,或者通过安装扩展来添加 unzip 支持。

一个使用 PowerShell 解压 ZIP 文件的简单例子是:

Expand-Archive -Path d2l-zh.zip -DestinationPath .

这条命令会将 d2l-zh.zip 解压到当前目录。

4. 使用第三方工具

除了上述方法外,你还可以搜索是否有其他第三方工具或脚本可以帮助你在 Windows CMD 中解压 ZIP 文件。但请注意,使用未知来源的软件可能会带来安全风险。

小结

对于你的具体情况,我建议安装 7-Zip 并使用其命令行工具 7z 来解压 ZIP 文件。如果你熟悉 PowerShell,也可以使用 PowerShell 的 Expand-Archive 命令。)

安装完成后我们可以通过运行以下命令打开Jupyter笔记本(在Window系统的命令行窗口中运行以下命令前,需先将当前路径定位到刚下载的本书代码解压后的目录):

jupyter notebook

现在可以在Web浏览器中打开http://localhost:8888(通常会自动打开)。 由此,我们可以运行这本书中每个部分的代码。 在运行书籍代码、更新深度学习框架或d2l软件包之前,请始终执行conda activate d2l以激活运行时环境。 要退出环境,请运行conda deactivate

线性回归

      回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。

在机器学习领域中的大多数任务通常都与预测(prediction)有关。 当我们想预测一个数值时,就会涉及到回归问题。 常见的例子包括:预测价格(房屋、股票等)、预测住院时间(针对住院病人等)、 预测需求(零售销量等)。 但不是所有的预测都是回归问题。 在后面的章节中,我们将介绍分类问题。分类问题的目标是预测数据属于一组类别中的哪一个。

1.生成数据集

def synthetic_data(w, b, num_examples):  #@save
    """生成y=Xw+b+噪声"""
    X = torch.normal(0, 1, (num_examples, len(w)))
    y = torch.matmul(X, w) + b
    y += torch.normal(0, 0.01, y.shape)
    return X, y.reshape((-1, 1))

true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)

注意,features中的每一行都包含一个二维数据样本, labels中的每一行都包含一维标签值(一个标量)。

print('features:', features[0],'\nlabel:', labels[0])
features: tensor([1.4632, 0.5511])
label: tensor([5.2498])

通过生成第二个特征features[:, 1]labels的散点图, 可以直观观察到两者之间的线性关系。

2.读取数据集

回想一下,训练模型时要对数据集进行遍历,每次抽取一小批量样本,并使用它们来更新我们的模型。 由于这个过程是训练机器学习算法的基础,所以有必要定义一个函数, 该函数能打乱数据集中的样本并以小批量方式获取数据。

在下面的代码中,我们定义一个data_iter函数, 该函数接收批量大小、特征矩阵和标签向量作为输入,生成大小为batch_size的小批量。 每个小批量包含一组特征和标签。

def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    # 这些样本是随机读取的,没有特定的顺序
    random.shuffle(indices)
    for i in range(0, num_examples, batch_size):
        batch_indices = torch.tensor(
            indices[i: min(i + batch_size, num_examples)])
        yield features[batch_indices], labels[batch_indices]

通常,我们利用GPU并行运算的优势,处理合理大小的“小批量”。 每个样本都可以并行地进行模型计算,且每个样本损失函数的梯度也可以被并行计算。 GPU可以在处理几百个样本时,所花费的时间不比处理一个样本时多太多。

我们直观感受一下小批量运算:读取第一个小批量数据样本并打印。 每个批量的特征维度显示批量大小和输入特征数。 同样的,批量的标签形状与batch_size相等。

batch_size = 10

for X, y in data_iter(batch_size, features, labels):
    print(X, '\n', y)
    break
tensor([[ 0.3934,  2.5705],
        [ 0.5849, -0.7124],
        [ 0.1008,  0.6947],
        [-0.4493, -0.9037],
        [ 2.3104, -0.2798],
        [-0.0173, -0.2552],
        [ 0.1963, -0.5445],
        [-1.0580, -0.5180],
        [ 0.8417, -1.5547],
        [-0.6316,  0.9732]])
 tensor([[-3.7623],
        [ 7.7852],
        [ 2.0443],
        [ 6.3767],
        [ 9.7776],
        [ 5.0301],
        [ 6.4541],
        [ 3.8407],
        [11.1396],
        [-0.3836]])

当我们运行迭代时,我们会连续地获得不同的小批量,直至遍历完整个数据集。 上面实现的迭代对教学来说很好,但它的执行效率很低,可能会在实际问题上陷入麻烦。 例如,它要求我们将所有数据加载到内存中,并执行大量的随机内存访问。 在深度学习框架中实现的内置迭代器效率要高得多, 它可以处理存储在文件中的数据和数据流提供的数据。

3.初始化模型参数

在我们开始用小批量随机梯度下降优化我们的模型参数之前, 我们需要先有一些参数。 在下面的代码中,我们通过从均值为0、标准差为0.01的正态分布中采样随机数来初始化权重, 并将偏置初始化为0。

w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

在初始化参数之后,我们的任务是更新这些参数,直到这些参数足够拟合我们的数据。 每次更新都需要计算损失函数关于模型参数的梯度。 有了这个梯度,我们就可以向减小损失的方向更新每个参数。 因为手动计算梯度很枯燥而且容易出错,所以没有人会手动计算梯度。 我们使用 2.5节中引入的自动微分来计算梯度。

4.定义模型

def linreg(X, w, b):  #@save
    """线性回归模型"""
    return torch.matmul(X, w) + b

5.定义优化算法

正如我们在 3.1节中讨论的,线性回归有解析解。 尽管线性回归有解析解,但本书中的其他模型却没有。 这里我们介绍小批量随机梯度下降。

在每一步中,使用从数据集中随机抽取的一个小批量,然后根据参数计算损失的梯度。 接下来,朝着减少损失的方向更新我们的参数。 下面的函数实现小批量随机梯度下降更新。 该函数接受模型参数集合、学习速率和批量大小作为输入。每 一步更新的大小由学习速率lr决定。 因为我们计算的损失是一个批量样本的总和,所以我们用批量大小(batch_size) 来规范化步长,这样步长大小就不会取决于我们对批量大小的选择。

def sgd(params, lr, batch_size):  #@save
    """小批量随机梯度下降"""
    with torch.no_grad():
        for param in params:
            param -= lr * param.grad / batch_size
            param.grad.zero_()

6.训练

现在我们已经准备好了模型训练所有需要的要素,可以实现主要的训练过程部分了。 理解这段代码至关重要,因为从事深度学习后, 相同的训练过程几乎一遍又一遍地出现。 在每次迭代中,我们读取一小批量训练样本,并通过我们的模型来获得一组预测。 计算完损失后,我们开始反向传播,存储每个参数的梯度。 最后,我们调用优化算法sgd来更新模型参数。

概括一下,我们将执行以下循环:

在每个迭代周期(epoch)中,我们使用data_iter函数遍历整个数据集, 并将训练数据集中所有样本都使用一次(假设样本数能够被批量大小整除)。 这里的迭代周期个数num_epochs和学习率lr都是超参数,分别设为3和0.03。 设置超参数很棘手,需要通过反复试验进行调整。 我们现在忽略这些细节,以后会详细介绍。

lr = 0.03
num_epochs = 3
net = linreg
loss = squared_loss

for epoch in range(num_epochs):
    for X, y in data_iter(batch_size, features, labels):
        l = loss(net(X, w, b), y)  # X和y的小批量损失
        # 因为l形状是(batch_size,1),而不是一个标量。l中的所有元素被加到一起,
        # 并以此计算关于[w,b]的梯度
        l.sum().backward()
        sgd([w, b], lr, batch_size)  # 使用参数的梯度更新参数
    with torch.no_grad():
        train_l = loss(net(features, w, b), labels)
        print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
epoch 1, loss 0.042790
epoch 2, loss 0.000162
epoch 3, loss 0.000051

因为我们使用的是自己合成的数据集,所以我们知道真正的参数是什么。 因此,我们可以通过比较真实参数和通过训练学到的参数来评估训练的成功程度。 事实上,真实参数和通过训练学到的参数确实非常接近。

print(f'w的估计误差: {true_w - w.reshape(true_w.shape)}')
print(f'b的估计误差: {true_b - b}')
w的估计误差: tensor([-1.3804e-04,  5.7936e-05], grad_fn=<SubBackward0>)
b的估计误差: tensor([0.0006], grad_fn=<RsubBackward1>)

注意,我们不应该想当然地认为我们能够完美地求解参数。 在机器学习中,我们通常不太关心恢复真正的参数,而更关心如何高度准确预测参数。 幸运的是,即使是在复杂的优化问题上,随机梯度下降通常也能找到非常好的解。 其中一个原因是,在深度网络中存在许多参数组合能够实现高度精确的预测。

 总结

  • 我们学习了深度网络是如何实现和优化的。在这一过程中只使用张量和自动微分,不需要定义层或复杂的优化器。

  • 这一节只触及到了表面知识。在下面的部分中,我们将基于刚刚介绍的概念描述其他模型,并学习如何更简洁地实现其他模型。

补充:PPT(机器学习、神经网络————原理、理论)

...

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

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

相关文章

【css】水平对齐方式(justify、text-align、display: flex;)

一、justify 完整的属性名是 justify-contentjustify-content 用于定义位于同一行的项目在主轴&#xff08;通常是水平方向&#xff09;上的对齐方式。 center &#xff1a;居中start : 起始位置对齐&#xff08;左对齐&#xff09;end : 结束位置对齐&#xff08;右对齐&…

使用 LlamaIndex 中的 Relik 进行实体链接和关系提取

从文本构建知识图谱长期以来一直是一个令人着迷的研究领域。随着大型语言模型 (LLM) 的出现&#xff0c;该领域获得了更多主流关注。然而&#xff0c;LLM 的成本可能相当高。另一种方法是微调较小的模型&#xff0c;这种方法得到了学术研究的支持&#xff0c;可以产生更有效的解…

无线领夹麦克风哪个牌子好?最好的无线麦克风品牌排行推荐

伴随着智能手机的不断发展&#xff0c;手机不单单只是承担着联系的作用&#xff0c;凭借着小巧、出色拍摄体验等&#xff0c;成为了绝大部分朋友记录生活的绝佳选择&#xff0c;例如录制VLog、短视频等等。不过录制视频必然需要考虑到收音问题&#xff0c;因为在实际录制过程中…

Java面试八股之什么是消息队列的高并发缓冲

什么是消息队列的高并发缓冲 消息队列的高并发缓冲是指在处理大量并发请求时&#xff0c;通过消息队列来平滑处理请求的一种机制。这种机制可以帮助系统在高并发场景下保持稳定性和性能。 高并发缓冲的核心思想&#xff1a; 解耦&#xff1a; 消息队列作为一个中间层&#…

树莓派5 笔记26:ollama大型语言模型_中文输入法_Python_espeak文字转语音

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 下载大语言模型&#xff0c;下载中文输入法&#…

HTML+CSS+JS实现商城首页[web课设代码+模块说明+效果图]

系列文章目录 1.Web前端大作业htmlcss静态页面–掌****有限公司 2.Web前端大作业起点小说静态页面 3.Web前端大作业网易云页面 4.Web前端大作业商城页面 5.Web前端大作业游戏官网页面 6.Web前端大作业网上商城页面 7.HTMLCSS淘宝首页[web课设代码模块说明效果图] 8.HTMLCSSJS实…

Linux | 深入探究Linux进程控制:从fork函数到进程等待再到进程替换

目录 1、进程的创建&#xff1a;fork函数 2、父子进程的奇怪现象&#xff1a;为什么同一个地址有不同的值&#xff1f;——区分内存的虚拟地址和物理地址 代码&#xff1a;利用fork函数的返回值进行父子进程分流&#xff0c;执行不同的代码块 虚拟地址和物理地址&#xff1…

selenium学习记录

1、初识selenium 概述&#xff1a; Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;类型像我们玩游戏用的按键精灵&#xff0c;可以按指定的命令自动操作&#xff0c;不同是Selenium 可以直接运行在浏览器上&#xff0c;它支持所有…

【java】RuoYiBootstrap多模块版本-登陆请求流程解析

登陆请求流程逻辑图 Created with Raphal 2.3.0 &#xff08;1&#xff09;登陆流程解析 &#xff08;2&#xff09;【接下来所有业务都受ShiroConfig配置所过滤】 模块&#xff1a;ruoyi-framework 位置&#xff1a;src/main/java 包名&#xff1a;com.ruoyi.framework.config…

【机器学习】CNN的数学基础

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 CNN的数学基础1. 引言2. 卷积运算2.1 连续卷积2.2 离散卷积2.3 互相关 3. 激活函…

【html+css 绚丽Loading】 - 000007 虚空灵瞳

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…

一条短视频变现23万!不上班也能赚钱的路子

AI助力&#xff0c;让创意在短视频界翻涌成金。 这个项目不仅展示了AI技术在内容创作上的巨大潜力&#xff0c;更为那些希望在短视频平台上实现快速变现的创作者提供了一条可行之路。 何以破局&#xff0c;唯有行动。 我们相信每个人都有机会成为AI时代的弄潮儿。 01 项目…

SSM无人共享棋牌室的设计与实现---附源码99858

目 录 1 绪论 1.1 研究背景 1.2 研究意义 1.3国内外研究或应用现状&#xff1a; 1.4论文结构与章节安排 2 无人共享棋牌室系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析…

轻松上手!2024年图片转PDF工具操作指南

图片以其直观、生动的特点&#xff0c;成为传递信息的重要载体&#xff1b;而PDF文件则凭借其跨平台兼容性等特点在文档保存、传输及展示方面展现出巨大优势。因此&#xff0c;将图片转化为PDF格式的需求日益增长。那么&#xff0c;图片转为pdf怎么弄这次我们一起来探索。 1.F…

使用git时出现的问题总结

问题1 fatal: Unable to create ‘V:/Web/Vue3_admin/.git/index.lock’: File exists. 解决方法 删除 .git文件中的 index.lock 问题2 error: open("~$数据库表格.xlsx"): Permission denied error: unable to index file ~$数据库表格.xlsx 解决&#xff1a;要…

SpringBean的实例化,后置处理器以及生命周期

目录 一.Bean实例化的基本流程&#xff1a; Bean对象----->BeanDefinition信息对象 BeanDefintion存储到一个名为beanDefinitionMap中 对象存储在一个名为singletonObjects的Map中 Bean实例化的基本流程&#xff1a; 二.Spring的后处理器 Bean工厂后处理器- BeanFacto…

【C++题解】1137 - 纯粹素数

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1137 - 纯粹素数 类型&#xff1a;自定义函数 题目描述&#xff1a; 纯粹素数是这样定义的&#xff1a;一个素数&#xff0c;去掉最高位&#xff0c;剩下的数仍为素数&#xff0c;…

23D题分析

AM 分析方法&#xff1a;FFT&#xff0c;fc/fcfm/fc-fm调幅系数&#xff1a;ma Am/Ac&#xff0c;信号幅度 除 直流偏置调制方式&#xff1a;先给m(t)加Am直流偏置&#xff0c;再乘载波调制&#xff0c;如图&#xff1a; 公式&#xff1a; 5. 波形&#xff1a; 调幅系数&…

聚星文社和虹猫哪个好

聚星文社和虹猫是两个不同的公司&#xff0c;各有各的特点。下面是它们各自的优点&#xff1a; 聚星文社&#xff1a;Docshttps://docs.qq.com/doc/DRU1vcUZlanBKR2xy 聚星文社是一家传媒公司&#xff0c;专注于出版漫画、动画、小说等内容&#xff0c;拥有丰富的IP资源和创作…

Focal Loss 的详细解释

Focal Loss 是一种专为解决类别不平衡问题而设计的损失函数&#xff0c;最初由 Facebook AI 研究团队在 2017 年提出&#xff0c;特别用于物体检测任务&#xff08;如 RetinaNet 模型&#xff09;。在这些任务中&#xff0c;正负样本&#xff08;即目标对象和背景&#xff09;的…