渝中集团网站建设,用人名做网站域名,3d装修效果图制作软件,那种网站打不开关于Pytorch的MNIST数据集的预处理详解MNIST的准确率达到99.7%用于MNIST的卷积神经网络(CNN)的实现#xff0c;具有各种技术#xff0c;例如数据增强#xff0c;丢失#xff0c;伪随机化等。操作系统#xff1a;ubuntu18.04显卡#xff1a;GTX1080tipython版本#xff1…关于Pytorch的MNIST数据集的预处理详解MNIST的准确率达到99.7%用于MNIST的卷积神经网络(CNN)的实现具有各种技术例如数据增强丢失伪随机化等。操作系统ubuntu18.04显卡GTX1080tipython版本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. DropoutThe third fully-connected layer employes dropout technique.5. Exponentially decayed learning rateA 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,torchimport torchvision.transforms as transformsfrom torch.utils.data import Dataset, DataLoaderimport matplotlib.pyplot as plt加载MNIST数据集有很多方法方法一在pytorch下可以直接调用torchvision.datasets里面的MNIST数据集(这是官方写好的数据集类)train torchvision.datasets.MNIST(root./mnist/,trainTrue, transform transforms.ToTensor())返回值为一个元组(train_data,train_target)(这个类使用的时候也有坑必须用train[i]索引才能使用 transform功能)一般是与torch.utils.data.DataLoader配合使用dataloader DataLoader(train, batch_size50,shuffleTrue, num_workers4)for step, (x, y) in enumerate(dataloader):b_x x.shapeb_y y.shapeprint Step: , step, | train_data的维度 ,b_x,| train_target的维度,b_y如图将60000张图片的数据分为1200份每份包含50张图像这样并行处理数据能有效加快计算速度看个人喜好本人不太喜欢这种固定的数据类所以想要灵活多变可以开始自己写数据集类方法二自己设置数据集使用pytorch相关类API对数据集进行封装pytorch中数据集相关的类位于torch.utils.data package中。本次实验主要使用以下类torch.utils.data.Datasettorch.utils.data.DataLoaderDataset类的使用 所有的类都应该是此类的子类(也就是说应该继承该类)。 所有的子类都要重写(override) len(), getitem() 这两个方法。使用到的python packagepython package目的numpy矩阵操作对图像进行转置skimage图像处理图像I/O,图像变换matplotlib图像的显示可视化os一些文件查找操作torchpytorchtorvisionpytorch导入相关的包import numpy as npfrom skimage import iofrom skimage import transformimport matplotlib.pyplot as pltimport osimport torchimport torchvisionfrom torch.utils.data import Dataset, DataLoaderfrom torchvision.transforms import transformsfrom PIL import Image第一步定义一个子类继承Dataset类 重写 __len()__, __getitem()__ 方法。细节1.数据集一个样本的表示采用字典的形式sample {img: img, target: target}。图像的读取采用torch.load进行读取读取之后的结果为torch.Tensor形式。图像变换transform参数class MY_MNIST(Dataset):training_file training.pttest_file test.ptdef __init__(self, root, transformNone):self.transform transformself.data, self.targets torch.load(root)def __getitem__(self, index):img, target self.data[index], int(self.targets[index])img Image.fromarray(img.numpy(), modeL)if self.transform is not None:img self.transform(img)img transforms.ToTensor()(img)sample {img: img, target: target}return sampledef __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, cnt1)# ax.axis(off)ax.imshow(image.squeeze(0))ax.set_title(label)plt.pause(0.001)if cnt 15:break输出如下 这样就表明咱们自己写的数据集读取图像并读取之后的结果为torch.Tensor形式成功啦第三步(可选 optional)对数据集进行变换一般收集到的图像大小尺寸亮度等存在差异变换的目的就是使得数据归一化。另一方面可以通过变换进行数据增强关于pytorch中的变换transforms,请参考该系列之前的文章由于数据集中样本采用字典dicts形式表示。 因此不能直接调用torchvision.transofrms中的方法。本实验进行了旋转随机裁剪调节图像的色彩饱和明暗等操作。compose transforms.Compose([transforms.Resize(20),transforms.RandomHorizontalFlip(),transforms.RandomCrop(20),transforms.ColorJitter(brightness1, contrast0.1, hue0.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, cnt1)# ax.axis(off)ax.imshow(image.squeeze(0))ax.set_title(label)plt.pause(0.001)if cnt 15:break变换后的图像和之前对比你发现了什么不同吗第四步 使用DataLoader进行包装为何要使用DataLoader?① 深度学习的输入是mini_batch形式② 样本加载时候可能需要随机打乱顺序shuffle操作③ 样本加载需要采用多线程pytorch提供的DataLoader封装了上述的功能这样使用起来更方便。# 使用DataLoader可以利用多线程batch,shuffle等trainset_dataloader DataLoader(datasettransformed_trainset,batch_size4,shuffleTrue,num_workers4)可视化dataloader DataLoader(train, batch_size50,shuffleTrue, num_workers4)通过DataLoader包装之后样本以min_batch形式输出而且进行了随机打乱顺序。for step, i in enumerate(dataloader):b_x i[img].shapeb_y i[target].shapeprint 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数据集的预处理详解就是小编分享给大家的全部内容了希望能给大家一个参考也希望大家多多支持脚本之家。