Pytorch框架实现mnist手写库识别(与tensorflow对比)


Posted in Python onJuly 20, 2020

前言最近在学习过程中需要用到pytorch框架,简单学习了一下,写了一个简单的案例,记录一下pytorch中搭建一个识别网络基础的东西。对应一位博主写的tensorflow的识别mnist数据集,将其改为pytorch框架,也可以详细看到两个框架大体的区别。

Tensorflow版本转载来源(CSDN博主「兔八哥1024」):https://3water.com/article/191157.htm

Pytorch实战mnist手写数字识别

#需要导入的包
import torch
import torch.nn as nn#用于构建网络层
import torch.optim as optim#导入优化器
from torch.utils.data import DataLoader#加载数据集的迭代器
from torchvision import datasets, transforms#用于加载mnsit数据集

#下载数据集

train_set = datasets.MNIST('./data', train=True, download=True,transform = transforms.Compose([
         transforms.ToTensor(),
         transforms.Normalize((0.1037,), (0.3081,))
       ]))
test_set = datasets.MNIST('./data', train=False, download=True,transform = transforms.Compose([
         transforms.ToTensor(),
         transforms.Normalize((0.1037,), (0.3081,))
       ]))

#构建网络(网络结构对应tensorflow的那一篇文章)

class Net(nn.Module):

  def __init__(self, num_classes=10):
    super(Net, self).__init__()
    self.features = nn.Sequential(
      nn.Conv2d(1, 32, kernel_size=5, stride=1, padding=2),
      nn.MaxPool2d(kernel_size=2,stride=2),
      nn.Conv2d(32, 64, kernel_size=5, stride=1, padding=2),
      nn.MaxPool2d(kernel_size=2,stride=2),

    )
    self.classifier = nn.Sequential(
      nn.Linear(3136, 7*7*64),
      nn.Linear(3136, num_classes),

    )

  def forward(self,x):
    x = self.features(x)
    x = torch.flatten(x, 1)
    x = self.classifier(x)

    return x
net=Net()
net.cuda()#用GPU运行

#计算误差,使用adam优化器优化误差
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), 1e-2)

train_data = DataLoader(train_set, batch_size=128, shuffle=True)
test_data = DataLoader(test_set, batch_size=128, shuffle=False)


#训练过程
for epoch in range(1):
  net.train() ##在进行训练时加上train(),测试时加上eval()
  batch = 0

  for batch_images, batch_labels in train_data:

    average_loss = 0
    train_acc = 0

    ##在pytorch0.4之后将Variable 与tensor进行合并,所以这里不需要进行Variable封装
    if torch.cuda.is_available():
      batch_images, batch_labels = batch_images.cuda(),batch_labels.cuda()

    #前向传播
    out = net(batch_images)
    loss = criterion(out,batch_labels)


    average_loss = loss
    prediction = torch.max(out,1)[1]
    # print(prediction)

    train_correct = (prediction == batch_labels).sum()
    ##这里得到的train_correct是一个longtensor型,需要转换为float

    train_acc = (train_correct.float()) / 128

    optimizer.zero_grad() #清空梯度信息,否则在每次进行反向传播时都会累加
    loss.backward() #loss反向传播
    optimizer.step() ##梯度更新

    batch+=1
    print("Epoch: %d/%d || batch:%d/%d average_loss: %.3f || train_acc: %.2f"
       %(epoch, 20, batch, float(int(50000/128)), average_loss, train_acc))

# 在测试集上检验效果
net.eval() # 将模型改为预测模式
for idx,(im1, label1) in enumerate(test_data):
  if torch.cuda.is_available():
    im, label = im1.cuda(),label1.cuda()
  out = net(im)
  loss = criterion(out, label)

  eval_loss = loss

  pred = torch.max(out,1)[1]
  num_correct = (pred == label).sum()
  acc = (num_correct.float())/ 128
  eval_acc = acc

  print('EVA_Batch:{}, Eval Loss: {:.6f}, Eval Acc: {:.6f}'
   .format(idx,eval_loss , eval_acc))

运行结果:

Pytorch框架实现mnist手写库识别(与tensorflow对比)

到此这篇关于Pytorch框架实现mnist手写库识别(与tensorflow对比)的文章就介绍到这了,更多相关Pytorch框架实现mnist手写库识别(与tensorflow对比)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
探寻python多线程ctrl+c退出问题解决方案
Oct 23 Python
Python的迭代器和生成器
Jul 29 Python
实例讲解Python编程中@property装饰器的用法
Jun 20 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 Python
python Django的web开发实例(入门)
Jul 31 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
Pygame的程序开始示例代码
May 07 Python
OpenCV+python实现实时目标检测功能
Jun 24 Python
python中time、datetime模块的使用
Dec 14 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 Python
一文搞懂python异常处理、模块与包
Jun 26 Python
python集合能干吗
Jul 19 #Python
python如何建立全零数组
Jul 19 #Python
解决python中0x80072ee2错误的方法
Jul 19 #Python
python给视频添加背景音乐并改变音量的具体方法
Jul 19 #Python
python中加背景音乐如何操作
Jul 19 #Python
python实现最短路径的实例方法
Jul 19 #Python
python等待10秒执行下一命令的方法
Jul 19 #Python
You might like
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
javascript 对象比较实现代码
2009/04/27 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
js实现在字符串中提取数字
2013/11/05 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
解决WordPress使用CDN后博文无法评论的错误
2015/12/15 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
你应该了解的JavaScript Array.map()五种用途小结
2018/11/14 Javascript
详解jQuery中的getAll()和cleanData()
2019/04/15 jQuery
详解VUE调用本地json的使用方法
2019/05/15 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
python自然语言编码转换模块codecs介绍
2015/04/08 Python
Python下载懒人图库JavaScript特效
2015/05/28 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
Python基本socket通信控制操作示例
2019/01/30 Python
详解django2中关于时间处理策略
2019/03/06 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
社会实践感言
2014/01/25 职场文书
三方合作协议书范本
2014/04/18 职场文书
我为党旗添光彩演讲稿
2014/09/10 职场文书
发布会邀请函
2015/01/31 职场文书
python和anaconda的区别
2022/05/06 Python