import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
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='./数据集/mnist/',train=True,download=True,
transform = transform)
# 打乱顺序
train_loader = DataLoader(train_dataset,
shuffle=True,
batch_size=batch_size)
# 导入测试数据
test_dataset = datasets.MNIST(root='./数据集/mnist/',train=False,download=True,
transform = transform)
# 打乱顺序
test_loader = DataLoader(test_dataset,
shuffle=True,
batch_size=batch_size)
class ImageNet(torch.nn.Module):
def __init__(self,):
super(ImageNet,self).__init__()
#(batch,1,28,28) -> (batch,10,24,24) -> (batch,10,24,24) ->
#(batch,10,12,12) -> (batch,20,10,10) -> (batch,20,10,10) ->
#(batch,20,5,5) -> (batch,30,4,4) -> (batch,30,4,4) -> (batch,30,2,2) -> (batch,120)
self.conv1 = torch.nn.Conv2d(1,10,kernel_size=5)
self.conv2 = torch.nn.Conv2d(10,20,kernel_size=3)
self.conv3 = torch.nn.Conv2d(20,30,kernel_size=2)
self.pooling = torch.nn.MaxPool2d(2)
self.linear = torch.nn.Linear(120,10)
def forward(self,x):
batch_size = x.size(0)
x = self.pooling(F.relu(self.conv1(x)))
x = self.pooling(F.relu(self.conv2(x)))
x = self.pooling(F.relu(self.conv3(x)))
x = x.view(batch_size,-1)
x = self.linear(x)
return x
model = ImageNet()
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
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}'.format(epoch+1,batch_idx+1,
running_loss/300))
running_loss = 0.0
def 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:{:.2%}".format(correct/total))
if __name__ == '__main__':
for epoch in range(10):
train(epoch)
test()