第五章 卷积神经网络
知识点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
书上给出的代码是这样的:
红色框处有个疑问:
- 有一点需要明确:该层虽然代码写成全连接层,但模型图中实际是卷积层(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