PyTorch基础练习-task7(用PyTorch完成手写数字识别)

PyTorch基础练习-task7

# task7
import torch
import numpy as np
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import matplotlib.pyplot as plt
%matplotlib inline

# 准备数据
batch_size = 64
train_dataset = datasets.MNIST(root = './data/',
                               train = True,
                               transform = transforms.ToTensor(),
                               download = True)

test_dataset = datasets.MNIST(root = './data/',
                              train = False,
                              transform = transforms.ToTensor())

train_loader = torch.utils.data.DataLoader(dataset = train_dataset,
                                           batch_size = batch_size,
                                           shuffle = True)

test_loader = torch.utils.data.DataLoader(dataset = test_dataset,
                                          batch_size = batch_size,
                                          shuffle = False)

# 可视化数据图像
for i in range(5):
    plt.figure()
    plt.imshow(train_loader.dataset.train_data[i].numpy())
    
x = torch.randn(2, 2, 2)
x.view(-1, 1, 4)   
    

# 创建类
class LeNet5(nn.Module):
    def __init__(self):
        super(LeNet5, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 5, padding = 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)
    
    def forward(self, x):
        x = F.max_pool2d(F.tanh(self.conv1(x)), (2, 2))
        x = F.dropout(x, p = 0.3, training = self.training)
        x = F.max_pool2d(F.tanh(self.conv2(x)), (2, 2))
        x = F.dropout(x, p = 0.3, training = self.training)
        x = x.view(-1, self.num_flat_features(x))
        x = F.tanh(self.fc1(x))
        x = F.dropout(x, p = 0.3, training = self.training)
        x = F.tanh(self.fc2(x))
        x = F.dropout(x, p = 0.3, training = self.training)
        x = self.fc3(x)
        return x
    
    def num_flat_features(self, x):
        """进行形状变换"""
        size = x.size()[1:]
        num_features = 1
        for s in size:
            num_features *= s
        return num_features
    
# 实例化    
model = LeNet5()

# 优化器
optimizer = torch.optim.SGD(model.parameters(), lr = 0.1, momentum = 0.9)
criterion = nn.CrossEntropyLoss()

for (data, target) in train_loader:
    for i in range(4):
        plt.figure()
        print(target[i])
        plt.imshow(data[i].numpy()[0])
        
    break

def train(epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = Variable(data), Variable(target) 
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % 50 == 0:
            print('Train Epoch:{} [{}/{} ({:.0f}%)]\tLoss:{:.6f}'.format(
                    epoch, batch_idx * len(data), len(train_loader.dataset),
                    100. * batch_idx / len(train_loader), loss.data))
    return loss.data

def test():
    model.eval()
    test_loss = 0
    correct = 0
    for data, target in test_loader:
        data, target = Variable(data), Variable(target)
        output = model(data)
        test_loss += criterion(output, target).data
        pred = output.data.max(1, keepdim = True)[1]
        correct += pred.eq(target.data.view_as(pred).sum())
        test_loss /= len(test_loader.dataset)           
                
    print('\nTest set:Average loss:{:.4f}, Auccracy:{}/{}({:.0f}%)\n'.format(
            test_loss, correct, len(test_loader.dataset),
            100. * correct / len(test_loader.dataset)))


Loss = []
for epoch in range(60):
    loss = train(epoch)
    Loss.append(loss)
    test()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值