【龙良曲博士】深度学习与PyTorch-lesson5-手写数字问题

该代码示例展示了如何使用PyTorch构建一个简单的神经网络来训练MNIST手写数字识别数据集,包括网络结构定义、数据加载、损失函数计算、反向传播和优化器设置。经过3个epoch的训练后,计算并输出了模型的准确率。
摘要由CSDN通过智能技术生成
import torch
from torch import nn
from torch.nn import functional as F
from torch import optim
import torchvision
from matplotlib import pyplot as plt

from utils import plot_image, plot_curve, one_hot


class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()

        self.fc1 = nn.Linear(28 * 28, 256)  # 输入和输出 输出一般看情况
        self.fc2 = nn.Linear(256, 64)
        self.fc3 = nn.Linear(64, 10)

    def forward(self, x):
        x = F.relu(self.fc1(x))  # rel xw1+b1
        x = F.relu(self.fc2(x))

        x = self.fc3(x)  # 第三次没用rel

        return x


batch_size = 512

test_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('mnist_data/', train=False, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size, shuffle=False)  ##随机打散数据

train_loader = torch.utils.data.DataLoader(
    torchvision.datasets.MNIST('mnist_data', train=True, download=True,
                               transform=torchvision.transforms.Compose([
                                   torchvision.transforms.ToTensor(),
                                   torchvision.transforms.Normalize(
                                       (0.1307,), (0.3081,))
                               ])),
    batch_size=batch_size, shuffle=True)  ##随机打散数据
# 问题出在上方代码,normalize要在totensor之后才行
x, y = next(iter(train_loader))
print(x.shape, y.shape, x.min())
plot_image(x, y, 'image sample') #真实图

net = Net()
optimeizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)  # paramters指的w和b等参数
train_loss = []
for epoch in range(3):

    for batch_idx, (x, y) in enumerate(train_loader):
        # print(x.shape,y.shape)
        x = x.view(x.size(0), 28 * 28)  # 降维到2维
        out = net(x)
        y_onehot = one_hot(y)  # 真实值
        loss = F.mse_loss(out, y_onehot)  # 均方差
        optimeizer.zero_grad()  # 清零梯度
        loss.backward()  # 计算梯度
        optimeizer.step()  # 更新梯度

        train_loss.append(loss.item())  #

        if batch_idx % 100 == 0:
            print(epoch, batch_idx, loss.item())

plot_curve(train_loss)  # 损失函数图

total_correct = 0
for x, y in test_loader:
    x = x.view(x.size(0), 28 * 28)  # 降维到2维
    out = net(x)
    pred = out.argmax(dim=1)
    correct = pred.eq(y).sum().float().item()  # tensor类型
    total_correct += correct

total_num = len(test_loader.dataset)
acc = total_correct / total_num
print(acc)  # 准确率

x, y = next(iter(test_loader))
out = net(x.view(x.size(0), 28 * 28))
pred = out.argmax(dim=1)
plot_image(x,pred,'test') #预测的

效果图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值