PyTorch resnet18实现MNIST手写数字识别
Warning: 这是一个学习笔记及分享向的文章, 对于初学者可能不太友好
最近突然出现了一个疑问, 用了ResNet等主流主干网络这么久, 也知道每个网络最基本的原理, 比如ResNet是利用H(x)=F(x)+x恒等变换让网络易于训练, 在有downsample的层将x进行变换匹配F(x)之后的size, 但是具体是怎么实现的呢?抱着这个疑问, 在重新阅读了ResNet这篇论文之后, 把官方源码研究了一遍。花了大概一个星期的时间, 终于把源码中和ResNet这篇论文相关的部分都理解透彻了。
不得不说源码的作者是真的牛逼, 看完感觉自己写代码的能力又增加了(增加了, 但没有完全增加, 只增加了一点点)
最后写完了resnet18等几个函数后, 想找点数据来练练手。第一时间我想到了MNIST, 在印象中MNIST的图片是 28* 28* 1 的, 但是resnet18接收的是3通道的RGB图片。于是乎, 我写了以下这段代码:
model = resnet18(num_classes=10)
img = torch.Tensor(1, 3, 28, 28)
output = model(img)
然后就得到了以下的输出:
(输出部分是我在自己重写的代码里面加入了print(), 源码中没有输出每层的output.size())
>>> inputs: torch.Size([1, 3, 28, 28])
>>> conv1 -> maxpool: torch.Size([1, 64, 7, 7])
>>> layer1: torch.Size([1, 64, 7, 7])
>>> layer2: torch.Size([1, 128, 4, 4])
>>