pytorch实现MNIST手写体识别
本文实例为大家分享了pytorch实现MNIST手写体识别的具体代码,供大家参考,具体内容如下
实验环境
pytorch1.4
Windows10
python3.7
cuda10.1(我笔记本上没有可以使用cuda的显卡)
实验过程
1.确定我们要加载的库
importtorch importtorch.nnasnn importtorchvision#这里面直接加载MNIST数据的方法 importtorchvision.transformsastransforms#将数据转为Tensor importtorch.optimasoptim importtorch.utils.data.dataloaderasdataloader
2.加载数据
这里使用所有数据进行训练,再使用所有数据进行测试
train_set=torchvision.datasets.MNIST( root='./data',#文件存储位置 train=True, transform=transforms.ToTensor(), download=True ) train_dataloader=dataloader.DataLoader(dataset=train_set,shuffle=False,batch_size=100)#dataset可以省 ''' dataloader返回(images,labels) 其中, images维度:[batch_size,1,28,28] labels:[batch_size],即图片对应的 ''' test_set=torchvision.datasets.MNIST( root='./data', train=False, transform=transforms.ToTensor(), download=True ) test_dataloader=dataloader.DataLoader(test_set,batch_size=100,shuffle=False)#dataset可以省
3.定义神经网络模型
这里使用全神经网络作为模型
classNeuralNet(nn.Module): def__init__(self,in_num,h_num,out_num): super(NeuralNet,self).__init__() self.ln1=nn.Linear(in_num,h_num) self.ln2=nn.Linear(h_num,out_num) self.relu=nn.ReLU() defforward(self,x): returnself.ln2(self.relu(self.ln1(x)))
4.模型训练
in_num=784#输入维度 h_num=500#隐藏层维度 out_num=10#输出维度 epochs=30#迭代次数 learning_rate=0.001 USE_CUDA=torch.cuda.is_available()#定义是否可以使用cuda model=NeuralNet(in_num,h_num,out_num)#初始化模型 optimizer=optim.Adam(model.parameters(),lr=learning_rate)#使用Adam loss_fn=nn.CrossEntropyLoss()#损失函数 foreinrange(epochs): fori,datainenumerate(train_dataloader): (images,labels)=data images=images.reshape(-1,28*28)#[batch_size,784] ifUSE_CUDA: images=images.cuda()#使用cuda labels=labels.cuda()#使用cuda y_pred=model(images)#预测 loss=loss_fn(y_pred,labels)#计算损失 optimizer.zero_grad() loss.backward() optimizer.step() n=e*i+1 ifn%100==0: print(n,'loss:',loss.item())
训练模型的loss部分截图如下:
5.测试模型
withtorch.no_grad(): total=0 correct=0 for(images,labels)intest_dataloader: images=images.reshape(-1,28*28) ifUSE_CUDA: images=images.cuda() labels=labels.cuda() result=model(images) prediction=torch.max(result,1)[1]#这里需要有[1],因为它返回了概率还有标签 total+=labels.size(0) correct+=(prediction==labels).sum().item() print("Theaccuracyoftotal{}images:{}%".format(total,100*correct/total))
实验结果
最终实验的正确率达到:98.22%
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。