《动手学深度学习 pytorch版》代码笔记——第5-8章

本文深入解析卷积神经网络CNN的关键概念,包括randn()与rand()函数的作用、统一数据类型的必要性及LeNet模型结构。通过具体实例,阐述CNN在图像处理中的应用,如边缘检测和特征提取。

第五章 卷积神经网络

知识点1:randn() 与 rand()

函数作用
np.random.randn()从标准正态分布中返回一个或多个样本值
np.random.rand(m, n)生成m行n列的均匀分布的伪随机数

知识点2:统一数据类型

  • 描述: 5.1.3 图像中物体边缘检测中,第一个小例子会出现 expected backend CPU and dtype Float but got backend CPU and dtype Long 的报错。
  • 解决:X的数据类型统一下就可以了,添加 X = torch.tensor(X, dtype=torch.int64)
  • 具体原因和装饰器@torchsnooper.snoop()的使用,参考 《动手学深度学习 pytorch版》代码笔记——第1-4章

知识点3:LeNet 模型
在这里插入图片描述
网络结构如上,简单梳理下结构:

  • 输入(32,32)→卷积核 6个(5,5)/stride=1/padding=0→输出特征图 6个(28,28)
  • 输入6个(28,28)→池化 6个(2,2)/stride=2/padding=0→输出特征图 6个(14,14)
  • 输入6个(14,14)→卷积核 16个(5,5)/stride=1/padding=0→输出特征图 16个(10,10)
  • 输入16个(10,10)→池化 6个(2,2)/stride=2/padding=0→输出特征图 16个(5,5)
  • 输入16个(5,5)→卷积核 120个(5,5)/stride=1/padding=0(相当于全连接层)→输出个数120 →全连接层
  • 输出个数84→全连接层 输出个数10

书上给出的代码是这样的:
在这里插入图片描述
红色框处有个疑问:

卷积神经网络CNN原理详解

  • 有一点需要明确:该层虽然代码写成全连接层,但模型图中实际是卷积层(C5层),但因为恰好输入维度5x5,卷积核也是5x5,因此特征图大小为(5-5+1)×(5-5+1)= 1×1。这样该层就刚好变成了全连接,这只是巧合,如果原始输入的图像比较大(不是32x32了),那该层就不是全连接了。

7.27更
例子中使用的是28*28的灰度图像(感谢评论区同学的解惑),所以:

  • 输入(28,28)→卷积核 6个(5,5)/stride=1/padding=0→输出特征图 6个(24,24)
  • 输入6个(24,24)→池化 6个(2,2)/stride=2/padding=0→输出特征图 6个(12,12)
  • 输入6个(12,12)→卷积核 16个(5,5)/stride=1/padding=0→输出特征图 16个(8,8)
  • 输入16个(8,8)→池化 6个(2,2)/stride=2/padding=0→输出特征图 16个(4,4)
  • 输入16个(4,4)→卷积核 120个(5,5)/stride=1/padding=0(相当于全连接层)→输出个数120 →全连接层
  • 输出个数84→全连接层 输出个数10
### 动手学深度学习5.1节 学习笔记 在《动手学深度学习》第5.1节中,主要讨论的是卷积层及其基本概念。这一部分介绍了如何通过二维互相关运算理解卷积核的作用以及其在图像处理中的应用[^1]。 #### 卷积层的核心概念 卷积层是卷积神经网络(CNN)的重要组成部分之一。它利用局部感知野的概念来提取输入数据的空间特征。具体来说,在二维空间上滑动一个小窗口(即卷积核),并通过计算该窗口内的加权和得到输出矩阵的一个元素。这种机制使得卷积层能够有效地捕捉到输入数据的局部模式。 以下是实现一个简单的二维互相关运算的例子: ```python import torch from torch import nn def corr2d(X, K): h, w = K.shape Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1)) for i in range(Y.shape[0]): for j in range(Y.shape[1]): Y[i, j] = (X[i:i+h, j:j+w]*K).sum() return Y ``` 上述代码展示了如何手动编写一个用于执行二维互相关运算的功能函数 `corr2d` 。此函数接受两个参数:一个是输入矩阵 \(X\) ,另一个是卷积核 \(K\) 。 #### PyTorch 中的卷积操作 除了自己构建外,还可以直接使用 PyTorch 提供的高度优化好的 API 来完成更复杂的任务。例如,可以通过调用 `nn.Conv2d()` 创建一个具有指定超参设置的标准卷积层实例: ```python conv_layer = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=(h,w), bias=False) with torch.no_grad(): conv_layer.weight[:] = K.reshape(conv_layer.weight.shape) output_tensor = conv_layer(input_tensor.unsqueeze(0).unsqueeze(0)).squeeze(0).squeeze(0) print(output_tensor) ``` 这里需要注意的一点是权重初始化的过程——我们通常会禁用梯度追踪以便于显式赋值给卷积层的权重向量[^2]。 #### 性能考量 尽管 CNN 的参数数量相对较少,但由于每个参数都会参与到大量的乘法运算当中去,因此整体计算开销依然较大。为了缓解这个问题,实际部署过程中往往依赖 GPU 加速技术提升效率[^3]。 #### 小批量随机梯度下降 最后值得一提的是,在训练阶段不可避免地涉及到对整个数据集多次迭代访问的需求;而考虑到内存占用等因素的影响,一般采用分批次加载的方式来进行高效的数据管理[^4]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值