☰
【Pytorch】Pytorch: Training a Classifier (四)
2026/10/22 6:47:23 网站建设 项目流程

这个还是官网 tutorial上的一个例子,还是非常有意思的,感觉搭建网络不用一开始就上大数据集,可以先用小数据集进行简单训练和inference,为啥呢?

如果上来一个大数据集,每次调试载入数据都得30分钟,然后发现存在一个小问题,还不如用个小数据集,确认无误了,再用大数据集,包括预处理也是,先用一部分数据测试可行性,不然时间成本太高了。。。

#载入对应依赖库importtorchimporttorchvisionimporttorchvision.transformsastransforms
#官网上说数据集的输出为[0,1]的范围#要将其的转化为范围为[-1, 1]#因为输入数据是3个通道的,所以设置每个通道的mean为(0.5,0.5,0.5),# standard deviations为(0.5,0.5,0.5)transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])#这边建议download=False,自己到网站上去下载对应的数据到./data目录下,不然的话会很久#有种错觉是不是代码写错了。。。trainset=torchvision.datasets.CIFAR10(root='./data',train=True,download=False,transform=transform)trainloader=torch.utils.data.DataLoader(trainset,batch_size=4,shuffle=True,num_workers=0)testset=torchvision.datasets.CIFAR10(root='./data',train=False,download=False,transform=transform)testloader=torch.utils.data.DataLoader(testset,batch_size=4,shuffle=False,num_workers=0)classes=('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')
#显示一些图片importmatplotlib.pyplotaspltimportnumpyasnpdefimshow(img):img=img/2+0.5npimg=img.numpy()plt.imshow(np.transpose(npimg,(1,2,0)))plt.show()dataiter=iter(trainloader)images,labels=dataiter.next()imshow(torchvision.utils.make_grid(images))print(' '.join('%5s'%classes[labels[j]]forjinrange(4)))

deer truck dog cat
#开始构建自己的网络importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassNet(nn.Module):def__init__(self):super(Net,self).__init__()self.conv1=nn.Conv2d(3,6,3)self.pool=nn.MaxPool2d(2,2)self.conv2=nn.Conv2d(6,16,5)self.fc1=nn.Linear(16*5*5,120)self.fc2=nn.Linear(120,84)self.fc3=nn.Linear(84,10)defforward(self,x):x=self.pool(F.relu(self.conv1(x)))x=self.pool(F.relu(self.conv2(x)))x=x.view(-1,16*5*5)x=F.relu(self.fc1(x))x=F.relu(self.fc2(x))x=self.fc3(x)returnx net=Net()print(net)
Net( (conv1): Conv2d(3, 6, kernel_size=(3, 3), stride=(1, 1)) (pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) (conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1)) (fc1): Linear(in_features=400, out_features=120, bias=True) (fc2): Linear(in_features=120, out_features=84, bias=True) (fc3): Linear(in_features=84, out_features=10, bias=True) )
#设置交叉熵作为损失函数,不清楚的可以看cs231n的课程importtorch.optimasoptim criterion=nn.CrossEntropyLoss()optimizer=optim.SGD(net.parameters(),lr=0.001,momentum=0.9)
#设置epoch为2,也就是整个数据学习两轮forepochinrange(2):running_loss=0.0fori,datainenumerate(trainloader,0):inputs,labels=data optimizer.zero_grad()outputs=net(inputs)loss=criterion(outputs,labels)loss.backward()optimizer.step()running_loss+=loss.item()ifi%2000==1999:print('[%d, %5d] loss: %.3f'%(epoch+1,i+1,running_loss/2000))running_loss=0.0print('Finished Training')
[1, 2000] loss: 1.229 [1, 4000] loss: 1.234 [1, 6000] loss: 1.210 [1, 8000] loss: 1.219 [1, 10000] loss: 1.206 [1, 12000] loss: 1.209 [2, 2000] loss: 1.134 [2, 4000] loss: 1.145 [2, 6000] loss: 1.136 [2, 8000] loss: 1.119 [2, 10000] loss: 1.138 [2, 12000] loss: 1.117 Finished Training
#保存模型PATH='./cifar_net.pth'torch.save(net.state_dict(),PATH)
#显示部分测试的图片dataiter=iter(testloader)images,labels=dataiter.next()imshow(torchvision.utils.make_grid(images))print('GroundTruth: ',' '.join('%5s'%classes[labels[j]]forjinrange(4)))

GroundTruth: cat ship ship plane
#重新加载模型net=Net()net.load_state_dict(torch.load(PATH))
IncompatibleKeys(missing_keys=[], unexpected_keys=[])
#预测一下,好像对了50%。。。。_,predicted=torch.max(outputs,1)print('Predicted: ',' '.join('%5s'%classes[predicted[j]]forjinrange(4)))
Predicted: frog ship car plane
#测试总的准确率correct=0total=0withtorch.no_grad():fordataintestloader:images,labels=data outputs=net(images)#输出可能性最大的index_,predicted=torch.max(outputs.data,1)total+=labels.size(0)#计算label和predicted相同的个数总和,就是预测对的数量correct+=(predicted==labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%'%(100*correct/total))
Accuracy of the network on the 10000 test images: 57 %
#查看具体每一类的准确率class_correct=list(0.foriinrange(10))class_total=list(0.foriinrange(10))withtorch.no_grad():fordataintestloader:images,labels=data outputs=net(images)_,predicted=torch.max(outputs,1)c=(predicted==labels).squeeze()foriinrange(4):label=labels[i]class_correct[label]+=c[i].item()class_total[label]+=1foriinrange(10):print('Accuracy of %5s : %2d %%'%(classes[i],100*class_correct[i]/class_total[i]))
猫和狗学的好差。。。。 Accuracy of plane : 80 % Accuracy of car : 79 % Accuracy of bird : 37 % Accuracy of cat : 33 % Accuracy of deer : 44 % Accuracy of dog : 39 % Accuracy of frog : 63 % Accuracy of horse : 58 % Accuracy of ship : 76 % Accuracy of truck : 60 %
#如果有GPU,当然使用GPU啦,不然好浪费,感觉LZ的970m小笔记本都快被榨干了。。。device=torch.device("cuda:0"iftorch.cuda.is_available()else"cpu")print(device)
cuda:0
#将网络和数据从CPU上移到GPU上去net.to(device)inputs,labels=data[0].to(device),data[1].to(device)

感觉基本的操作都进行了一遍,后续还要继续学习O(∩_∩)O哈哈~

参考地址:
https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询