Mnist手写数字

运行实现:

python 复制代码
import torch
from torch.utils.data import DataLoader
from torchvision import transforms
from torchvision.datasets import MNIST
import matplotlib.pyplot as plt


class Net(torch.nn.Module):#net类神经网络主体

    def __init__(self):#4个全链接层
        super().__init__()
        self.fc1 = torch.nn.Linear(28*28, 64)#输入为28*28尺寸图像
        self.fc2 = torch.nn.Linear(64, 64)#中间三层都是64个节点
        self.fc3 = torch.nn.Linear(64, 64)
        self.fc4 = torch.nn.Linear(64, 10)#输出为10个数字类别
    
    def forward(self, x):#前向传播
        x = torch.nn.functional.relu(self.fc1(x))#先全连接线性计算,再套上激活函数
        x = torch.nn.functional.relu(self.fc2(x))
        x = torch.nn.functional.relu(self.fc3(x))
        x = torch.nn.functional.log_softmax(self.fc4(x), dim=1)#输出层用softmax做归一化,log_softmax是为了提高计算稳定性,套上了一个对数函数
        return x


def get_data_loader(is_train):#导入数据
    to_tensor = transforms.Compose([transforms.ToTensor()])#导入张量
    data_set = MNIST("", is_train, transform=to_tensor, download=True)#下载文件,""里面对应的是下载目录,is_train指定导入训练集还是测试集
    return DataLoader(data_set, batch_size=15, shuffle=True)#一个批次15张图片,shuffle=true说明数据是随机打乱的,返回数据加载器


def evaluate(test_data, net):#评估正确率
    n_correct = 0
    n_total = 0
    with torch.no_grad():
        for (x, y) in test_data:#取出数据
            outputs = net.forward(x.view(-1, 28*28))#计算神经网络预测值
            for i, output in enumerate(outputs):#作比较
                if torch.argmax(output) == y[i]:#argmax取最大预测概率的序号
                    n_correct += 1#累加正确的
                n_total += 1
    return n_correct / n_total


def main():

    train_data = get_data_loader(is_train=True)#训练集
    test_data = get_data_loader(is_train=False)#测试集
    net = Net()
    
    print("initial accuracy:", evaluate(test_data, net))#打印初始网络的正确率,接近0.1
    optimizer = torch.optim.Adam(net.parameters(), lr=0.001)#以下为pytorch固定写法
    for epoch in range(3):#epoch是轮次
        for (x, y) in train_data:
            net.zero_grad()#初始化
            output = net.forward(x.view(-1, 28*28))#正向传播
            loss = torch.nn.functional.nll_loss(output, y)#计算差值,null_loss对数损失函数,为了匹配前面log_softmax的对数运算
            loss.backward()#反向误差传播
            optimizer.step()#优化网络参数
        print("epoch", epoch, "accuracy:", evaluate(test_data, net))

    for (n, (x, _)) in enumerate(test_data):#抽取4张图像,显示预测结果
        if n > 3:
            break
        predict = torch.argmax(net.forward(x[0].view(-1, 28*28)))
        plt.figure(n)
        plt.imshow(x[0].view(28, 28),cmap='gray')
        plt.title("prediction: " + str(int(predict)))
    plt.show()


if __name__ == "__main__":
    main()

中间可能会报错误:(libiomp5md.dll问题)

python 复制代码
OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.

这个处理就是在anaconda文件夹下面搜索libiomp5md.dll,那bin下面的 libiomp5md.dll文件全部修改命名,就像我这样,两个bin文件夹下面的都改了。

运行结果:

两轮精确度如下:

4个数字预测图片如下:

相关推荐
jinanwuhuaguo3 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
AI人工智能+4 小时前
一种以深度学习与计算机视觉技术为核心的表格识别系统,实现了结构化、半结构化表格的精准文字提取、布局解析与版面完整还原
深度学习·计算机视觉·ocr·表格识别
AI视觉网奇4 小时前
几何数据集 多模态
人工智能·深度学习
Dfreedom.7 小时前
【实战篇】图像分割-计算图中不同颜色区域的面积比
图像处理·人工智能·深度学习·计算机视觉·图像分割·otsu
计算机毕业设计指导7 小时前
基于机器学习和深度学习的恶意WebURL检测系统实战详解
人工智能·深度学习·机器学习·网络安全
罗西的思考7 小时前
【OpenClaw】通过 Nanobot 源码学习架构---(6)Skills
人工智能·深度学习·算法
乐园游梦记8 小时前
机器学习:监督学习与无监督学习由浅入深全解析
人工智能·深度学习·学习·机器学习
LDG_AGI8 小时前
【搜索引擎】Elasticsearch(二):基于function_score的搜索排序
数据库·人工智能·深度学习·elasticsearch·机器学习·搜索引擎·推荐算法
这张生成的图像能检测吗8 小时前
(论文速读)UWDET:基于物联网的资源有限水下目标探测训练增强
人工智能·深度学习·物联网·目标检测·计算机视觉·水下目标检测
小超同学你好8 小时前
Transformer 24. Gemma 2 架构详解:交替局部/全局注意力、GQA、双层 RMSNorm 与 Logit Soft-Capping
人工智能·深度学习·transformer