动手学深度学习v2_系列笔记1

本文介绍了深度学习在NLP、AIoT等领域的应用,强调了深度学习中的过拟合和欠拟合问题,提供了解决这两种情况的策略。此外,还探讨了张量操作、数据预处理的基本概念,包括形状变换、缺失值处理,以及线性代数的基础知识,如向量和矩阵的运算。
摘要由CSDN通过智能技术生成

Task01:初识深度学习(3月19日)

1.1 深度学习应用场景

  • NLP:计算机能够解读、处理和理解人类语言,分为认知、理解、生成等部分。如机器翻译、信息提取、语言生成、文本分类、情感分析、智能问答等。
  • AIoT:通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端,再通过大数据分析,以及更高形式的人工智能,实现万物数据化、万物智联化。
  • 时间序列分析&异常检测(AIOps)
  • 语音识别:将人类的语音中的词汇内容转换为计算机可读的输入,例如二进制编码或字符序列。
  • AI4Science:蛋白质预测等
  • ReinforceLearning:如何基于环境而行动,以取得最大化的预期利益,是第三种基本的机器学习方法。游戏、控制、智慧交通、推荐系统等。
  • ChatGPT:
  • 交叉方向(AI+)

1.2 深度学习中的小技巧

待补充

1.3 深度学习中的易错点Top5

  • 错误的张量形状:例如错误地计算了每一层的输出
  • 对输入/标签的预处理不正确:例如忘记归一/标准化,或进行过多的预处理
  • 对损失函数的定义不正确:例如Softmax的多分类输出,使用对数损失函数
  • 忘记正确设置网络的训练模式:例如切换训练/评估部分
  • 数值问题(即inf/Nan):通常源于使用exp、log或div操作

1.4 过拟合overfitting & 欠拟合underfitting

过拟合 & 欠拟合

1.5 解决欠拟合(减少偏差)的方法:

欠拟合指模型在训练集、验证集和测试集上均表现不佳。

  • 增加模型复杂度(例如增加层数;每层有更多的filters)
  • 增加特征数量,使输入数据具有更强的表达能力
  • 减少正则化(例如dropout或L1、L2正则化)
  • 错误分析(即了解出问题的根因)
  • 选择不同的(最先进的)模型结构(例如从VGG16转为Resnet)
  • 调整超参数(例如学习率)

1.6 解决过拟合(减少方差)的方法:

过拟合指模型在训练集上表现好,但验证集和测试集表现差,即模型的泛化能力差。

  • 添加更多的训练数据
  • 添加规范化(例如Batch Norm,Layer Norm)
  • 使用数据增强
  • 使用正则化约束(例如dropout,L2正则)
  • 错误分析
  • 选择不同的(最先进的)模型架构
  • 调整超参数(例如学习率)
  • Early stop 提前结束训练
  • 删除部分特征
  • 降低模型复杂度
  • 使用bagging策略
  • 交叉验证
    环境配置见PPT,待自行补充

Task02:预备知识(3月20日-21日)

2.1 数据操作

N维数组是机器学习和神经网络的主要数据结构。N维数组示例:

  • 0-d(标量):1.0 一个类别
  • 1-d(向量):[1.0, 2.7, 3.4] 一个特征向量
  • 2-d(矩阵):[[1.0, 2.7, 3.4] [5.0, 0.2, 4.6] [4.3, 8.5, 0.2]] 一个样本-特征矩阵
  • 3-d:RGB图片(宽 * 高 * 通道)
  • 4-d:一个RGB图片批量(批量大小 * 宽 * 高 * 通道)
  • 5-d:一个视频批量(批量大小 * 时间 * 宽 * 高 * 通道)
    创建数组需要:
  • 形状:例如3 * 4矩阵;
  • 每个元素的数据类型:例如32位浮点数;
  • 每个元素的值,例如全是0,或者随机数。
    访问元素:
  • 一个元素:[1, 2]
  • 一行:[1, :]
  • 一列:[:, 1]
  • 子区域:[1:3, 1:]
  • 子区域:[::3, ::2]
import torch  # 导入torch

x = torch.arange(12)  # 张量表示一个数值组成的数组,这个数组可能有多个维度
x.shape  # 访问张量的形状
x.numel()  # 访问张量中元素的总数
X = x.reshape(3, 4)  # 改变一个张量的形状而不改变元素数量和元素值
torch.zeros((2, 3, 4))  # 使用全0、全1、其他常量或者从特定分布中随机采样的数字
torch.ones((2, 3, 4))
# 通过提供包含数值的Python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值
torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

# 常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算。
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 = 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()    # 对张量中的所有元素进行求和会产生一个只有一个元素的张量

# 即使shape不一致,仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作
a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))
a + b

X[-1], X[1:3]  # 可以用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素
X[1, 2] = 9  # 可以通过指定索引来将元素写入矩阵
X[0:2, :] = 12  # 为多个元素赋值相同的值,只需要索引所有元素,然后为它们赋值

# 运行一些操作可能会导致为新结果分配内存
before = id(Y)
Y = Y + X
id(Y) == before  # False

# 执行原地操作
Z = torch.zeros_like(Y)
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))   # 前后一致
# 如果后续计算中,没有重复使用X,也可以使用X[:] = X + Y 或 X += Y 来减少操作的内存开销
before = id(X)
X += Y
id(X) == before  # True

# 转换为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)

2.2 数据预处理

  • 创建一个人工数据集,并存储在csv(逗号分隔值)文件。
import os

os.makedirs(os.path.join('..', 'data'), exist_ok=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')  # 每行表示一个数据样本
    f.write('2, NA, 106000\n')
    f.write('4, NA, 178100\n')
    f.write('NA, NA, 140000\n')
  • 从创建的csv文件中加载原始数据集
import pandas as pd

data = pd.read_csv(data_file)
print(data)
  • 为了处理缺失的数据,典型的方法包括插值和删除
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
  • 对于inputs中的类别值或离散值,将“NaN"视为一个类别
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
  • 将inputs和outputs转换为张量格式
import torch
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)

2.3 线性代数

  • 标量
    • 简单操作:
      c = a + b c = a ⋅ b c = sin ⁡ a \begin{aligned} c &= a + b\\c &= a · b\\c &= \sin{a} \end{aligned} ccc=a+b=ab=sina
    • 长度:
      ∣ a + b ∣ ≤ ∣ a ∣ + ∣ b ∣ ∣ a ⋅ b ∣ = ∣ a ∣ ⋅ ∣ b ∣ ∣ a ∣ = { a if a > 0 − a otherwise \begin{aligned}&|a + b| \leq |a| + |b|\\&|a · b| = |a| · |b|\\&|a| = \begin{cases}a\quad\quad \text {if a > 0}\\-a\quad \text{otherwise}\end{cases}\end{aligned} a+ba+bab=aba={aif a > 0aotherwise
  • 向量
    • 简单操作:
      c = a + b where  c i = a i + b i c = α ⋅ b where  c i = α b i c = sin ⁡ a where  c i = sin ⁡ a i \begin{aligned}&c = a + b\quad\text{where } c_i = a_i + b_i\\&c = \alpha · b\quad\text{where } c_i = {\alpha}b_i\\&c = \sin{a}\quad\text{where } c_i = \sin{a_i}\end{aligned} c=a+bwhere ci=ai+bic=αbwhere ci=αbic=sinawhere ci=sinai
    • 长度:
      ∣ ∣ a ∣ ∣ 2 = ( ∑ i = 1 m a i 2 ) 1 / 2 ||a||_2=(\sum_{i=1}^m{a_i^2})^{1/2} ∣∣a2=(i=1mai2)1/2
      ∣ ∣ a ∣ ∣ ≥ 0 for all a ||a||\geq0\quad \text {for all a} ∣∣a∣∣0for all a
      ∣ ∣ a + b ∣ ∣ ≤ ∣ ∣ a ∣ ∣ + ∣ ∣ b ∣ ∣ ||a+b||\leq||a|| + ||b|| ∣∣a+b∣∣∣∣a∣∣+∣∣b∣∣
      ∣ ∣ a ⋅ b ∣ ∣ = ∣ ∣ a ∣ ∣ ⋅ ∣ ∣ b ∣ ∣ ||a·b||=||a||·||b|| ∣∣ab∣∣=∣∣a∣∣∣∣b∣∣
    • 点乘:
      a T b = ∑ i a i b i a^Tb=\sum_i{a_ib_i} aTb=iaibi
    • 正交:
      a T b = ∑ i a i b i = 0 a^Tb=\sum_i{a_ib_i}=0 aTb=iaibi=0
  • 矩阵
    简单操作:
    C = A + B where  C i j = A i j + B i j C=A+B\quad \text{where } C_{ij}=A_{ij}+B_{ij} C=A+Bwhere Cij=Aij+Bij
    C = α ⋅ B where  C i j = α B i j C=\alpha·B\quad \text{where } C_{ij}=\alpha B_{ij} C=αBwhere Cij=αBij
    C = sin ⁡ A where  C i j = sin ⁡ A i j C=\sin A\quad \text{where }C_{ij}=\sin A_{ij} C=sinAwhere Cij=sinAij
    乘法(矩阵乘以向量):空间扭曲
    c = A b where  c i = ∑ j A i j b j c=Ab\quad \text {where } c_i=\sum_j{A_{ij}b_j} c=Abwhere ci=jAijbj
    乘法(矩阵乘以矩阵):
    c = A B where  c i k = ∑ j A i j B j k c=AB\quad \text {where } c_{ik}=\sum_j{A_{ij}B_{jk}} c=ABwhere cik=jAijBjk
    范数:
    c = A ⋅ b h e n c e ∣ ∣ c ∣ ∣ ≤ ∣ ∣ A ∣ ∣ ⋅ ∣ ∣ b ∣ ∣ c = A·b\quad hence\quad ||c||\leq||A||·||b|| c=Abhence∣∣c∣∣∣∣A∣∣∣∣b∣∣ 取决于如何衡量b和c的长度
    常见范数:矩阵范数:最小的满足的上面公式的值;Frobenius范数: ∣ ∣ A ∣ ∣ F r o b = [ ∑ i j A i j 2 ] 1 / 2 ||A||_{Frob}=[\sum_{ij}A_{ij}^2]^{1/2} ∣∣AFrob=[ijAij2]1/2
    • 特殊矩阵:对称和反对称 A i j = A j i a n d A i j = − A j i A_{ij}=A_{ji}\quad and \quad A_{ij}=-A_{ji} Aij=AjiandAij=Aji
    • 特殊矩阵:正定矩阵 ∣ ∣ x ∣ ∣ 2 = x T x ≥ 0 g e n e r a l i z e s t o x T A x ≥ 0 ||x||^2=x^Tx\geq0\quad generalizes\quad to\quad x^TAx\geq0 ∣∣x2=xTx0generalizestoxTAx0
    • 特殊矩阵:正交矩阵 所有行都互相正交;所有行都有单位长度 U w i t h ∑ j U i j U k j = δ i k U\quad with\quad \sum_j{U_{ij}U_{kj}=\delta_{ik}} UwithjUijUkj=δik;可以写成 U U T = 1 UU^T=1 UUT=1
    • 特殊矩阵:置换矩阵 P w h e r e P i j = 1 i f a n d o n l y i f j = π ( i ) P\quad where\quad P_{ij}=1\quad if\quad and\quad only\quad if\quad j=\pi(i) PwherePij=1ifandonlyifj=π(i) 置换矩阵是正交矩阵
      特征向量和特征值:
    • 不被矩阵改变方向的向量: A x = λ x Ax=\lambda x Ax=λx
    • 对称矩阵总是可以找到特征向量
import torch 

x = torch.tensor([3.0])  # 标量由只有一个元素的张量表示
y = torch.tensor([2.0])

x + y, x * y, x / y, x ** y

x = torch.arange(4)  # 可将向量视为标量值组成的列表 tensor([0, 1, 2, 3])
x[3]  # 通过张量的索引来访问任一元素  tensor(3)
len(x)  # 访问张量的长度 4
x.shape  # 只有一个轴的张量,形状只有一个元素 torch.Size([4])

A = torch.arange(20).reshape(5, 4)  #通过指定两个分量m和n来创建一个形状为m*n的矩阵
A.T  # 矩阵的转置

B = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])  # symmetric matrix
B == B.T

X = torch.arange(24).reshape(2, 3, 4)  # 可以构建具有更多轴的数据结构

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)
B = A.clone()
A, A + B
A * B  # 两个矩阵的按元素乘法称为 哈达玛积(Hadamard product
a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape
X, X.sum(), X.sum(axis=0), X.sum(axis=1), X.sum(axis=[0, 1])
X.mean(), X.sum() / X.numel()
X.mean(axis=0), X.sum(axis=0) / X.shape[0]
sum_X = X.sum(axis=1, keepdims=True)
X / sum_X   # 通过广播将X 除以 sum_X
X.cumsum(axis=0)  # 某个轴计算X元素的累积和

y = torch.ones(4, dtype=torch.float32)
x, y, torch.dot(x, y)  # 点积
torch.sum(x * y)

A.shape, x.shape, torch.mv(A, x)  # 矩阵向量积Ax是一个长度为m的列向量
B = torch.ones(4, 3)
torch.mm(A, B)

# L2范数是向量元素平方和的平方根
u = torch.tensor([3.0, -4.0])
torch.norm(u)
# L1范数是向量元素的绝对值之和
torch.abs(u).sum()
# 矩阵的弗罗贝尼乌斯范数(Frobenius norm)是矩阵元素的平方和的平方根
torch.norm(torch.ones((4, 9)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 动手深度学习v2是一本非常好的深度学习教材,是从谷歌机器学习研究员李沐所主持的Gluon团队创作的。它提供了丰富的案例和实际应用,深入浅出地介绍了深度学习的基础理论和实践技能。 下载动手深度学习v2非常简单,可以通过访问官方网站来获取。首先,打开谷歌或百度搜索引擎,搜索"动手深度学习v2下载",就可以找到相关的下载链接。建议选择官网下载,因为官网下载最为安全可靠。 进入官网后,点击首页上的"下载"按钮,然后在目录下找到本书的下载链接,下载适合你的版本即可。此外,动手深度学习v2还有在线阅读的版本,方便习者随时随地习。 总的来说,动手深度学习v2是一本非常优秀的深度学习教材,相关下载链接也十分便捷,能够帮助广大习者更好地掌握深度学习相关的知识和技能。 ### 回答2: 动手深度学习v2是一本非常优秀的深度学习入门书籍,笔者十分推荐。如果您想要下载该书籍,可以使用以下方法: 1.进入动手深度学习v2的官网(https://zh.d2l.ai/),点击右上角的“Github”按钮,进入书籍的Github仓库。 2.在仓库中找到“releases”目录,选择最新的版本号,点击进入。 3.在该版本的页面中,找到“Source code (zip)”或“Source code (tar.gz)”选项,点击下载压缩包。 4.下载完成后,解压缩文件即可得到电子书的文件夹,其中包括PDF和HTML格式的书籍。 除此之外,您也可以在该官网中找到由中文社区翻译的在线电子书版本。在该电子书中,您可以直接在线阅读和习。值得注意的是,该书籍的在线翻译版本可能会比英文原版稍有滞后。如果您想要阅读最新的内容,请下载英文原版或者在该官网上查看最新的更新。 ### 回答3: 深度学习是现在的热门话题之一。而动手深度学习v2是一本非常好的深度学习教材,旨在为做实际项目的习者提供知识技能和实战经验。为了下载此书,您需要按照以下步骤进行。 首先,您需要访问动手深度学习官方网站,网址为d2l.ai。然后,您需要找到下载页面,这个页面可以通过页面上的“全书下载”按钮或主页面上的一个标签来访问。 在下载页面,您需要选择您所需要的版本,v2版本是最新版本。接着,您需要选择您所需的格式。您可以选择PDF格式或HTML格式,下方还提供了在线阅读链接。 若您选择了PDF格式,则需要点击下载链接,页面会跳到GitHub仓库中。在GitHub页面,您需要选择ZIP文件并下载。下载完成后,您就可以在本地解压并阅读这本书了。 若您选择了HTML格式,则不需下载,只需点击在线阅读链接即可。页面会跳转到包含书籍所有章节、实例代码、作者笔记等信息的HTML页面,您可以任意阅读或者下载章节(在左侧点击对应章节)。 总之,动手深度学习v2是一本亲身实践的深度学习教材,其深入浅出的讲解以及丰富的实战案例,能够帮助初者快速掌握深度学习这一技术,同时也是深度学习领域专业人士的必备读物。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值