跟着李沐学深度学习代码笔记
时间: 2025-04-17 19:44:32 浏览: 38
### 李沐《动手学深度学习》代码笔记
#### 使用 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` 对象。
阅读全文
相关推荐

















