李沐动手学深度学习import torch
时间: 2025-06-29 14:22:24 浏览: 14
### 李沐《动手学深度学习》中使用 Torch 的相关内容
#### 语义分割与 Pascal VOC2012 数据集加载
在李沐的《动手学深度学习》V2版本中,针对语义分割任务介绍了如何利用 PyTorch 加载并处理图像数据。具体来说,在介绍语义分割时选择了经典的Pascal VOC2012数据集作为案例研究对象[^1]。
为了更好地理解这部分内容,可以参考以下简化后的代码片段来展示如何读取和预处理该数据集:
```python
import torchvision.transforms as transforms
from d2l import torch as d2l
voc_dir = d2l.download_extract('voc2012', 'VOCdevkit/VOC2012')
batch_size, crop_size = 32, (320, 480)
# 图像转换操作
transform_train = transforms.Compose([
transforms.RandomCrop(crop_size),
transforms.ToTensor()])
train_iter = d2l.load_data_pascal(voc_dir, is_train=True,
batch_size=batch_size,
resize=crop_size,
transform=transform_train)
```
这段代码展示了如何设置随机裁剪、张量化等一系列变换,并最终构建了一个迭代器用于获取训练样本批次。
#### 转置卷积及其应用
书中还深入探讨了转置卷积的概念以及其在网络架构设计中的作用。对于希望逆向执行标准卷积运算的情况——比如上采样过程——转置卷积提供了一种有效的方法。
这里给出一段简单的例子说明怎样定义一个带有转置卷积层的小型神经网络模型:
```python
import torch.nn as nn
class SimpleTransConvNet(nn.Module):
def __init__(self):
super(SimpleTransConvNet, self).__init__()
# 定义转置卷积层
self.trans_conv = nn.ConvTranspose2d(in_channels=16,
out_channels=3,
kernel_size=(4, 4),
stride=2,
padding=1)
def forward(self, X):
Y = self.trans_conv(X)
return Y
```
此部分强调了转置卷积作为一种重要的工具可以在保持空间维度的同时增加特征图的数量或尺寸。
#### 全卷积网络 FCN 实现细节
最后,《动手学深度学习》也讲解了全卷积网络(Fully Convolutional Networks, FCNs),这是一种广泛应用于视觉识别领域特别是像素级分类任务的经典结构。通过将传统 CNN 中的全连接层替换为额外的卷积层,使得整个网络能够接受任意大小输入图片而不局限于固定尺度。
下面是一个基于 ResNet 预训练骨干网搭建 FCN 模型的例子:
```python
def fcn_resnet50(num_classes):
pretrained_net = resnet50(pretrained=True)
net = nn.Sequential()
for name, layer in list(pretrained_net.named_children())[:-2]:
if isinstance(layer, nn.MaxPool2d):
continue
elif "layer" not in name:
net.add_module(name, layer)
backbone_out_channels = 2048
net.add_module("final_conv",
nn.Conv2d(backbone_out_channels, num_classes, kernel_size=1))
net.add_module("transpose_conv",
nn.ConvTranspose2d(num_classes, num_classes,
kernel_size=64, stride=32, padding=16))
return net
```
上述代码实现了从ResNet提取特征到最终预测输出的过程,其中包含了必要的调整以适应特定的任务需求。
阅读全文
相关推荐


















