P1-P5_动手学深度学习-pytorch(李沐版,粗浅的笔记)

目录

说明:该文章是学习 李沐 老师在B站上分享的视频 动手学深度学习 PyTorch版而记录的笔记, 版权归李沐老师以及老师背后的团队所有 ,为了节省时间,笔记仅仅是粗浅的截图以及贴上代码,作用仅仅是复习以及忘了方便到b站上进行回看,以及方便更多的人学习。 若有侵权,请联系本人删除 。笔记难免可能出现错误或笔误,若读者发现笔记有错误,欢迎在评论里批评指正。另外 部分内容直接由镜像GPT生成,请自行注意甄别
  笔记可能更新缓慢,建议去b站观看完整视频。
  其他参考链接: Windows 下安装 CUDA 和 Pytorch 跑深度学习 - 动手学深度学习v2python数据分析神器Jupyter notebook快速入门也许是B站最好的 Markdown 科普教程Markdown的官方文档

python 复制代码
课程主页:https://courses.d2l.ai/zh-v2
教材:https://zh-v2.d2l.ai
课程论坛讨论:https://discuss.d2l.ai/c/16
Pytorch论坛:https://discuss.pytorch.org/

预告

1.学习深度学习的关键是动手

2.什么是《动手学深度学习》

3.曾经推出的版本(含github链接)

python 复制代码
含github链接:https://github.com/d2l-ai/d2l-zh


一、课程安排

1.目标

2.内容

3.上课形式

4.你将学到什么

5.资源

python 复制代码
课程主页:https://courses.d2l.ai/zh-v2
教材:https://zh-v2.d2l.ai
课程论坛讨论:https://discuss.d2l.ai/c/16
Pytorch论坛:https://discuss.pytorch.org/

二、深度学习的介绍

1.AI地图

2.深度学习在一些应用上的突破

图片分类、物体检测和分割、样式迁移、人脸合成、文字生成图片、文字生成、无人驾驶、广告点击等。

python 复制代码
http://www.image-net.org/


python 复制代码
https://github.com/matterport/Mask_RCNN
python 复制代码
https://github.com/StacyYang/MXNet-Gluon-Style-Transfer




python 复制代码
https://openai.com/blog/dall-e/



3.案例研究一广告点击


简单的机器学习包括特征提取、模型的预测。

三、安装


python 复制代码
# 1.[可选]使用conda/miniconda环境
conda env remove d2l-zh
conda create -n -y d2l-zh python=3.8 pip
conda activate d2l-zh
# 2.安装需要的包
pip install -y jupyter d2l torch torchvision
# 3.下载代码并执行
wget https://zh-v2.d2l.ai/d2l-zh.zip
unzip d2l-zh.zip
jupyter notebook

关于安装这块,初学者可能大家跟我一样看不懂云端的配置方法,故请切换到李沐老师的非云端 的环境配置方法的视频:Windows 下安装 CUDA 和 Pytorch 跑深度学习 - 动手学深度学习v2

1.Windows下的安装CUDA

首先,如下图所示,使用快捷键"Win+R"打开运行窗口,然后输入"dxdiag"并回车。然后点击"显示",查看电脑是否有NVIDIA的GPU,如果没有,本安装方法不适用。

python 复制代码
dxdiag


接下来我们去Nvidial的官网下载CUDA。可直接搜素"CUDA",点击"CUDA Toolkit 11.6 Downlo..."。然后根据自己的电脑选择合适的参数,选择本地安装,点击"Download"即可进行下载。(注意:此处版本最好安装11.8或12.1的,2023.10.5注明,此时PyTorch最新支持这两个版本。建议大家在选择版本前,先到Pytorch官网("https://pytorch.org/")看看。)

双击安装。

选择安装目录,点击"OK"。

点击"继续"。(未安装过CUDA的可能不会出现这个页面。)

接着按下面一堆图所示操作。





2.验证CUDA是否安装成功

如下图,打开命令行窗口。

然后输入命令"nvidia-smi",能查到CUDA的版本号,说明CUDA安装成功。

python 复制代码
nvidia-smi

3.下载并安装一个Python环境(安装Miniconda)

首先进入"Conda"(链接"https://docs.conda.io/en/latest/"),然后点击"Miniconda",点击"Miniconda3 Windows 64-bit"。

如下一堆图所示进行安装。






然后如下图所示查看安装的Python环境。

python 复制代码
python --version   # 查看安装的Python环境

4.到Pytorch官网下载对应的GPU版本

接着到到Pytorch官网("https://pytorch.org/")下载对应的GPU版本。发现刚刚装的CUDA(版本11.6)不是最新的,于是选择版本11.8的,版本差异最小,有点小问题。

python 复制代码
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

然后到"Anaconda Prompt"去执行刚刚复制的pip命令。

安装完后,我们尝试在GPU上运行一个简单的Python程序,验证是否有问题。结果发现程序能够正常运行,说明没有问题。(本人代码输错了好几次,请忽略)

python 复制代码
python   # 进入python
python 复制代码
import torch
a=torch.ones((3,1))
a=a.cuda(0)
b=torch.ones((3,1)).cuda(0)
a+b

5.运行一个深度学习的应用(安装jupyter和d2l;下载d2I记事本,运行测试)

打开教材官网:https://zh-v2.d2l.ai。然后下载记事本并解压。

接着退出python,再安装两个包:jupyter和d2l。

python 复制代码
quit()  # 退出python
pip install jupyter d2l  # 安装两个包:jupyter和d2l

如下图所示启动"jupyter notebook",会自动打开一个浏览器窗口。

python 复制代码
jupyter notebook  # 启动"jupyter notebook"


然后类似下面的路径,找到"resnet.ipynb"并点击。


接着,选择"Kernel",点击运行所有的选项"Restart Kernel and Run All Cells..."。点击"Restart"。

然后将页面拖到最后,发现模型已经跑了起来。打开"Anaconda Powershell Promp...",输入"nvidia-smi"查看GPU的使用率。

python 复制代码
nvidia-smi   # 查看GPU的使用率


等模型跑完后,打开教材对应的地方,对比两次的结果。

6.本次总结

四、数据操作+数据预处理

1.数据操作

(1)N维数组样例


(2)创建数组

(3)访问元素

2.数据操作实现

(1)补充:Jupyter的入门

关于Jupyter notebook的使用,大家可以随便找个视频学习一下,比如本人观看了下面的视频:python数据分析神器Jupyter notebook快速入门

需要知道(由于Jupyter的改版,部分操作有所变化):

python 复制代码
注:这些内容均来源于刚刚的链接,只是少部分由于Jupyter的改版,操作有所变化
1.特点:把代码和文本变成单元格,可逐步运行单元格或运行部分单元格。
2.优点:
-(1).学习简单,掌握十几个快捷键即可飞速入门。
-(2).Jupyter是以代码块和单元格为单位进行运行的。优点:容易查看中间变量,易调试,方便找出bug。
-(3).可插入markdown的说明性文字。
3.安装
pip install jupyter # 安装jupyter包
4.新建文件
- New-选择需要创建的文件类型或者文件夹等
5.打开方式以及创建"jupyter"文件
- 打开命令行窗口,输入命令"jupyter notebook"即可打开。(注意:如果是跟着本笔记走的,得去"Anaconda Prompt"中打开,因为是在那里面安装的jupyter包,否则不能启动jupyter)
jupyter notebook  # 启动"jupyter notebook",让浏览器使用jupyter打开当前目录
- 浏览器使用jupyter打开当前目录后,然后寻找jupyter文件。第一次使用可能没有jupyter文件,此时选择一个合适的目录,然后右击"New Notebook"创建".ipynb"的jupyter notebook文件
- 选择语言类型,点击"Select",即可成功创建文件。
6.文档编辑
- 自行学习markdown的编写方式以及听刚刚给出的链接的视频
- 分为命令模式和编辑模式
- 公式可使用LaTeX代码
7.快捷键
- 查看快捷键:Help-Show Keyboard Shortcuts。下面是将快捷键复制出来经翻译后的结果,个别是补充的:
** 命令模式 ESC
** 重新做 Ctrl + Shift + Z
** 撤销 Ctrl + Z
中断内核 I + I
重新启动内核... 0 + 0
** 切换到代码单元格类型 Y
切换到标题1 1
切换到标题2 2
切换到标题3 3
切换到标题4 4
切换到标题5 5
切换到标题6 6
** 切换到Markdown单元格类型 M
切换到原始单元格类型 R
折叠所有标题 Ctrl + Shift + ArrowLeft
** 复制单元格 C
** 剪切单元格 X
** 删除单元格 D + D
** 进入编辑模式 Enter
展开所有标题 Ctrl + Shift + ArrowRight
向上扩展选择 Shift + ArrowUp
向上扩展选择 Shift + K
向下扩展选择 Shift + ArrowDown
向下扩展选择 Shift + J
扩展选择至底部 Shift + End
扩展选择至顶部 Shift + Home
** 在上方插入单元格 A
** 在下方插入单元格 B
在当前标题上方插入标题 Shift + A
在当前标题下方插入标题 Shift + B
合并上方单元格 Ctrl + Backspace
合并下方单元格 Ctrl + Shift + M
合并选定单元格 Shift + M
下移单元格 Ctrl + Shift + ArrowDown
上移单元格 Ctrl + Shift + ArrowUp
选择下方单元格 ArrowDown
选择下方单元格 J
选择上方标题或折叠标题 ArrowLeft
选择下方标题或展开标题 ArrowRight
选择上方单元格 ArrowUp
选择上方单元格 K
粘贴至下方单元格 V
重做单元格操作 Shift + Z
** 运行选定单元格并不前进 Ctrl + Enter
运行选定单元格并在下方插入 Alt + Enter
选择所有单元格 Ctrl + A
** 显示行号 Shift + L
并排渲染 Shift + R
撤销单元格操作 Z
** 运行选定单元格并跳到下一单元格 Shift + Enter
结束搜索 Escape
查找下一个 Ctrl + G
查找上一个 Ctrl + Shift + G
查找... Ctrl + F
激活下一个标签 Ctrl + Shift + ]
激活下一个标签栏 Ctrl + Shift + .
激活上一个标签 Ctrl + Shift + [
激活上一个标签栏 Ctrl + Shift + ,
切换左侧区域 Ctrl + B
切换模式 Ctrl + Shift + D
激活命令面板 Ctrl + Shift + C
显示键盘快捷键 Ctrl + Shift + H
** 暂停 F9
** 下一步 F10
调试器面板 Ctrl + Shift + E
步入 F11
步出 Shift + F11
** 终止 Shift + F9
** 保存笔记本 Ctrl + S
另存为笔记本... Ctrl + Shift + S
激活以前使用的标签 Ctrl + Shift + '
目录 Ctrl + Shift + K
8.文件重命名
- 听刚刚给出的链接的视频或者自己摸索或者上网查
9.运行
- (1)全部运行:Run-Run All Cells。代码块前显示数字,表示未执行;显示"[*]",表示已执行。
- (2)运行代码块:快捷键Shift+Enter

其他操作请自己摸索,慢慢就熟悉了

(2)补充:Markdown的入门

参考的视频链接:也许是B站最好的 Markdown 科普教程

python 复制代码
1.定义:一种轻量级的标记语言。
2.Markdown编辑器:将Markdown文档渲染为HTML的格式,以供在Web浏览器中浏览阅读。
3.优点:沉浸、统一、可迁移
4.语法:
- (1)标题
- 一级标题:"# 一、**"
- 二级标题:"## 1.1**"
- 依次类推,一般支持6级标题
- (2)无序列表
- 格式:"- 无序列表"。效果:"▪ 无序列表"
- (3)有序列表
- 格式:"1. 有序列表",回车可以让数字有序增加,Tab键可以可以缩进列表,Shitf+Tab键取消列表缩进。
- (4)斜体
- 格式:"*斜体*"
- (5)加粗
- 格式:"**加粗**"
- (6)删除
- 格式:"~~删除~~"
- (7)高亮
- 格式:"==高亮=="
- 部分不支持的地方可使用html格式:"<mark>torch</mark>"
- (8)分割线
- 用法:"---",再回车
- (9)超链接
- 格式:"[百度](https://www.baidu.com/)",方框内是标题,括号内是链接。

其他语法请参考Markdown的官方文档,链接:https://markdown.com.cn/

Markdown的官方文档的超链接:Markdown的官方文档

(3)数据操作

请观看b站视频的同时,直接阅读教材的对应章节,链接:2.1. 数据操作

对应的jupyter文件的相对路径:"\d2l-zh\pytorch\chapter_preliminaries\index.ipynb"。

python 复制代码
# 注:为了理解其中的代码,加了点注释
import torch  # 导入torch包
# 这行代码导入了PyTorch库,它是一个用于深度学习和机器学习的开源深度学习库。
# PyTorch提供了各种工具和功能,使得构建、训练和部署神经网络变得更加容易。
# 通过导入torch,你可以在Python代码中使用PyTorch的各种模块和函数,包括张量操作、神经网络层、优化器、损失函数等。
# 这使得你能够进行深度学习任务,如图像分类、自然语言处理、回归分析等。

x=torch.arange(12) # torch.arange()是PyTorch中用于创建一个等差数列的函数,默认步长为1。
x

x.shape  # 通过张量的shape属性来访问张量的形状和张量中元素的总数
x.numel()  # 用于获取张量中元素的总数

X=x.reshape(3,4)  # 要求12=3*4,三行四列
X

torch.zeros((2,3,4))   # 全0张量
torch.ones((2,3,4))   # 全1张量
torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]])  # tensor:张量

x=torch.tensor([1.0,2,4,8])
y=torch.tensor([2,2,2,2])
x+y,x-y,x*y,x/y,x**y   # **运算符是求幂运算

torch.exp(x)

# 多个张量连结
# -创建了两个张量 X 和 Y,然后使用 torch.cat() 函数进行了张量的拼接操作
# -dim=0:行   dim=1:列
X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)

X == Y   # 通过逻辑运算符构建二元张量

X.sum()  # 元素求和

# 广播机制:形状不一样时,按行复制或按列复制整个向量,使两个形状一样,再求和
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a, b
a + b

# 元素的访问
# [-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素
X[-1], X[1:3]  # 此处结合语境为:[-1]选择最后一行元素,可以用[1:3]选择第二行和第三行元素

# 通过索引改变矩阵的元素
X[1, 2] = 9
X

# 为多个元素赋值
X[0:2, :] = 12
X

# 为新结果分配内存,注意与C语言区别
before = id(Y)  # id:标识号
Y = Y + X
id(Y) == before

# 执行原地操作   Z的id不变
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y # Z[:] 表示将 Z 的所有元素替换为运算结果
print('id(Z):', id(Z))

# 如果在后续计算中没有重复使用X, 我们也可以使用X[:] = X + Y或X += Y来减少操作的内存开销。
before = id(X)
X += Y
id(X) == before

# 转换为NumPy张量
A = X.numpy()
B = torch.tensor(A)
type(A), type(B)

# 将大小为1的张量转换为Python标量
a = torch.tensor([3.5])
a, a.item(), float(a), int(a)  

3.数据预处理

请观看b站视频的同时,直接阅读教材的对应章节,链接:2.2. 数据操作

注:CSV是"Comma-Separated Values"(逗号分隔值)的缩写,是一种常见的文本文件格式,用于存储和交换表格数据。CSV文件由纯文本组成,数据以行为单位,每行中的数据字段之间用逗号(,)或其他分隔符(如分号、制表符等)进行分隔。

python 复制代码
# os模块提供了一种与操作系统功能进行交互的方式,包括与文件系统的交互、管理目录和运行系统命令等。
import os

os.makedirs(os.path.join('..', 'data'), exist_ok=True)
# os.makedirs: 这是os模块中的一个函数,用于递归地创建目录。如果目录已经存在,它不会引发错误。
# os.path.join('..', 'data'): 这一部分使用os.path.join函数来创建一个路径字符串。在这里,它将两个字符串连接起来,形成一个相对路径,其中'..'表示上一级目录,'data'表示一个名为"data"的子目录
# exist_ok=True: 这是一个参数,如果设置为True,则表示如果目录已经存在,不会引发错误。如果目录不存在,它将创建目录。
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
    f.write('NumRooms,Alley,Price\n')  # 列名
    f.write('NA,Pave,127500\n')  # 每行表示一个数据样本
    # NA:表示未知数
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')
python 复制代码
# 如果没有安装pandas,只需取消对以下行的注释来安装pandas
# !pip install pandas
import pandas as pd
# pandas是一个强大的数据处理和分析库,特别适用于处理结构化数据,如表格数据。它提供了各种数据结构和函数,使数据的读取、转换、筛选、统计分析等操作变得非常简便。
# 常见的pandas数据结构包括DataFrame和Series,它们允许你以表格形式组织和操作数据。

data = pd.read_csv(data_file)
# 使用pd.read_csv(data_file)读取了一个CSV文件的内容,并将其存储在一个pandas的数据结构中,通常是一个DataFrame。这里的data_file是CSV文件的文件路径,你需要将其替换为实际的文件路径。
print(data)
python 复制代码
# 通过位置索引iloc,我们将data分成inputs和outputs, 其中前者为data的前两列,而后者为data的最后一列。 对于inputs中缺少的数值,我们用同一列的均值替换"NaN"项。
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
# mean()函数计算了该列中非空数值的平均值
# inputs.fillna(inputs.mean()): 这部分使用fillna()方法,将inputs中的缺失值(NaN,Not-a-Number)用对应列的平均值填充
print(inputs)
python 复制代码
inputs = pd.get_dummies(inputs, dummy_na=True)
"""
这行代码使用了pandas库中的get_dummies()函数来进行独热编码(One-Hot Encoding)处理。让我解释一下这段代码的作用:
- pd.get_dummies(inputs, dummy_na=True): 这部分代码对inputs进行了独热编码的处理。独热编码是一种用于处理分类变量的方法,它将原始的分类变量转换为二进制的形式,以便在机器学习模型中使用。
- inputs: 这是要进行独热编码的数据,通常是一个pandas的数据框(DataFrame)。
- dummy_na=True: 这个参数是可选的,如果设置为True,则会为原始数据中的缺失值(NaN)创建一个额外的列进行编码。
- 独热编码将原始的分类变量拆分成多个二进制变量,每个变量代表一个可能的分类值。这有助于避免模型将分类变量解释为连续变量,并确保模型能够正确理解和使用这些分类信息。
- 举例来说,如果原始数据包含一个"颜色"列,其中包括"红色"、"绿色"和"蓝色"这三个分类值,独热编码后会创建三个新的列,分别代表这三种颜色,每列的取值只有0和1,1表示对应的颜色。同时,如果设置了dummy_na=True,还会创建一个额外的列表示缺失值。
"""
print(inputs)
python 复制代码
# 转换为张量格式
import torch

X = torch.tensor(inputs.to_numpy(dtype=float))
y = torch.tensor(outputs.to_numpy(dtype=float))
X, y

4.数据操作QA


五、线性代数

1.线性代数

请观看b站视频的同时,直接阅读教材的对应章节,链接:2.3.线性代数

(1)标量

(2)向量

其中 α \alpha α为标量。上面的公式中 ∣ ∣ a ⋅ b ∣ ∣ = ∣ a ∣ ⋅ ∣ ∣ b ∣ ∣ ||a \cdot b||=|a| \cdot ||b|| ∣∣a⋅b∣∣=∣a∣⋅∣∣b∣∣的 a a a为标量,其他地方的 a a a为向量。

(3)矩阵


行和列相乘。

i i i行和 j j j列相乘作为结果矩阵的 i i i行 j j j列的一个元素。

(4)特殊矩阵


其中" j = π ( i ) j = \pi ( i ) j=π(i)"表示 j j j是 i i i的置换。

对于特征向量,矩阵并不会改变它的方向,如上图的绿色的向量就是一个特征向量。

2.线性代数的实现

python 复制代码
import torch

x = torch.tensor(3.0)
y = torch.tensor(2.0)

x + y, x * y, x / y, x**y
python 复制代码
x = torch.arange(4)
x
python 复制代码
x[3]
python 复制代码
len(x)
python 复制代码
x.shape
python 复制代码
A = torch.arange(20).reshape(5, 4)
A
python 复制代码
A.T
python 复制代码
B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
B
python 复制代码
B == B.T
python 复制代码
X = torch.arange(24).reshape(2, 3, 4)
X
python 复制代码
A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()  # 通过分配新内存,将A的一个副本分配给B
A, A + B
python 复制代码
A * B
python 复制代码
a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape
python 复制代码
x = torch.arange(4, dtype=torch.float32)
x, x.sum()
python 复制代码
A.shape, A.sum()
python 复制代码
A_sum_axis0 = A.sum(axis=0)
A_sum_axis0, A_sum_axis0.shape
python 复制代码
A_sum_axis1 = A.sum(axis=1)
A_sum_axis1, A_sum_axis1.shape
python 复制代码
A.sum(axis=[0, 1])  # 结果和A.sum()相同
python 复制代码
A.mean(), A.sum() / A.numel()
python 复制代码
A.mean(axis=0), A.sum(axis=0) / A.shape[0]

注:广播机制要求维度个数一样。

python 复制代码
sum_A = A.sum(axis=1, keepdims=True)
sum_A
python 复制代码
A / sum_A
python 复制代码
A.cumsum(axis=0)
python 复制代码
y = torch.ones(4, dtype = torch.float32)
x, y, torch.dot(x, y)   # torch.dot:点积
python 复制代码
torch.sum(x * y)
python 复制代码
A.shape, x.shape, torch.mv(A, x)
python 复制代码
B = torch.ones(4, 3)
torch.mm(A, B)
python 复制代码
u = torch.tensor([3.0, -4.0])
torch.norm(u)
python 复制代码
torch.abs(u).sum()
python 复制代码
torch.norm(torch.ones((4, 9)))

3.按特定轴求和




4.线性代数QA

详细内容请观看视频:05 线性代数-P4 线性代数QA

相关推荐
哦豁灬1 小时前
NCNN 学习(2)-Mat
深度学习·学习·ncnn
繁依Fanyi1 小时前
使用 Spring Boot + Redis + Vue 实现动态路由加载页面
开发语言·vue.js·pytorch·spring boot·redis·python·算法
十有久诚2 小时前
E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning
人工智能·深度学习·提示学习·视觉语言模型
王豫翔2 小时前
OpenAl o1论文:Let’s Verify Step by Step 快速解读
人工智能·深度学习·机器学习·chatgpt
crownyouyou3 小时前
第一次安装Pytorch
人工智能·pytorch·python
qq_435070783 小时前
python乱炖6——sum(),指定维度进行求和
pytorch·python·深度学习
L10732034823 小时前
深度学习笔记17_TensorFlow实现咖啡豆识别
笔记·深度学习·tensorflow
醒了就刷牙4 小时前
机器翻译与数据集_by《李沐:动手学深度学习v2》pytorch版
pytorch·深度学习·机器翻译
靡不有初1115 小时前
深度学习领域相关的专业术语(附带音标解释)
深度学习
AI第一基地5 小时前
推荐系统-电商直播 多目标排序算法探秘
人工智能·深度学习·排序算法·transformer·知识图谱·word2vec