3295|0

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

#AI挑战营第一站#手写数字MNIST识别实验记录 [复制链接]

本帖最后由 undo110 于 2024-4-13 00:57 编辑

因为需要使用到MNIST中手写数字的数据集,而该数据集中每张图片的大小为28x28,所以需要输入数据的维度需要设置为784。同时,我们需要识别的数字为0~9,需将输出层设为10个。应题目要求,中间层神经元数量设为15。

MNIST数据集,选择直接从pytorch包中所带的dataset数据集中导入。将数据集分为训练和测试两部分。在训练过程中,需要加入BP算法来对调整网络的权重。而,在测试过程中,则不再需要反向传播。

使用pytorch包来构建三层神经网络,使用的是ReLU激活函数,交叉熵损失函数。

同时基于个人电脑配置,将设置迭代训练次数为10次,同时精确度也已经得到很好的收敛。

  • 代码实现

from torchvision.datasets import mnist
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torch import nn
import torch.optim as optim

meta_size = 70  # 限定每次从数据集中取出数量,为70
epoches = 10
lr = 0.01       # 设置超参数学习率为0.01
momentum = 0.5

# 数据 预处理Compose方法即是将两个操作合并一起
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize([0.1307], [0.3081])])
# 下载数据集
train_dataset = mnist.MNIST('mnist', train=True, transform=transform, download=True)
# 非训练集,train参数设为False
test_dataset = mnist.MNIST('mnist', train=False, transform=transform, download=True)

# dataloader是可迭代对象,迭代取出大小meta-size
train_loader = DataLoader(train_dataset, batch_size=meta_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=meta_size, shuffle=False)


# 定义三层神经网络

# 因为需要使用到MNIST中手写数字的数据集,而该数据集中每张图片的大小为# 28x28,所以需要输入数据的维度需要设置为784。同时,我们需要识别的数     # 字为0~9,需将输出层设为10个。应题目要求,中间层神经元数量设为15。


class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.layer1 = nn.Sequential(nn.Linear(784, 784), nn.ReLU(True))  #使用ReLU激活函数
        self.layer2 = nn.Sequential(nn.Linear(784, 15), nn.ReLU(True))
        self.layer3 = nn.Linear(15, 10)

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x


model = Net()

# 定义模型训练中用到的损失函数和优化器
criterion = nn.CrossEntropyLoss()  # 交叉熵损失函数
optimizer = optim.SGD(model.parameters(), lr=lr, momentum=momentum)

train_losses = []  # 记录训练集损失
train_acces = []  # 用于收集训练集准确率
test_losses = []  # 收集测试集损失
test_acces = []  # 收集每次测试集准确率

for epoch in range(epoches):
    train_loss = 0
    train_acc = 0
    model.train()  # model的训练过程
    for img, label in train_loader:
        img = img.view(img.size(0), -1)  # 把输入图像转化为2维
        # 前向传播
        out = model(img)
        loss = criterion(out, label)
        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        train_loss += loss.item()  # 所有批次损失的和
        # 计算分类的准确率
        _, pred = out.max(1)
        num_correct = (pred == label).sum().item()
        acc = num_correct / img.shape[0]  # 每一批样本的准确率
        train_acc += acc

    train_losses.append(train_loss / len(train_loader))  # 所有样本平均损失
    train_acces.append(train_acc / len(train_loader))  # 所有样本的平均准确率
    # 测试
    test_loss = 0
    test_acc = 0
    # 将模型改为预测模式

# 在训练过程中,需要加入BP算法来对调整网络的权重。而,在测试过程   # 中,则不再需要反向传播。


    model.eval()
    for img, label in test_loader:
        img = img.view(img.size(0), -1)
        out = model(img)
        loss = criterion(out, label)
        test_loss += loss.item()
        _, pred = out.max(1)
        num_correct = (pred == label).sum().item()
        acc = num_correct / img.shape[0]
        test_acc += acc

    test_losses.append(test_loss / len(test_loader))
    test_acces.append(test_acc / len(test_loader))

    print('轮次: {}, 训练损失: {:.4f}, 训练准确率: {:.4f}, 测试损失: {:.4f}, 测试准确率: {:.4f}'
          .format(epoch, train_loss / len(train_loader), train_acc / len(train_loader),
                  test_loss / len(test_loader), test_acc / len(test_loader)))

 

 

  • 实验结果

   

导出文件:

 

my_model.onnx

2.39 MB, 下载次数: 3

导出文件

my_model.pth

2.4 MB, 下载次数: 0

导出文件

点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表