Path: blob/master/CNN/lab-10-3-mnist_nn_xavier.py
618 views
# Lab 10 MNIST and softmax1import torch2import torchvision.datasets as dsets3import torchvision.transforms as transforms4import random56device = 'cuda' if torch.cuda.is_available() else 'cpu'78# for reproducibility9random.seed(777)10torch.manual_seed(777)11if device == 'cuda':12torch.cuda.manual_seed_all(777)1314# parameters15learning_rate = 0.00116training_epochs = 1517batch_size = 1001819# MNIST dataset20mnist_train = dsets.MNIST(root='MNIST_data/',21train=True,22transform=transforms.ToTensor(),23download=True)2425mnist_test = dsets.MNIST(root='MNIST_data/',26train=False,27transform=transforms.ToTensor(),28download=True)2930# dataset loader31data_loader = torch.utils.data.DataLoader(dataset=mnist_train,32batch_size=batch_size,33shuffle=True,34drop_last=True)3536# nn layers37linear1 = torch.nn.Linear(784, 256, bias=True)38linear2 = torch.nn.Linear(256, 256, bias=True)39linear3 = torch.nn.Linear(256, 10, bias=True)40relu = torch.nn.ReLU()4142# xavier initialization43torch.nn.init.xavier_uniform_(linear1.weight)44torch.nn.init.xavier_uniform_(linear2.weight)45torch.nn.init.xavier_uniform_(linear3.weight)4647# model48model = torch.nn.Sequential(linear1, relu, linear2, relu, linear3).to(device)4950# define cost/loss & optimizer51criterion = torch.nn.CrossEntropyLoss().to(device) # Softmax is internally computed.52optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)5354total_batch = len(data_loader)55for epoch in range(training_epochs):56avg_cost = 05758for X, Y in data_loader:59# reshape input image into [batch_size by 784]60# label is not one-hot encoded61X = X.view(-1, 28 * 28).to(device)62Y = Y.to(device)6364optimizer.zero_grad()65hypothesis = model(X)66cost = criterion(hypothesis, Y)67cost.backward()68optimizer.step()6970avg_cost += cost / total_batch7172print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))7374print('Learning finished')7576# Test the model using test sets77with torch.no_grad():78X_test = mnist_test.test_data.view(-1, 28 * 28).float().to(device)79Y_test = mnist_test.test_labels.to(device)8081prediction = model(X_test)82correct_prediction = torch.argmax(prediction, 1) == Y_test83accuracy = correct_prediction.float().mean()84print('Accuracy:', accuracy.item())8586# Get one and predict87r = random.randint(0, len(mnist_test) - 1)88X_single_data = mnist_test.test_data[r:r + 1].view(-1, 28 * 28).float().to(device)89Y_single_data = mnist_test.test_labels[r:r + 1].to(device)9091print('Label: ', Y_single_data.item())92single_prediction = model(X_single_data)93print('Prediction: ', torch.argmax(single_prediction, 1).item())9495