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

听说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的方法)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • pytorch 使用单个GPU与多个GPU进行训练与测试的方法

    如下所示: device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")#第一行代码 model.to(device)#第二行代码 首先是上面两行代码放在读取数据之前. mytensor = my_tensor.to(device)#第三行代码 然后是第三行代码.这句代码的意思是将所有最开始读取数据时的tersor变量copy一份到device所指定的GPU上去,之后的运算都在GPU上

  • 详解PyTorch手写数字识别(MNIST数据集)

    MNIST 手写数字识别是一个比较简单的入门项目,相当于深度学习中的 Hello World,可以让我们快速了解构建神经网络的大致过程.虽然网上的案例比较多,但还是要自己实现一遍.代码采用 PyTorch 1.0 编写并运行. 导入相关库 import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, t

  • pytorch使用指定GPU训练的实例

    本文适合多GPU的机器,并且每个用户需要单独使用GPU训练. 虽然pytorch提供了指定gpu的几种方式,但是使用不当的话会遇到out of memory的问题,主要是因为pytorch会在第0块gpu上初始化,并且会占用一定空间的显存.这种情况下,经常会出现指定的gpu明明是空闲的,但是因为第0块gpu被占满而无法运行,一直报out of memory错误. 解决方案如下: 指定环境变量,屏蔽第0块gpu CUDA_VISIBLE_DEVICES = 1 main.py 这句话表示只有第1块

  • pytorch + visdom CNN处理自建图片数据集的方法

    环境 系统:win10 cpu:i7-6700HQ gpu:gtx965m python : 3.6 pytorch :0.3 数据下载 来源自Sasank Chilamkurthy 的教程: 数据:下载链接. 下载后解压放到项目根目录: 数据集为用来分类 蚂蚁和蜜蜂.有大约120个训练图像,每个类有75个验证图像. 数据导入 可以使用 torchvision.datasets.ImageFolder(root,transforms) 模块 可以将 图片转换为 tensor. 先定义transf

  • PyTorch CNN实战之MNIST手写数字识别示例

    简介 卷积神经网络(Convolutional Neural Network, CNN)是深度学习技术中极具代表的网络结构之一,在图像处理领域取得了很大的成功,在国际标准的ImageNet数据集上,许多成功的模型都是基于CNN的. 卷积神经网络CNN的结构一般包含这几个层: 输入层:用于数据的输入 卷积层:使用卷积核进行特征提取和特征映射 激励层:由于卷积也是一种线性运算,因此需要增加非线性映射 池化层:进行下采样,对特征图稀疏处理,减少数据运算量. 全连接层:通常在CNN的尾部进行重新拟合,减

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

    听说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 tor

  • pytorch GAN伪造手写体mnist数据集方式

    一,mnist数据集 形如上图的数字手写体就是mnist数据集. 二,GAN原理(生成对抗网络) GAN网络一共由两部分组成:一个是伪造器(Generator,简称G),一个是判别器(Discrimniator,简称D) 一开始,G由服从某几个分布(如高斯分布)的噪音组成,生成的图片不断送给D判断是否正确,直到G生成的图片连D都判断以为是真的.D每一轮除了看过G生成的假图片以外,还要见数据集中的真图片,以前者和后者得到的损失函数值为依据更新D网络中的权值.因此G和D都在不停地更新权值.以下图为例

  • tensorflow使用CNN分析mnist手写体数字数据集

    本文实例为大家分享了tensorflow使用CNN分析mnist手写体数字数据集,供大家参考,具体内容如下 import tensorflow as tf import numpy as np import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_da

  • 人工智能学习pyTorch自建数据集及可视化结果实现过程

    目录 一.自定义数据集 1.文件夹映射 2.图片对应标签 3.训练及测试数据分割 4.数据处理 二.ResNet处理 三.训练及可视化 1.数据集导入 2.测试函数 3.训练过程及可视化 一.自定义数据集 现有数据如下: 5个文件夹,每个文件夹是神奇宝贝的一种. 每个图片形状.大小.格式不一. 我们训练CNN的时候需要的是tensor类型的数据,因此需要将所有的图片进行下列转换: 1.对文件夹编号,进行映射,比如妙蛙种子文件夹编号0,皮卡丘编号1等. 2.对文件夹中所有图片,进行编号的对应,这个

  • Pytorch 神经网络—自定义数据集上实现教程

    第一步.导入需要的包 import os import scipy.io as sio import numpy as np import torch import torch.nn as nn import torch.backends.cudnn as cudnn import torch.optim as optim from torch.utils.data import Dataset, DataLoader from torchvision import transforms, ut

  • 使用PyTorch训练一个图像分类器实例

    如下所示: import torch import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as np print("torch: %s" % torch.__version__) print("tortorchvisionch: %s" % torchvision.__version__) print(&

  • pytorch实现CNN卷积神经网络

    本文为大家讲解了pytorch实现CNN卷积神经网络,供大家参考,具体内容如下 我对卷积神经网络的一些认识 卷积神经网络是时下最为流行的一种深度学习网络,由于其具有局部感受野等特性,让其与人眼识别图像具有相似性,因此被广泛应用于图像识别中,本人是研究机械故障诊断方面的,一般利用旋转机械的振动信号作为数据. 对一维信号,通常采取的方法有两种,第一,直接对其做一维卷积,第二,反映到时频图像上,这就变成了图像识别,此前一直都在利用keras搭建网络,最近学了pytroch搭建cnn的方法,进行一下代码

  • Pytorch 使用CNN图像分类的实现

    需求 在4*4的图片中,比较外围黑色像素点和内圈黑色像素点个数的大小将图片分类 如上图图片外围黑色像素点5个大于内圈黑色像素点1个分为0类反之1类 想法 通过numpy.PIL构造4*4的图像数据集 构造自己的数据集类 读取数据集对数据集选取减少偏斜 cnn设计因为特征少,直接1*1卷积层 或者在4*4外围添加padding成6*6,设计2*2的卷积核得出3*3再接上全连接层 代码 import torch import torchvision import torchvision.transf

  • 基于TensorFlow的CNN实现Mnist手写数字识别

    本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下 一.CNN模型结构 输入层:Mnist数据集(28*28) 第一层卷积:感受视野5*5,步长为1,卷积核:32个 第一层池化:池化视野2*2,步长为2 第二层卷积:感受视野5*5,步长为1,卷积核:64个 第二层池化:池化视野2*2,步长为2 全连接层:设置1024个神经元 输出层:0~9十个数字类别 二.代码实现 import tensorflow as tf #Tensorfl

  • tensorflow基于CNN实战mnist手写识别(小白必看)

    很荣幸您能看到这篇文章,相信通过标题打开这篇文章的都是对tensorflow感兴趣的,特别是对卷积神经网络在mnist手写识别这个实例感兴趣.不管你是什么基础,我相信,你在看完这篇文章后,都能够完全理解这个实例.这对于神经网络入门的小白来说,简直是再好不过了. 通过这篇文章,你能够学习到 tensorflow一些方法的用法 mnist数据集的使用方法以及下载 CNN卷积神经网络具体python代码实现 CNN卷积神经网络原理 模型训练.模型的保存和载入 Tensorflow实战mnist手写数字

随机推荐