用Pytorch训练CNN(数据集MNIST,使用GPU的方法)


Posted in Python onAugust 19, 2019

听说pytorch使用比TensorFlow简单,加之pytorch现已支持windows,所以今天装了pytorch玩玩,第一件事还是写了个简单的CNN在MNIST上实验,初步体验的确比TensorFlow方便。

参考代码(在莫烦python的教程代码基础上修改)如下:

import torch 
import torch.nn as nn 
from torch.autograd import Variable 
import torch.utils.data as Data 
import torchvision 
import time
#import matplotlib.pyplot as plt 
 
torch.manual_seed(1) 
 
EPOCH = 1 
BATCH_SIZE = 50 
LR = 0.001 
DOWNLOAD_MNIST = False 
if_use_gpu = 1
 
# 获取训练集dataset 
training_data = torchvision.datasets.MNIST( 
       root='./mnist/', # dataset存储路径 
       train=True, # True表示是train训练集,False表示test测试集 
       transform=torchvision.transforms.ToTensor(), # 将原数据规范化到(0,1)区间 
       download=DOWNLOAD_MNIST, 
       ) 
 
# 打印MNIST数据集的训练集及测试集的尺寸 
print(training_data.train_data.size()) 
print(training_data.train_labels.size()) 
# torch.Size([60000, 28, 28]) 
# torch.Size([60000]) 
 
#plt.imshow(training_data.train_data[0].numpy(), cmap='gray') 
#plt.title('%i' % training_data.train_labels[0]) 
#plt.show() 
 
# 通过torchvision.datasets获取的dataset格式可直接可置于DataLoader 
train_loader = Data.DataLoader(dataset=training_data, batch_size=BATCH_SIZE, 
                shuffle=True) 
 
# 获取测试集dataset 

test_data = torchvision.datasets.MNIST( 
       root='./mnist/', # dataset存储路径 
       train=False, # True表示是train训练集,False表示test测试集 
       transform=torchvision.transforms.ToTensor(), # 将原数据规范化到(0,1)区间 
       download=DOWNLOAD_MNIST, 
       ) 
# 取前全部10000个测试集样本 
test_x = Variable(torch.unsqueeze(test_data.test_data, dim=1).float(), requires_grad=False)
#test_x = test_x.cuda()
## (~, 28, 28) to (~, 1, 28, 28), in range(0,1) 
test_y = test_data.test_labels
#test_y = test_y.cuda() 
class CNN(nn.Module): 
  def __init__(self): 
    super(CNN, self).__init__() 
    self.conv1 = nn.Sequential( # (1,28,28) 
           nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, 
                stride=1, padding=2), # (16,28,28) 
    # 想要con2d卷积出来的图片尺寸没有变化, padding=(kernel_size-1)/2 
           nn.ReLU(), 
           nn.MaxPool2d(kernel_size=2) # (16,14,14) 
           ) 
    self.conv2 = nn.Sequential( # (16,14,14) 
           nn.Conv2d(16, 32, 5, 1, 2), # (32,14,14) 
           nn.ReLU(), 
           nn.MaxPool2d(2) # (32,7,7) 
           ) 
    self.out = nn.Linear(32*7*7, 10) 
 
  def forward(self, x): 
    x = self.conv1(x) 
    x = self.conv2(x) 
    x = x.view(x.size(0), -1) # 将(batch,32,7,7)展平为(batch,32*7*7) 
    output = self.out(x) 
    return output 
 
cnn = CNN() 
if if_use_gpu:
  cnn = cnn.cuda()

optimizer = torch.optim.Adam(cnn.parameters(), lr=LR) 
loss_function = nn.CrossEntropyLoss() 
 


for epoch in range(EPOCH): 
  start = time.time() 
  for step, (x, y) in enumerate(train_loader): 
    b_x = Variable(x, requires_grad=False) 
    b_y = Variable(y, requires_grad=False) 
    if if_use_gpu:
      b_x = b_x.cuda()
      b_y = b_y.cuda()
 
    output = cnn(b_x) 
    loss = loss_function(output, b_y) 
    optimizer.zero_grad() 
    loss.backward() 
    optimizer.step() 
 
    if step % 100 == 0: 
      print('Epoch:', epoch, '|Step:', step, 
         '|train loss:%.4f'%loss.data[0]) 
  duration = time.time() - start 
  print('Training duation: %.4f'%duration)
  
cnn = cnn.cpu()
test_output = cnn(test_x) 
pred_y = torch.max(test_output, 1)[1].data.squeeze()
accuracy = sum(pred_y == test_y) / test_y.size(0) 
print('Test Acc: %.4f'%accuracy)

以上这篇用Pytorch训练CNN(数据集MNIST,使用GPU的方法)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获得两个数组交集、并集、差集的方法
Mar 27 Python
Python中的异常处理简明介绍
Apr 13 Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
Python字典及字典基本操作方法详解
Jan 30 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
python输出数学符号实例
May 11 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
Python如何实现远程方法调用
Aug 07 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 Python
python opencv实现证件照换底功能
Aug 19 #Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
Aug 19 #Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 #Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 #Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 #Python
pytorch使用指定GPU训练的实例
Aug 19 #Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 #Python
You might like
php cookie的操作实现代码(登录)
2010/12/29 PHP
php Smarty 字符比较代码
2011/02/27 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
浅析Apache中RewriteCond规则参数的详细介绍
2013/06/30 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
PHP数据的提交与过滤基本操作实例详解
2016/11/11 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
详解php协程知识点
2018/09/21 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
jquery 多个radio的click事件实例
2016/12/03 Javascript
微信小程序报错:this.setData is not a function的解决办法
2017/09/27 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
Vue全局loading及错误提示的思路与实现
2019/08/09 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
python多维数组切片方法
2018/04/13 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
python 调用Google翻译接口的方法
2020/12/09 Python
创业资金计划书
2014/02/06 职场文书
《长城》教学反思
2014/02/14 职场文书
平安建设汇报材料
2014/12/29 职场文书
学习保证书怎么写
2015/02/26 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
领导新年致辞2016
2015/07/29 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js