pytorch task7 手写数字识别

用PyTorch完成手写数字识别

import torch
import torch.utils as utils
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
import torch.optim as optim

from torchvision import datasets, transforms

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 = utils.data.DataLoader(dataset=train_dataset,
                                     batch_size=batch_size,
                                     shuffle=True)

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

import matplotlib.pyplot as plt

# % matplotlib inline
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 LeNetS(nn.Module):
    def __init__(self):
        super(LeNetS, 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_featrues(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)

    def num_flat_features(self, x):
        size = x.size()[1:]
        num_featrues = 1
        for s in size:
            num_featrues *= s
        return num_featrues


model = LeNetS()

optimizer = 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 % 10 == 0:
            Loss.append(loss.data[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[0]
            ))
        return loss.data[0]


def test():
    model.eval()
    test_loss = 0
    correct = 0

    for data, target in test_loader:
        data, target = Variable(data, volatile=True), Variable(target)
        output = model(data)
        test_loss += criterion(output, target).data[0]
        pred = output.data.max(1, keepdim=True)[1]
        correct += pred.eq(target.data.view_as(pred)).cpu().sum()

    test_loss /= len(test_loader.dataset)
    print('\nTest set :Average loss:{:.4f},Accuracy:{}/{}({:.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()

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个开源的机器学习框架,可以用于构建深度学习模型。数字识别是一个常见的机器学习任务,可以使用PyTorch来实现。 首先,你需要准备训练和测试数据集。在PyTorch中,可以使用TorchVision库来加载和预处理数据。通过使用TorchVision的transforms模块,你可以对图像进行各种处理,比如转换为张量、裁剪或标准化。\[1\] 接下来,你可以使用TorchVision提供的MNIST数据集,它包含了大量的数字图像和对应的标签。你可以使用torchvision.datasets.MNIST来加载数据集,并使用transforms.Compose来组合多个数据处理操作。\[3\] 然后,你可以定义一个神经网络模型来进行数字识别。你可以使用PyTorch的torch.nn模块来构建模型。可以选择使用卷积神经网络(CNN)来提取图像特征,并使用全连接层进行分类。你可以定义一个继承自torch.nn.Module的类,并在其中定义模型的结构和前向传播方法。 在训练过程中,你可以使用PyTorch的torch.optim模块来选择优化算法,并使用torch.nn模块中的损失函数来计算模型的损失。通过迭代训练数据集,不断调整模型的参数,使得模型能够更好地预测数字。 最后,你可以使用训练好的模型对测试数据进行预测,并评估模型的性能。可以使用torch.utils.data.DataLoader来加载测试数据集,并使用模型的forward方法来进行预测。可以使用准确率等指标来评估模型的性能。 综上所述,你可以使用PyTorch来实现数字识别任务。通过加载和预处理数据集,定义模型结构,选择优化算法和损失函数,迭代训练数据集,最终得到一个能够准确预测数字的模型。 #### 引用[.reference_title] - *1* *2* [使用Pytorch实现数字识别](https://blog.csdn.net/Jennifer_Love_Frank/article/details/120162483)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [用PyTorch实现MNIST数字识别(非常详细)](https://blog.csdn.net/sxf1061700625/article/details/105870851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值