非科班跨考计算机,导师的方向是深度学习,于是跟着b站一个视频敲了一遍MINIST训练的代码,发现最后测试的结果居然是正确率100%?而且loss下降的速度也非常的慢。这肯定是哪里出问题了,找了半天还是没有发现问题。训练集和测试集都是用torch的MINIST类下在同一个根目录里了,到底是哪里出问题了,完整代码贴在下面了
import numpy as np
import matplotlib.pyplot as plt
from torch.utils.data import Dataset,DataLoader
from torchvision import transforms
from torchvision import datasets
import torch.nn.functional as F
import torch.optim as optim
batch_size=64
transform=transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,),(0.3081,))])
train_dataset=datasets.MNIST(root='D:\pitorch_lx\PythonApplication2',train=True,download=True,transform=transform)
train_loader=DataLoader(dataset=train_dataset,batch_size=batch_size,shuffle=True)
test_dataset=datasets.MNIST(root='D:\pitorch_lx\PythonApplication2',train=False,download=True,transform=transform)
test_loader=DataLoader(dataset=test_dataset,batch_size=batch_size,shuffle=False)
class Net(torch.nn.Module):
def __init__(self):
super(Net,self).__init__()
self.Linear1=torch.nn.Linear(784,512)
self.Linear2=torch.nn.Linear(512,256)
self.Linear3=torch.nn.Linear(256,128)
self.Linear4=torch.nn.Linear(128,64)
self.Linear5=torch.nn.Linear(64,10)
def forward(self,x):
x=x.view(-1,784)
x=F.relu(self.Linear1(x))
x=F.relu(self.Linear2(x))
x=F.relu(self.Linear3(x))
x=F.relu(self.Linear4(x))
return self.Linear5(x)
model=Net()
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
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/300))
running_loss=0.0
def test():
corrtect=0
total=0
with torch.no_grad():
for data in test_loader:
images,labels=data
outputs=model(images)
_,predicted=torch.max(outputs.data,dim=1)
total+=labels.size(0)
corrtect+=(predicted==labels).sum().item()
print('Accuracy on test set:%d %%'%(100*corrtect/total))
if __name__=='__main__':
for epoch in range(10):
train(epoch)
test()
代码有错误
def test():
corrtect = 0
total = 0
allimages = torch.empty(0, 1, 28, 28)
alllabels = torch.empty(0)
with torch.no_grad():
for data in test_loader:
images, labels = data
allimages = torch.cat((allimages, images), 0)
alllabels = torch.cat((alllabels, labels), 0)
outputs = model(allimages)
_, predicted = torch.max(outputs.data, dim=1)
total += alllabels.size(0)
corrtect += (predicted == alllabels).sum().item()
print('Accuracy on test set:%d %%' % (100 * corrtect / total))
你的写法只测试了10000%64=16个,所以是100%。
1官方的算法是Lenet网络精度是99.32
2你这个精度是100%没什么问题
3你这个网络都是全连接层进行实现的,效果比前面存在几个卷积层更好,
4可以试试吧网络换成Lenet精度就下来了
吗网络结构如下
nn.Conv2d(1, 6, 5, padding=2)
nn.Conv2d(6, 16, 5)
nn.Linear(1655, 120)
nn.Linear(120, 84)
nn.Linear(84, 10)
5我也是今年上岸研究生可以加我一起讨论哈哈哈