我学Pytorch之三~~~Pytorch最简单的MINIST数据实现

import torch
from torch import nn,optim
import random
import numpy as np
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import os
input_size=28*28
num_classes=10
learnning_rate=0.001
num_epochs=5
batch_size=100

#1、准备数据
#训练数据
train_data=torchvision.datasets.MNIST(root='../../data',
                                        train=True,
                                        transform=transforms.ToTensor(),
                                        download=True)

#创建训练数据迭代器
train_loader=torch.utils.data.DataLoader(dataset=train_data,
                                        batch_size=batch_size,
                                        shuffle=True)

#测试数据
test_data=torchvision.datasets.MNIST(root='../../data',
                                        train=False,
                                        transform=transforms.ToTensor(),
                                        download=True)

#测试数据迭代器(我这个是一次加载完)
test_loader=torch.utils.data.DataLoader(dataset=test_data,
                                        batch_size=len(test_data))

is_loadmodel=0      #是否加载已有模型

if is_loadmodel==0:
    #2、建立模型
    model=nn.Linear(input_size,num_classes)
    criterion=nn.CrossEntropyLoss()     #损失函数
    optimizer=optim.SGD(model.parameters(),lr=learnning_rate)   #优化器
    
    print("w:",model.weight)
    print('b:',model.bias)

    #3、训练模型

    total_steps=len(train_loader)
    for epoch in range(num_epochs):
        for i,(images,labels) in enumerate(train_loader):
            images=torch.reshape(images,shape=(-1,input_size))    #重组图像矩阵
            outputs=model(images)    #输出
            loss=criterion(outputs,labels)  #损失

            optimizer.zero_grad()    #梯度置零
            loss.backward()     #反向求导数
            optimizer.step()    #更新模型参数

            if (i+1)%100==0:
                print('epochs:{}/{},steps:{}/{}'.format(epoch+1,num_epochs,
                i+1,total_steps))
    
    torch.save(model,'model.ckpt')
    torch.save(model.state_dict(),'model_dict.ckpt')
else:
    model=torch.load('model.ckpt')

#4、测试模型
total_test=len(test_data)

with torch.no_grad():
    for images,labels in test_loader:
        images=torch.reshape(images,shape=(-1,input_size))
        outputs=model(images)
        _,predit=torch.max(outputs,1)
        correct=(predit==labels).sum()

    print('Accuracy:',correct.detach().numpy()/total_test)

#5、可视化

#显示前20个数据
for i in range(0,20,5):
    s_index=150
    for index in range(5):
        image,label=test_data[i+index]
        image=torch.squeeze(image,0)
        s_index+=1
        plt.subplot(s_index)
        plt.imshow(image)
        plt.text(0,-1,'label={}'.format(label))
    
    plt.show()



在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GIS从业者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值