|
import torch |
|
import torchvision |
|
from torch import optim |
|
import torch.nn.functional as F |
|
from torch.utils.data import DataLoader |
|
from Pytorch_MNIST图片识别.model import Net |
|
import matplotlib.pyplot as plt |
|
import os |
|
|
|
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" |
|
|
|
|
|
n_epochs = 3 |
|
|
|
|
|
batch_size_train = 64 |
|
batch_size_test = 1000 |
|
|
|
|
|
learning_rate = 0.01 |
|
momentum = 0.5 |
|
|
|
log_interval = 10 |
|
random_seed = 1 |
|
torch.manual_seed(random_seed) |
|
|
|
|
|
train_loader = torch.utils.data.DataLoader( |
|
torchvision.datasets.MNIST('./data/', train=True, download=True, |
|
transform=torchvision.transforms.Compose([ |
|
|
|
torchvision.transforms.ToTensor(), |
|
|
|
torchvision.transforms.Normalize( |
|
(0.1307,), (0.3081,)) |
|
])), |
|
batch_size=batch_size_train, shuffle=True) |
|
test_loader = torch.utils.data.DataLoader( |
|
torchvision.datasets.MNIST('./data/', train=False, download=True, |
|
transform=torchvision.transforms.Compose([ |
|
torchvision.transforms.ToTensor(), |
|
|
|
torchvision.transforms.Normalize( |
|
(0.1307,), (0.3081,)) |
|
])), |
|
batch_size=batch_size_test, shuffle=False) |
|
|
|
|
|
network = Net() |
|
optimizer = optim.SGD(network.parameters(), lr=learning_rate, momentum=momentum) |
|
|
|
train_losses = [] |
|
train_counter = [] |
|
test_losses = [] |
|
test_counter = [i * len(train_loader.dataset) for i in range(n_epochs + 1)] |
|
|
|
|
|
|
|
model_path = './model1/model.pth' |
|
optimizer_path = './model1/optimizer.pth' |
|
|
|
|
|
def train(epoch): |
|
network.train() |
|
for batch_idx, (data, target) in enumerate(train_loader): |
|
|
|
optimizer.zero_grad() |
|
output = network(data) |
|
loss = F.nll_loss(output, target) |
|
loss.backward() |
|
optimizer.step() |
|
if batch_idx % log_interval == 0: |
|
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( |
|
epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item())) |
|
train_losses.append(loss.item()) |
|
train_counter.append( |
|
(batch_idx * 64) + ((epoch - 1) * len(train_loader.dataset))) |
|
if epoch == (n_epochs - 1): |
|
|
|
torch.save(network.state_dict(), model_path) |
|
torch.save(optimizer.state_dict(), optimizer_path) |
|
|
|
|
|
def test(): |
|
network.eval() |
|
test_loss = 0 |
|
correct = 0 |
|
with torch.no_grad(): |
|
for data, target in test_loader: |
|
output = network(data) |
|
test_loss += F.nll_loss(output, target, size_average=False).item() |
|
pred = output.data.max(1, keepdim=True)[1] |
|
correct += pred.eq(target.data.view_as(pred)).sum() |
|
test_loss /= len(test_loader.dataset) |
|
test_losses.append(test_loss) |
|
print('\nTest set: Avg. loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format( |
|
test_loss, correct, len(test_loader.dataset), |
|
100. * correct / len(test_loader.dataset))) |
|
|
|
|
|
for epoch in range(1, n_epochs + 1): |
|
train(epoch) |
|
test() |
|
|
|
fig = plt.figure() |
|
plt.plot(train_counter, train_losses, color='blue') |
|
print(len(test_counter)) |
|
print(len(test_losses)) |
|
plt.scatter(test_counter, test_losses, color='red') |
|
plt.legend(['Train Loss', 'Test Loss'], loc='upper right') |
|
plt.xlabel('number of training examples seen') |
|
plt.ylabel('negative log likelihood loss') |
|
plt.show() |
|
|