通过卷积神经网络实现MNIST数据集分类

问题
对比单个全连接网络,在卷积神经网络层的加持下,初始时,整个神经网络模型的性能是否会更好。
方法
模型设计
两层卷积神经网络(包含池化层),一层全连接网络。
选择 5 x 5 的卷积核,输入通道为 1,输出通道为 10:
此时图像矩阵经过 5 x 5 的卷积核后会小两圈,也就是4个数位,变成 24 x 24,输出通道为10;
选择 2 x 2 的最大池化层:
此时图像大小缩短一半,变成 12 x 12,通道数不变;
再次经过5 x 5的卷积核,输入通道为 10,输出通道为 20:
此时图像再小两圈,变成 8*8,输出通道为20;
再次经过2 x 2的最大池化层:
此时图像大小缩短一半,变成 4 x 4,通道数不变;
最后将图像整型变换成向量,输入到全连接层中:
输入一共有 4 x 4 x 20 = 320个元素,输出为 10.
代码
准备数据集
准备数据集batch_size = 64
transform = transforms.compose([
transforms.totensor(),
transforms.normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.mnist(root='data’,
train=true, download=true, transform=transform)train_loader = dataloader(train_dataset,
shuffle=true, batch_size=batch_size)test_dataset = datasets.mnist(root='data',
train=false, download=true, transform=transform)test_loader = dataloader(test_dataset,
shuffle=false, batch_size=batch_size)建立模型
class net(torch.nn.module):
def init (self):
super(net, self).__init__() self.conv1 = torch.nn.conv2d(1, 10, kernel_size=5) self.conv2 = torch.nn.conv2d(10, 20, kernel_size=5) self.pooling = torch.nn.maxpool2d(2) self.fc = torch.nn.linear(320, 10)def forward(self, x):
batch_size = x.size(0) x = f.relu(self.pooling(self.conv1(x))) x = f.relu(self.pooling(self.conv2(x))) x = x.view(batch_size, -1) x = self.fc(x) return xmodel = net()
device = torch.device(cuda:0 if torch.cuda.is_available() else cpu)
model.to(device)
构造损失函数+优化器
criterion = torch.nn.crossentropyloss()
optimizer = optim.sgd(model.parameters(), lr=0.01, momentum=0.5)
训练+测试
def train(epoch):
running_loss = 0.0
for batch_idx, data in enumerate(train_loader, 0):
inputs, target = data inputs,target=inputs.to(device),target.to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, target) loss.backward() optimizer.step() running_loss += loss.item() if batch_idx % 300 == 299: print('[%d,%.5d] loss:%.3f' % (epoch + 1, batch_idx + 1, running_loss / 2000)) running_loss = 0.0def test():
correct=0
total=0
with torch.no_grad():
for data in test_loader: inputs,target=data inputs,target=inputs.to(device),target.to(device) outputs=model(inputs) _,predicted=torch.max(outputs.data,dim=1) total+=target.size(0) correct+=(predicted==target).sum().item()print('accuracy on test set:%d %% [%d%d]' %(100*correct/total,correct,total))
if name ==' main ':
for epoch in range(10):
train(epoch) test()运行结果
(1)batch_size:64,训练次数:10
(2)batch_size:128,训练次数:10
(3)batch_size:128,训练次数:10
结语
对比单个全连接网络,在卷积神经网络层的加持下,初始时,整个神经网络模型的性能显著提升,准确率最低为96%。在batch_size:64,训练次数:100情况下,准确率达到99%。下一阶在平均池化,3*3卷积核,以及不同通道数的情况下,探索对模型性能的影响。

锂电池生产商豪鹏科技登录资本市场
常用的温度仪表及温度传感器、变送器
当ARM这样的巨头出来扛大旗,创投产业何愁不兴?
如何用测厚仪来进行测量太阳膜
联想Lenovo Oner让手机和电脑互联更方便
通过卷积神经网络实现MNIST数据集分类
全面的磁珠知识:从原理、应用、选型到与电感的联系与区别
带电作业的操作步骤
ANDON电源转换器插座提供通孔
北京站的成功收官为JetBrains2018年中国之行划下圆满句点
雪亮工程大有可为 是针对农村安防建设的群众性工程
TWS600旧版与TWS600新版的区别
开关电源“待机功耗”问题让你抓狂吗?
如何使用单个运算放大器来驱动8信道数据采集系统中的ADC
总投资100亿元!芯片与SIP先进封装系统落户江西德兴市
嵌入式虚拟化支持多核实时应用程序的可扩展性
雷柏VT200/200S对比 哪个好
某些应用下对时序要求比较高,串口输出log占用时间太长怎么办?
自动焊接设备组成部件有哪些
Android和Linux应用综合对比分析