跟着李沐老师学习深度学习(一)

深度学习基础

课程视频:https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358497
课程教材:https://zh.d2l.ai/
加油加油!俺可以!

深度学习相关介绍

应用:图片分类、物体检测和分割、样式迁移、人脸合成、文字生成图片、文字生成(QA)、无人驾驶。
案例-广告点击:触发(关键词)–> 点击率预估 --> 排序(点击率 * 竞价)

安装

  • 使用conda/ miniconda环境

我这里是在Windows下,使用conda环境,如下命令可以创建一个新的环境:

conda create --name d2l python=3.9 -y

激活 d2l 环境:

conda activate d2l
  • 安装需要的包
pip install torch==1.12.0
pip install torchvision==0.13.0
pip install d2l==0.17.6
  • 接下来,需要下载这本书的代码

进入自己的代码工作目录

d:
cd D:\code\d2l

下载代码:

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

下载完之后可以直接在对应路径进行解压,最后切换到解压后的文件目录,输入以下命令:

jupyter notebook

现在可以在Web浏览器中打开http://localhost:8888(通常会自动打开)。 由此,我们可以运行这本书中每个部分的代码,如下图所示。
在这里插入图片描述

由于课程中课件是以jupyter幻灯片文件存在的,所以需要安装jupyter幻灯片插件才能查看

pip install rise

数据操作+数据预处理

N维数组样例

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

在这里插入图片描述
在这里插入图片描述

创建数组

  • 数组需要
    • 形状:例如3 * 4矩阵
    • 每个元素的数据类型:例如32位浮点数
    • 每个元素的值:例如全是0,或者随机数

访问元素

  • 一个元素:[1, 2]
  • 一行:[1, :]
  • 一列:[1, :]
  • 子区域:[1:3, 1: ] (取到第一行第二行,以及第一列以后的所有元素)
  • 子区域:[::3, ::2] (跳着访问,每三行一跳,每两列一跳)
    在这里插入图片描述

数组相关练习:

1. 张量创建函数:

  • torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False):创建一个从 start 到 end(不包括)的一维张量,步长为 step。

    • 例如 x = torch.arange(12) 创建了一个包含 0 到 11 的一维张量。
  • torch.zeros(size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False):创建一个指定 size 的全零张量

    • 例如 torch.zeros((2, 3, 4)) 创建一个形状为 (2, 3, 4) 的全零张量。
  • torch.ones(size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False):创建一个指定 size 的全一张量

    • 例如 torch.ones((2, 3, 4)) 创建一个形状为 (2, 3, 4) 的全一张量。
  • torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False):从现有的数据(如 Python 列表或嵌套列表)创建张量。

    • 例如 z = torch.tensor([[2, 1, 3, 4], [1, 2, 3, 4], [4, 3, 1, 2]])。

2. 张量属性和元素信息:

  • tensor.shape:返回张量的形状
    • 例如 x.shape 可以查看张量 x 的形状。
  • tensor.numel():返回张量中元素的总数。
    • 例如 x.numel() 会返回 x 中元素的数量。
  • tensor.dtype:返回张量的数据类型
    • 例如,在 x = torch.arange(12, dtype=torch.float32) 中使用 dtype 参数指定了数据类型为 float32。

3. 张量形状变换函数:

  • tensor.reshape(*shape):改变张量的形状而不改变元素数量和元素值。
    • 例如 X = x.reshape(3, 4) 将 x 张量重塑为形状为 (3, 4) 的张量。

4. 张量的元素级运算:

  • 标准算术运算符(+、-、*、/ 和 **):对张量进行元素级的加、减、乘、除和求幂运算。例如 x + y 是元素级相加,x ** y :是求幂。

  • torch.exp(input, out=None):计算张量元素的指数。例如 torch.exp(x) 计算 x 中每个元素的指数。

5. 张量连接函数:

  • torch.cat(tensors, dim=0):将多个张量在指定维度 dim 上连接在一起。
    • 例如 torch.cat((x, y), dim=0) 是在第 0 维合并 x 和 y 张量,torch.cat((x, y), dim=1) 是在第 1 维合并。

6. 张量的比较运算:

  • tensor1 == tensor2:进行元素级的相等比较,返回一个布尔型张量
    • 例如 x == y 会生成一个与 x 和 y 形状相同的张量,元素表示 x 和 y 对应元素是否相等。

7. 张量的元素访问和修改:

  • tensor[index]:通过索引访问张量元素。
    • 例如 x[-1] 访问 x 的最后一个元素,x[1:3] 访问 x 的第二行和第三行元素。
  • tensor[indices] = value:通过索引修改张量元素
    • 例如 x[1, 2] = 9 为 x 中第 2 行第 3 列(下标从0开始)元素赋值为 9,x[0:2, :] = 12 为 x 的前两行所有元素赋值为 12,x[0:2, 1:3] = 88 为 x 的前两行中第 2 列到第 3 列元素赋值为 88。

8. 张量的内存操作:

  • id(tensor):获取张量的唯一标识符,用于比较张量是否在内存中发生了变化。
    • 例如 before = id(y) 存储 y 的标识符,用于后续检查 y 的内存是否改变。这样赋值y = y + x,会导致开启新的内存,可能造成内存的浪费(实际中要尽量避免这种情况)
  • 原地操作:使用 x[:] = x + yx += y 来避免额外的内存分配,例如 x += y 直接将 x + y 的结果存储在 x 中,不会重新分配内存。

9. 张量和 numpy 数组的转换:

  • tensor.numpy():将张量转换为 numpy 数组。
    • 例如 A = x.numpy() 将张量 x 转换为 numpy 数组 A。
  • torch.tensor(array):将 numpy 数组转换为张量。
    • 例如 B = torch.tensor(A) 将 numpy 数组 A 转换为张量 B。
      张量和标量的转换:
  • tensor.item():将大小为 1 的张量转换为 Python 标量
    • 例如 a.item() 将张量 a(只有一个元素)转换为 Python 标量,还可以使用 float(a) 或 int(a) 进行相应类型的转换。

10. 相关练习代码如下:

import torch

# 张量表示一个数值组成的数组,这个数组可能有多个维度
x = torch.arange(12)
x

# 可以通过张量的shape属性来访问张量的 形状 和 张量中的元素的总数
x.shape

x.numel() # 元素的总数:永远是个标量,这里是12

# 要改变一个张量的形状而不改变元素数量和元素值,可以调用reshape函数
X = x.reshape(3, 4)
X

# 使用全0、全1、其他常量或者从特定分布中随机采样的数字
torch.zeros((2, 3, 4))

torch.ones((2, 3, 4))

# 通过提供包含数值的python列表(或嵌套列表)来为所需张量中的每个元素赋予确定值
z = torch.tensor([[2, 1, 3, 4], [1, 2, 3, 4], [4, 3, 1, 2]])
z.shape

# 常见的标准算术运算符(+、-、*、/和**)都可以被升级为按元素运算
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
### 李沐《动手学深度学习》代码笔记 #### 使用 Conda 安装 PyTorch 和其他依赖项 为了高效地设置开发环境并确保兼容性,建议使用 Anaconda 而不是 pip 来管理 Python 包和虚拟环境。Anaconda 不仅捆绑了众多重要的数据科学、机器学习以及科学计算所需的工具和库,还提供了稳定可靠的包管理和环境隔离功能[^2]。 ```bash # 创建个新的 conda 环境,并命名为 d2l-pytorch conda create --name d2l-pytorch python=3.9 # 激活该环境 conda activate d2l-pytorch # 安装 pytorch 及其相关组件 conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch # 安装 jupyter notebook 以及其他常用的数据处理库 conda install jupyter numpy pandas matplotlib scikit-learn ``` #### 关键数学概念回顾 在深入研究具体实现之前,掌握基本的线性代数知识对于理解神经网络内部运作至关重要。这部分内容涵盖了向量、矩阵及其运算规则,这些基础知识构成了大部分现代深度学习框架的核心[^3]。 例如,在定义个多层感知机(MLP)时: ```python import torch from torch import nn class MLP(nn.Module): def __init__(self, input_size, hidden_sizes, output_size): super(MLP, self).__init__() layers = [] sizes = [input_size] + hidden_sizes for i in range(len(sizes)-1): layers.append(nn.Linear(sizes[i], sizes[i+1])) layers.append(nn.ReLU()) layers.append(nn.Linear(hidden_sizes[-1], output_size)) self.model = nn.Sequential(*layers) def forward(self, x): return self.model(x) ``` 上述代码片段展示了如何利用 `nn.Linear` 构建全连接层,并通过激活函数 ReLU 实现非线性变换。每层接受前层输出作为输入,并将其传递给下层直到最终预测结果被生成。 #### 数据预处理与加载 有效的特征工程能够显著提升模型性能。书中强调了良好实践的重要性,比如标准化数值型变量或将类别标签转换成独热编码形式等操作[^1]。 ```python from sklearn.preprocessing import StandardScaler from torch.utils.data import DataLoader, TensorDataset def prepare_data(X_train, y_train, X_test=None, y_test=None, batch_size=64): scaler = StandardScaler() # 对训练集进行fit_transform X_train_scaled = scaler.fit_transform(X_train) if X_test is not None and y_test is not None: # 测试集只做transform X_test_scaled = scaler.transform(X_test) train_loader = DataLoader(TensorDataset(torch.tensor(X_train_scaled), torch.tensor(y_train)), shuffle=True, batch_size=batch_size) test_loader = DataLoader(TensorDataset(torch.tensor(X_test_scaled), torch.tensor(y_test)), shuffle=False, batch_size=batch_size) return train_loader, test_loader else: train_loader = DataLoader(TensorDataset(torch.tensor(X_train_scaled), torch.tensor(y_train)), shuffle=True, batch_size=batch_size) return train_loader ``` 此函数实现了对输入数据的缩放和平移,使得每列均值接近零且标准差等于;同时创建了个可以迭代访问批次样本的 `DataLoader` 对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值