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

第五章 卷积神经网络

知识点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 模型
《动手学深度学习 pytorch版》代码笔记——第5-8章_第1张图片
网络结构如上,简单梳理下结构:

  • 输入(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

书上给出的代码是这样的:
《动手学深度学习 pytorch版》代码笔记——第5-8章_第2张图片
红色框处有个疑问:

卷积神经网络CNN原理详解

  • 有一点需要明确:该层虽然代码写成全连接层,但模型图中实际是卷积层(C5层),但因为恰好输入维度5x5,卷积核也是5x5,因此特征图大小为(5-5+1)×(5-5+1)= 1×1。这样该层就刚好变成了全连接,这只是巧合,如果原始输入的图像比较大(不是32x32了),那该层就不是全连接了。
  • 为什么下面写成全连接层时,输入的维度就变成16x4x4了呢??不应该是16x5x5吗,百思不得其解。
  • 于是尝试把全连接层,改写成卷积层,当卷积核设置为(5,5)时就会报错,(4,4)就正常了,这是为何??

。。。。。。还没想出原因。。。。。。。。。。

你可能感兴趣的:(实例)