本文缘起于一次CNN功课中的一道题,这道题涉及到了根本的CNN收集搭建,在MNIST数据集上的分类结不雅,Batch Normalization的影响,Dropout的影响,卷积核大年夜小的影响,数据集大年夜小的影响,不合部分数据集的影响,随机数种子的影响,以及不合激活单位的影响等,可以或许让人比较周全地对CNN有一个懂得,所以想做一下,于是有了本文。
开源深度进修库: PyTorch
实现
初始请求
- class Net(nn.Module):
- def __init__(self):
- super(Net, self).__init__()
- self.conv1 = nn.Conv2d(1, 20, kernel_size=(5, 5), stride=(1, 1), padding=0)
- self.conv2 = nn.Conv2d(20, 50, kernel_size=(5, 5), stride=(1, 1), padding=0)
- self.fc1 = nn.Linear(4*4*50, 500)
- self.fc2 = nn.Linear(500, 10)
- def forward(self, x):
- x = F.max_pool2d(self.conv1(x), 2)
- x = F.max_pool2d(self.conv2(x), 2)
- x = x.view(-1, 4*4*50)
- x = F.relu(self.fc1(x))
- x = self.fc2(x)
- return F.log_softmax(x)
这部分代码见 base.py 。
问题A:预处理
即请求将MNIST数据集按照规矩攫取并且tranform到合适处理的格局。这里攫取的代码沿用了BigDL Python Support的攫取方法,无需细说,根据MNIST主页上的数据格局可以很快读出,关键block有攫取32位比特的函数:
将ReLU全部换成Sigmoid后,用全部60000个练习集练习,有比较结不雅如下:
- 500: 84.2%
- 1000: 92.0%
- 2000: 94.3%
- 5000: 95.5%
- 10000: 96.6%
- 20000: 98.4%
- 60000: 99.1%
- def _read32(bytestream):
- dt = numpy.dtype(numpy.uint32).newbyteorder('>') # 大年夜端模式攫取,最高字节在前(MSB first)
- return numpy.frombuffer(bytestream.read(4), dtype=dt)[0]
读出后是(N, 1, 28, 28)的tensor,每个像素是0-255的值,起首做一下归一化,将所有值除以255,获得一个0-1的值,然后再Normalize,练习集和测试集的均值方差都已知,直接做即可。因为练习集和测试集的均值方差都是针对归一化后的数据来说的,所以刚开端没做归一化,所以forward输出和grad很离谱,后来才发明是这里出了问题。
这部分代码见 preprocessing.py 。
问题B:BASE模型
将random seed设置为0,在前10000个练习样本上进修参数,最后看20个epochs之后的测试集缺点率。最后结不雅为:
推荐阅读
据媒体报道,为改进 Go 说话的开辟对象,Go 可能会获得本身的说话办事器,类似于 Microsoft 和 Red Hat 的说话办事器协定。消息是大年夜 Go 说话开辟者的评论辩论组中流出,所以这不是最>>>详细阅读
本文标题:利用Pytorch进行CNN详细剖析
地址:http://www.17bianji.com/lsqh/36741.html
1/2 1