基于Pytorch框架的手写体识别
import torch
import torch.nn as nn
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
EPOCH = 10
BATCH_SIZE = 100
LEARNING_RATE = 0.001
DOWNLOAD = False
train_dataset = datasets.MNIST(root=./data, train=True, transform=transforms.ToTensor(), download=DOWNLOAD)
test_dataset = datasets.MNIST(root=./data, train=False, transform=transforms.ToTensor(), download=DOWNLOAD)
print(type(train_dataset))
print(train_dataset.data.size())
print(train_dataset.targets.size())
plt.imshow(train_dataset.data[56785].numpy(), cmap=gray)
plt.title(%i % train_dataset.targets[56785])
plt.show()
train_loader = DataLoader(dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=BATCH_SIZE, shuffle=True)
print(type(train_loader))
class CnnMnist(nn.Module):
def __init__(self):
super(CnnMnist, self).__init__()
self.conv1 = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, stride=1, padding=1), #28*28*64
nn.ReLU(),
nn.Conv2d(64, 128, 3, 1, 1), #28*28*128
nn.ReLU(),
nn.MaxPool2d(stride=2, kernel_size=2)) #14*14*128
self.fullyconnect = nn.Sequential(nn.Linear(14*14*128, 1024),
nn.ReLU(),
nn.Dropout(p=0.5),
nn.Linear(1024, 10))
def forward(self, x):
x = self.conv1(x)
x = x.view(-1, 14*14*128)
out = self.fullyconnect(x)
return out
model = CnnMnist()
if torch.cuda.is_available():
model.cuda()
optimzer = torch.optim.RMSprop(model.parameters(), lr=LEARNING_RATE)
cost = nn.CrossEntropyLoss() #多类分类器
print(model)
for epoch in range(EPOCH):
running_loss = 0.0
running_accuracy = 0.0
print(-*20)
print(Epoch{}/{}.format(epoch+1, EPOCH))
for data in train_loader:
x_train, y_train = data
x_train, y_train = x_train.cuda(), y_train.cuda()
x_train, y_train = Variable(x_train), Variable(y_train)
outputs = model(x_train)
_, pred = torch.max(outputs.data, 1)#torch.max(softmax输出的一个tensor,dim=0:输出每列的最大值/dim=1:输出每行的最大值)
optimzer.zero_grad() #清空模型的参数梯度
loss = cost(outputs, y_train)
loss.backward() #反向传播,计算当前梯度
optimzer.step() #根据梯度更新网落参数
running_loss += loss.item()
running_accuracy += torch.sum(pred == y_train.data)
test_accuracy = 0.0
for data in test_loader:
x_test, y_test = data
x_test, y_test = x_test.cuda(), y_test.cuda()
x_test, y_test = Variable(x_test), Variable(y_test)
outputs = model(x_test)
_, pred = torch.max(outputs, 1)
test_accuracy += torch.sum(pred == y_test.data)
print(Loss is :{:.4f},Train Accuracy is:{:.4f}%,Test Accuracy is:{:.4f}%.format(
running_loss/len(train_dataset),
100.0*running_accuracy/len(train_dataset),
100.0*test_accuracy/len(test_dataset)))
上一篇:
JS实现多线程数据分片下载
