关于Pytorch的MNIST数据集的预处理详解


Posted in Python onJanuary 10, 2020

关于Pytorch的MNIST数据集的预处理详解

MNIST的准确率达到99.7%

用于MNIST的卷积神经网络(CNN)的实现,具有各种技术,例如数据增强,丢失,伪随机化等。

操作系统:ubuntu18.04

显卡:GTX1080ti

python版本:2.7(3.7)

网络架构

具有4层的CNN具有以下架构。

输入层:784个节点(MNIST图像大小)

第一卷积层:5x5x32

第一个最大池层

第二卷积层:5x5x64

第二个最大池层

第三个完全连接层:1024个节点

输出层:10个节点(MNIST的类数)

用于改善CNN性能的工具

采用以下技术来改善CNN的性能。

1. Data augmentation

通过以下方式将列车数据的数量增加到5倍

随机旋转:每个图像在[-15°,+ 15°]范围内随机旋转。

随机移位:每个图像在两个轴上随机移动一个范围为[-2pix,+ 2pix]的值。

零中心归一化:将像素值减去(PIXEL_DEPTH / 2)并除以PIXEL_DEPTH。

2. Parameter initializers

重量初始化器:xaiver初始化器

偏差初始值设定项:常量(零)初始值设定项

3. Batch normalization

所有卷积/完全连接的层都使用批量标准化。

4. Dropout

The third fully-connected layer employes dropout technique.

5. Exponentially decayed learning rate

A learning rate is decayed every after one-epoch.

代码部分

第一步:了解MNIST数据集

MNIST数据集是一个手写体数据集,一共60000张图片,所有的图片都是28×28的,下载数据集的地址:数据集官网。这个数据集由四部分组成,分别是:

train-images-idx3-ubyte.gz: training set images (9912422 bytes) 
train-labels-idx1-ubyte.gz: training set labels (28881 bytes) 
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes) 
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)

也就是一个训练图片集,一个训练标签集,一个测试图片集,一个测试标签集;我们可以看出这个其实并不是普通的文本文件

或是图片文件,而是一个压缩文件,下载并解压出来,我们看到的是二进制文件。

第二步:加载MNIST数据集

先引入一些库文件

import torchvision,torch
import torchvision.transforms as transforms
from torch.utils.data import Dataset, DataLoader
import matplotlib.pyplot as plt

加载MNIST数据集有很多方法:

方法一:在pytorch下可以直接调用torchvision.datasets里面的MNIST数据集(这是官方写好的数据集类)

train = torchvision.datasets.MNIST(root='./mnist/',train=True, transform= transforms.ToTensor())

返回值为一个元组(train_data,train_target)(这个类使用的时候也有坑,必须用train[i]索引才能使用 transform功能)

一般是与torch.utils.data.DataLoader配合使用

dataloader = DataLoader(train, batch_size=50,shuffle=True, num_workers=4)
for step, (x, y) in enumerate(dataloader):
 b_x = x.shape
 b_y = y.shape
 print 'Step: ', step, '| train_data的维度' ,b_x,'| train_target的维度',b_y

如图将60000张图片的数据分为1200份,每份包含50张图像,这样并行处理数据能有效加快计算速度

关于Pytorch的MNIST数据集的预处理详解

看个人喜好,本人不太喜欢这种固定的数据类,所以想要灵活多变,可以开始自己写数据集类

方法二:自己设置数据集

使用pytorch相关类,API对数据集进行封装,pytorch中数据集相关的类位于torch.utils.data package中。

本次实验,主要使用以下类:

torch.utils.data.Dataset

torch.utils.data.DataLoader

Dataset类的使用: 所有的类都应该是此类的子类(也就是说应该继承该类)。 所有的子类都要重写(override) len(), getitem() 这两个方法。

使用到的python package

python package 目的
numpy 矩阵操作,对图像进行转置
skimage 图像处理,图像I/O,图像变换
matplotlib 图像的显示,可视化
os 一些文件查找操作
torch pytorch
torvision pytorch

导入相关的包

import numpy as np
from skimage import io
from skimage import transform
import matplotlib.pyplot as plt
import os
import torch
import torchvision
from torch.utils.data import Dataset, DataLoader
from torchvision.transforms import transforms
from PIL import Image

第一步:

定义一个子类,继承Dataset类, 重写 __len()__, __getitem()__ 方法。

细节:

1.数据集一个样本的表示:采用字典的形式sample = {'img': img, 'target': target}。

图像的读取:采用torch.load进行读取,读取之后的结果为torch.Tensor形式。

图像变换:transform参数

class MY_MNIST(Dataset):
 training_file = 'training.pt'
 test_file = 'test.pt'
 def __init__(self, root, transform=None):
  self.transform = transform
  self.data, self.targets = torch.load(root)
 def __getitem__(self, index):
  img, target = self.data[index], int(self.targets[index])
  img = Image.fromarray(img.numpy(), mode='L')

  if self.transform is not None:
   img = self.transform(img)
  img =transforms.ToTensor()(img)

  sample = {'img': img, 'target': target}
  return sample
 def __len__(self):
  return len(self.data)
  
train = MY_MNIST(root='./mnist/MNIST/processed/training.pt', transform= None)

第二步

实例化一个对象,并读取和显示数据集

for (cnt,i) in enumerate(train):
 image = i['img']
 label = i['target']
 ax = plt.subplot(4, 4, cnt+1)
 # ax.axis('off')
 ax.imshow(image.squeeze(0))
 ax.set_title(label)
 plt.pause(0.001)
 if cnt ==15:
  break

输出如下 ,这样就表明,咱们自己写的数据集读取图像,并读取之后的结果为torch.Tensor形式成功啦!

关于Pytorch的MNIST数据集的预处理详解

第三步(可选 optional)

对数据集进行变换:一般收集到的图像大小尺寸,亮度等存在差异,变换的目的就是使得数据归一化。另一方面,可以通过变换进行数据增强

关于pytorch中的变换transforms,请参考该系列之前的文章

由于数据集中样本采用字典dicts形式表示。 因此不能直接调用torchvision.transofrms中的方法。

本实验进行了旋转,随机裁剪,调节图像的色彩饱和明暗等操作。

compose = transforms.Compose([
   transforms.Resize(20),
   transforms.RandomHorizontalFlip(),
   transforms.RandomCrop(20),
   transforms.ColorJitter(brightness=1, contrast=0.1, hue=0.5),
   # transforms.ToTensor(),
   # transforms.Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])
   ])
train_transformed = MY_MNIST(root='./mnist/MNIST/processed/training.pt', transform= compose)

#显示变换后的图像
for (cnt,i) in enumerate(train_transformed):
 image = i['img']
 # print image[0].sum()
 # image = compose(image)
 print 'sdsdadfasfasfasf',type(image)
 label = i['target']
 ax = plt.subplot(4, 4, cnt+1)
 # ax.axis('off')
 ax.imshow(image.squeeze(0))
 ax.set_title(label)
 plt.pause(0.001)
 if cnt ==15:
  break

变换后的图像,和之前对比,你发现了什么不同吗?

关于Pytorch的MNIST数据集的预处理详解

第四步: 使用DataLoader进行包装

为何要使用DataLoader?

① 深度学习的输入是mini_batch形式

② 样本加载时候可能需要随机打乱顺序,shuffle操作

③ 样本加载需要采用多线程

pytorch提供的DataLoader封装了上述的功能,这样使用起来更方便。

# 使用DataLoader可以利用多线程,batch,shuffle等
trainset_dataloader = DataLoader(dataset=transformed_trainset,
         batch_size=4,
         shuffle=True,
         num_workers=4)

可视化:

dataloader = DataLoader(train, batch_size=50,shuffle=True, num_workers=4)

通过DataLoader包装之后,样本以min_batch形式输出,而且进行了随机打乱顺序。

for step, i in enumerate(dataloader):
 b_x = i['img'].shape
 b_y = i['target'].shape
 print 'Step: ', step, '| train_data的维度' ,b_x,'| train_target的维度',b_y

如图图片大小已经裁剪为20*20,而且并行处理让60000个数据在3秒内就能处理好,效率非常高

Step: 1186 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1187 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1188 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1189 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1190 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1191 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1192 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1193 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1194 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1195 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1196 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1197 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1198 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)
Step: 1199 | train_data的维度 (50, 1, 20, 20) | train_target的维度 (50,)

未完待续…

以上这篇关于Pytorch的MNIST数据集的预处理详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python程序语言快速上手教程
Jul 18 Python
Python中property属性实例解析
Feb 10 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
python中eval与int的区别浅析
Aug 11 Python
Python tkinter实现图片标注功能(完整代码)
Dec 08 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
Dec 23 Python
python实现Pyecharts实现动态地图(Map、Geo)
Mar 25 Python
python代码区分大小写吗
Jun 17 Python
简单了解如何封装自己的Python包
Jul 08 Python
详解anaconda安装步骤
Nov 23 Python
python中用ggplot绘制画图实例讲解
Jan 26 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 #Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 #Python
python ubplot使用方法解析
Jan 10 #Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
Jan 10 #Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 #Python
pytorch实现mnist分类的示例讲解
Jan 10 #Python
pytorch 准备、训练和测试自己的图片数据的方法
Jan 10 #Python
You might like
phpmyadmin3 安装配置图解教程
2012/03/29 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
JS实现的几个常用算法
2016/11/12 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
微信小程序 图片边框解决方法
2017/01/16 Javascript
Angular2入门教程之模块和组件详解
2017/05/28 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
QQ跳转支付宝并自动领红包脚本(最新)
2018/06/22 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
python使用arp欺骗伪造网关的方法
2015/04/24 Python
python excel和yaml文件的读取封装
2021/01/12 Python
万得城电器土耳其网站:欧洲第一大电子产品零售商
2016/10/07 全球购物
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
澳大利亚儿童鞋在线:The Trybe
2019/07/16 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
2012/05/30 面试题
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
安全生产中长期规划实施方案
2014/02/21 职场文书
工作保证书范文
2014/04/29 职场文书
煤矿安全协议书
2014/08/20 职场文书
校本研修个人总结
2015/02/28 职场文书
同意报考证明
2015/06/17 职场文书